# HG changeset patch # User igor@book.xt.vpn # Date 1267213287 -7200 # Node ID 68722cd6faff470c41bb7e8853ae6f4c6d2fd3a8 # Parent 4c9076f87241bd91cca3ecbc293cbe1fb0b4cce5 Добавление пометок к словам. Справа от слова можно поставить пометку, которая попадает в файл ~/.new-words/notes-LANG.txt. Потом, при появлении этого слова, она вспоминается и выводится вместе с ним. diff -r 4c9076f87241 -r 68722cd6faff README --- a/README Mon Feb 22 08:34:11 2010 +0200 +++ b/README Fri Feb 26 21:41:27 2010 +0200 @@ -14,11 +14,8 @@ == Что сделать == * Переписать на Perl (пока на Perl) -* Пометки к словам * Статистика по текущему тексту; уровни покрытия словами текста * Время добавления слова и прогресс добавления * Источник слова * Поиск предложений, содержащих слова, в тексте * Автоматическое определение языка по тексту - - diff -r 4c9076f87241 -r 68722cd6faff new-words.sh --- a/new-words.sh Mon Feb 22 08:34:11 2010 +0200 +++ b/new-words.sh Fri Feb 26 21:41:27 2010 +0200 @@ -17,20 +17,21 @@ 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 +LANGUAGE=en +my_name="`echo $0 | sed s@.*/@@ | sed s/-.*// `" +[ "${my_name}" = "new" ] || LANGUAGE="$my_name" if [ "$1" = "-l" ] then LANGUAGE="$2" VOCABULARY="$LANGUAGE".txt shift 2 fi +VOCABULARY=${LANGUAGE}.txt +NOTES_FILE=notes-${LANGUAGE}.txt get_words() { @@ -74,6 +75,101 @@ lynx -dump "$1" | perl -p -e 's@http://[a-zA-Z&_.:/0-9%?=,#+()\[\]~-]*@@' } +add_marks() +{ + PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-grep-v-english-XXXXXXXX` + cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME +$file = $ARGV[0]; +our $dict; +if (open(NOTES, $ENV{NOTES_FILE})) { + while() { + chomp; + s/^\s+//; + my ($a,$b)=split /\s+/,$_,2; + $dict{$a}=$b; + } +} +if (open(F, $file)) { + @lines=; + close(F); + + if (open(F, ">$file")) { + for (@lines) { + m/\s+\S+\s+(\S+)/; + $name=$1; + if (defined($dict{$name})) { + chomp; + $mark=$dict{$name}; + $space=" "x(30-length($_)); + print F "$_$space$mark\n"; + } + else { + print F "$_"; + } + } + close(F); + } +} +PERL_SCRIPT + [ -e "$NOTES_FILE" ] || touch "$NOTES_FILE" + export NOTES_FILE + perl $PERL_SCRIPT_TEMP_NAME "$1" + rm $PERL_SCRIPT_TEMP_NAME +} + +remove_marks() +{ + PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-grep-v-english-XXXXXXXX` + cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME +$file = $ARGV[0]; +our %dict; +if (open(F, $file)) { + @lines=; + close(F); + + if (open(F, ">$file")) { + for (@lines) { + chomp; + if (m/(\s+)(\S+)(\s+)(\S+)(\s+)(.*)/) { + my $name=$4; + my $comment=$6; + $dict{$name}=$comment; + print F "$1$2$3$4\n"; + } + else { + print F "$_\n"; + } + } + } +} +if (open(NOTES, $ENV{NOTES_FILE})) { + @lines=; + close(NOTES); + + if (open(NOTES, ">".$ENV{NOTES_FILE})) { + for (@lines) { + chomp; + s/^\s+//; + my ($a,$b)=split /\s+/,$_,2; + if (not defined($dict{$a}) || ($dict{$a} eq $b)) { + print NOTES "$_\n"; + if (defined($dict{$a})) { unset($dict{$a}); } + } + } + for (keys %dict) { + $mark=$dict{$_}; + $space=" "x(30-length($_)); + print NOTES "$_$space$mark\n"; + } + } +} +PERL_SCRIPT + [ -e "$NOTES_FILE" ] || touch "$NOTES_FILE" + export NOTES_FILE + perl $PERL_SCRIPT_TEMP_NAME "$1" + rm $PERL_SCRIPT_TEMP_NAME +} + mkdir -p $WORK_DIR cd $WORK_DIR if echo "$1" | grep -q http: @@ -86,6 +182,7 @@ get_words | tee "$TEMP1" > "$TEMP2" fi +add_marks "$TEMP2" if [ "$editor" = vim ] then vim -c 'set keywordprg='"$LANGUAGE" -c 'set iskeyword=@,48-57,/,.,-,_,+,,,#,$,%,~,=' "$TEMP2" < /dev/tty > /dev/tty @@ -93,5 +190,7 @@ echo 2 $editor "$TEMP2" fi +remove_marks "$TEMP2" + diff "$TEMP1" "$TEMP2" | awk '{print $3}' | sort -u >> "$VOCABULARY" rm -f "$TEMP1" "$TEMP2"