# 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(<NOTES>) {
+        chomp;
+        s/^\s+//;
+        my ($a,$b)=split /\s+/,$_,2;
+        $dict{$a}=$b;
+    }
+}
+if (open(F, $file)) {
+    @lines=<F>;
+    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=<F>;
+    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=<NOTES>;
+    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"