# HG changeset patch # User igor@book.xt.vpn # Date 1266773658 -7200 # Node ID b21fb3f1fcb7e59ca9166ea064ea29af3326acbb new-words.sh добавлен в репозиторий Пока здесь есть только маленький README-файл и скрипт new-words.sh, который делает минимум работы. Подробности: http://xgu.ru/wiki/new-words diff -r 000000000000 -r b21fb3f1fcb7 README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README Sun Feb 21 19:34:18 2010 +0200 @@ -0,0 +1,25 @@ + +Программа, которая помогает нам находить неизвестные +слова в новом тексте + +Подробности: http://xgu.ru/wiki/new-words + +== Файлы == + +README Файл, который мы сейчас читаем +new-words.sh Собственно программа (написана на sh) +new-words.pl Программа new-words, которую мы когда-нибудь напишем на Perl + + +== Что сделать == + +* Переписать на Perl (пока на Perl) +* Поддержка разных алфавитов (пока поддерживается только латинский) +* Пометки к словам +* Статистика по текущему тексту; уровни покрытия словами текста +* Время добавления слова и прогресс добавления +* Источник слова +* Поиск предложений, содержащих слова, в тексте +* Автоматическое определение языка по тексту + + diff -r 000000000000 -r b21fb3f1fcb7 new-words.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/new-words.pl Sun Feb 21 19:34:18 2010 +0200 @@ -0,0 +1,6 @@ +#!/usr/bin/perl +# + +print "Experimental. Run new-words.sh instead\n"; +exit(0); + diff -r 000000000000 -r b21fb3f1fcb7 new-words.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/new-words.sh Sun Feb 21 19:34:18 2010 +0200 @@ -0,0 +1,97 @@ +#!/bin/sh + +cat < /dev/null + +Поддержка нескольких языков: + + new-words -l lang URL + +Например, для немецких текстов: + + new-words -l de URL + +Или, предварительно создав соответствующую ссылку: + + de-words URL + +HELP + +WORK_DIR=~/.new-words/ +LANGUAGE=en +VOCABULARY=${LANGUAGE}.txt +TEMP1=`mktemp /tmp/news-words-XXXXXXXXXX` +TEMP2=`mktemp /tmp/news-words-XXXXXXXXXX` +editor=${EDITOR:-vim} + +my_name="`echo $0 | sed s/-words// | sed s@.*/@@`" +[ "${my_name}" = "new" ] || VOCABULARY="$my_name".txt +if [ "$1" = "-l" ] +then + LANGUAGE="$2" + VOCABULARY="$LANGUAGE".txt + shift 2 +fi + +get_words() +{ +tr ' ' '\n' | sed 's/--/ /g' | tr A-Z a-z \ +| tr -d '*\r,.-:#@()+=—<>$;"?!|·[]^%&'"'" \ +| tr ' ' '\n' | grep_v_english_perl \ +| grep -x '[a-zA-Z0-9_-]*' \ +| sort | uniq -c | awk '{if ($2!="") print;}' | sort -rn +} + +grep_v_english() +{ +[ -e "$VOCABULARY" ] || touch "$VOCABULARY" +eval $(cat $VOCABULARY | tr -d "'" | xargs -n10 echo | tr ' ' '|' | sed 's/^/egrep -xv "RRRRRRR|/' | sed 's/$/"/' | tr '\n' '|')cat +} + +grep_v_english_perl() +{ + PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-grep-v-english-XXXXXXXX` + cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME +open(VOC, $ENV{VOCABULARY}) + or die "Can't open VOCABULARY"; +while (){ + chomp; + s/'//g; + $voc{$_}="1"; +} +while(<>) { + chomp; + if (not defined($voc{$_})) { print "$_\n"; } +} +PERL_SCRIPT + [ -e "$VOCABULARY" ] || touch "$VOCABULARY" + export VOCABULARY + perl $PERL_SCRIPT_TEMP_NAME + rm $PERL_SCRIPT_TEMP_NAME +} + +text_from_url() +{ +lynx -dump "$1" | perl -p -e 's@http://[a-zA-Z&_.:/0-9%?=,#+()\[\]~-]*@@' +} + +mkdir -p $WORK_DIR +cd $WORK_DIR +if echo "$1" | grep -q http: +then + text_from_url "$1" | get_words | tee "$TEMP1" > "$TEMP2" +elif [ "$#" != 0 ] +then + cat "$1" | get_words | tee "$TEMP1" > "$TEMP2" +else + get_words | tee "$TEMP1" > "$TEMP2" +fi + +if [ "$editor" = vim ] +then + vim -c 'set keywordprg='"$LANGUAGE" -c 'set iskeyword=@,48-57,/,.,-,_,+,,,#,$,%,~,=' "$TEMP2" < /dev/tty > /dev/tty +else + echo 2 + $editor "$TEMP2" +fi +diff "$TEMP1" "$TEMP2" | awk '{print $3}' | sort -u >> "$VOCABULARY" +rm -f "$TEMP1" "$TEMP2"