igor@38: #!/bin/bash igor@38: igor@38: show_usage() igor@38: { igor@38: cat < /dev/stderr igor@38: igor@38: USAGE: igor@38: igor@38: new-words [ -l lang ] [ -s ] [ ARG ] igor@38: igor@38: SWITCHES: igor@38: igor@38: -h print this screen igor@38: -c show compressed wordlist: one word per group igor@38: -k put higher words that are similar to the known words (only for English) igor@38: -l lang override language settings igor@38: -n non-interactive mode (don't run vi) igor@38: -N turn off known words filtering igor@38: -a don't add marks (and don't save marks added by user) igor@38: -p pages work with specified pages only (pages = start-stop/total ) igor@38: -s show the text statistics (percentage of known words and so on) and exit igor@38: -S show your vocabulary statistics (number of words and word groups) igor@38: -t tag tag known words with tag igor@38: -T show list of active tags igor@38: -m tag merge the words tagged with "tag" into the main vocabulary igor@38: -M merge the words tagged with any tag into the main vocabulary igor@38: -r tag remove subvocabulary for the "tag" igor@38: -2 -3 find 2 and 3 words' sequences igor@38: igor@38: The language of the text can be specified also igor@38: by name of the program new-words (correspondent link must be created before). igor@38: For example, these calls are equivalent: igor@38: igor@38: de-words URL igor@38: new-words -l de URL igor@38: igor@38: HELP igor@38: } igor@38: igor@38: if [ "$1" = "-h" ] igor@38: then igor@38: show_usage igor@38: exit 0 igor@38: fi igor@38: igor@38: NEW_WORDS_PY=/home/igor/hg/new-words/new-words.py igor@38: WORK_DIR=~/.new-words/ igor@38: TEMP1=`mktemp /tmp/new-words-temp1.XXXXXXXXXX` igor@38: TEMP2=`mktemp /tmp/new-words-temp2.XXXXXXXXXX` igor@38: export ORIGINAL_TEXT=`mktemp /tmp/new-words-orig.XXXXXXXXXX` igor@38: editor=${EDITOR:-vim} igor@38: igor@38: # language detection igor@38: igor@38: LANGUAGE=en igor@38: my_name="`echo $0 | sed s@.*/@@ | sed s/-.*// `" igor@38: for arg igor@38: do igor@38: if echo "$arg" | grep -q http://...wikipedia.org/wiki/ igor@38: then igor@38: LANGUAGE="`echo $arg | sed s@http://@@ | sed s@.wikipedia.*@@`" igor@38: fi igor@38: done igor@38: [ "${my_name}" = "new" ] || LANGUAGE="$my_name" igor@38: igor@38: #---------------------------------------------------- igor@38: # command line options processing igor@38: igor@38: STAT_ONLY=NO igor@38: NEED_TO_USE_VOCABULARY_WHEN_SORT=NO igor@38: DONT_ADD_MARKS=NO igor@38: NON_INTERACTIVE_MODE=NO igor@38: PART_TO_PROCESS='' igor@38: GROUP_WORDS_BY_THREE=NO igor@38: GROUP_WORDS_BY_TWO=NO igor@38: TAG_NAME='' igor@38: MERGE_THIS_TAGS='' igor@38: TAGS_LIST_ONLY=NO igor@38: MERGE_TAGGED_WORDS=NO igor@38: MERGE_ALL_TAGGED=NO igor@38: DONT_ADD_MARKLINES=NO igor@38: FILTER_WORDS=YES igor@38: SHOW_VOC_STAT=NO igor@38: COMPRESSED_WORDLIST=NO igor@38: OLD_STYLE="NO" igor@38: while getopts Ocl:sSkanNp:t:Tm:Mr:23 opt igor@38: do igor@38: case "$opt" in igor@38: O) OLD_STYLE=YES;; igor@38: c) COMPRESSED_WORDLIST=YES;; igor@38: s) STAT_ONLY=YES;; igor@38: S) SHOW_VOC_STAT=YES;; igor@38: k) NEED_TO_USE_VOCABULARY_WHEN_SORT=YES;; igor@38: l) LANGUAGE="$OPTARG";; igor@38: a) DONT_ADD_MARKS=YES;; igor@38: n) NON_INTERACTIVE_MODE=YES;; igor@38: N) FILTER_WORDS=NO;; igor@38: p) PART_TO_PROCESS="$OPTARG";; igor@38: t) TAG_NAME="$OPTARG";; igor@38: T) TAGS_LIST_ONLY="YES";; igor@38: m) DONT_ADD_MARKLINES="YES"; MERGE_TAGGED_WORDS="YES"; MERGE_THIS_TAGS="$TAG_NAME $OPTARG";; igor@38: M) DONT_ADD_MARKLINES="YES"; MERGE_ALL_TAGGED="YES";; igor@38: r) REMOVE_TAG="YES"; TAG_NAME="$TAG_NAME $OPTARG";; igor@38: 2) GROUP_WORDS_BY_TWO=YES;; igor@38: 3) GROUP_WORDS_BY_THREE=YES;; igor@38: \?) # unknown flag igor@38: show_usage igor@38: exit 1;; igor@38: esac igor@38: done igor@38: shift `expr $OPTIND - 1` igor@38: igor@38: if [ "$1" = "-l" ] igor@38: then igor@38: LANGUAGE="$2" igor@38: shift 2 igor@38: fi igor@38: igor@38: VOCABULARY=${LANGUAGE}.txt igor@38: NOTES_FILE=notes-${LANGUAGE}.txt igor@38: igor@38: if [ "${SHOW_VOC_STAT}" = "YES" ] igor@38: then igor@38: $0 -l "${LANGUAGE}" -N -n ${WORK_DIR}/${VOCABULARY} | head -1 | awk '{print $5}' | tr -d "<>" igor@38: exit 0 igor@38: fi igor@38: igor@38: #---------------------------------------------------- igor@38: igor@38: get_words() igor@38: { igor@38: if [ "$OLD_STYLE" = NO ] igor@38: then igor@38: $NEW_WORDS_PY -l "$LANGUAGE" -f get_words "$1" igor@38: else igor@38: get_words_OLD "$@" igor@38: fi igor@38: } igor@38: igor@38: get_words_OLD() igor@38: { igor@38: export FILTER_WORDS igor@38: tr ' ' '\n' | sed 's/--/ /g' \ igor@38: | sed "s/'/__APOSTROPHE__/g" \ igor@38: | perl -MEncode -Mutf8 -n -e '$_ = decode( "utf8", $_);y/*\r,.:#@()+=—<>$;"?!|·[]^%&/ /; binmode STDOUT, ":utf8"; print if /^[[:alpha:] '"'"'_-]*$/'\ igor@38: | sed "s/__APOSTROPHE__/'/g" \ igor@38: | tr ' ' '\n' \ igor@38: | tee "$1" \ igor@38: | grep_v_english_perl \ igor@38: | sort | uniq -c | awk '{if ($2!="") print;}' | sort -rn igor@38: } igor@38: igor@38: add_stat() igor@38: { igor@38: if [ "$DONT_ADD_MARKLINES" = "YES" ] igor@38: then igor@38: cat igor@38: return igor@38: fi igor@38: before="$1" igor@38: after=${before}2 igor@38: cat > "$after" igor@38: total="`wc -w $1 | awk '{print $1}'`" igor@38: total_unknown="`cat $after|awk '{s=s+$1}END{print s}'`" igor@38: total_known="`echo $total-$total_unknown|bc`" igor@38: percentage="`echo '100*('$total-$total_unknown')'/$total | bc -l | sed 's/\\.\(.\).*/.\1/'`" igor@38: #sentences="`cat $after | perl -e 'local $/; $_=<>; s@http://[a-zA-Z&_.:/0-9%?=,\#+()\[\]~-]*@@g; s@\n@@g; s@(Mr|Mrs)\.@\1POINT@g; @sentences=split /\\./;print $#sentences;'`" igor@38: sentences="`cat $ORIGINAL_TEXT | perl -e 'local $/; $_=<>; s/[^.]//msg; print length($_);'`" igor@38: igor@38: igor@38: if [ "$STAT_ONLY" = "YES" ] igor@38: then igor@38: echo "LANG KNOWN% UNKNOWN% KNOWN TOTAL WPS UWPS*10" igor@38: echo "$LANGUAGE $percentage `echo \(100-$percentage\) | bc -l` $total_known $total `echo $total/$sentences|bc` `echo 10*$total_unknown/$sentences|bc` " igor@38: rm $after igor@38: return 0 igor@38: else igor@38: groups="`echo $(grep '# groups' $after | awk '{print $3}')`" igor@38: words="`echo $(grep -v '^#' $after | wc -l)`" igor@38: echo "# $LANGUAGE, $percentage, <$total_known/$total>, <$groups/$words>" igor@38: fi igor@38: igor@38: PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-grep-v-english-XXXXXXXX` igor@38: cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME igor@38: my $total=shift(@ARGV); igor@38: my $total_known=shift(@ARGV); igor@38: my $s=0; igor@38: my $mark_line=int($total_known*100/$total/5)*5; igor@38: if ($mark_line>=90) { igor@38: $mark_line=int($total_known*100/$total)+1; igor@38: } else { $mark_line +=5; }; igor@38: while(<>) igor@38: { igor@38: next if /^#\s*groups\s*/; igor@38: print; igor@38: /^\s*([0-9]*)\s*/; igor@38: $s+=$1; igor@38: if (($total_known+$s)*100/$total>=$mark_line) { igor@38: print "# $mark_line\n"; igor@38: if ($mark_line>=90) { $mark_line+=1; } else { $mark_line +=5; }; igor@38: } igor@38: } igor@38: PERL_SCRIPT igor@38: perl $PERL_SCRIPT_TEMP_NAME "$total" "$total_known" "$after" igor@38: rm $PERL_SCRIPT_TEMP_NAME igor@38: rm $after igor@38: } igor@38: igor@38: two_and_three_words() igor@38: { igor@38: if [ $GROUP_WORDS_BY_THREE = NO -a $GROUP_WORDS_BY_TWO = NO ] igor@38: then igor@38: cat igor@38: else igor@38: cat igor@38: igor@38: export GROUP_WORDS_BY_THREE igor@38: export GROUP_WORDS_BY_TWO igor@38: PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-two-and-three-XXXXXXXX` igor@38: cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME igor@38: #!/usr/bin/perl igor@38: local $/; igor@38: $words=<>; igor@38: $words=~ s@[!?;,:#1-9".]@ @g; igor@38: $words =~ s@\s+@ @g; igor@38: @words = split /\s+/, $words; igor@38: for ($i=0; $i<$#words-3;$i++) { igor@38: my ($a,$b,$c)= ($words[$i],$words[$i+1],$words[$i+2]); igor@38: if ($ENV{GROUP_WORDS_BY_THREE} eq "YES" and ($a && $b && $c)) { igor@38: print "${a}_${b}_${c}\n"; igor@38: }; igor@38: if ($ENV{GROUP_WORDS_BY_TWO} eq "YES" and ($a && $b)) { igor@38: print "${a}_${b}\n"; igor@38: }; igor@38: } igor@38: PERL_SCRIPT igor@38: perl $PERL_SCRIPT_TEMP_NAME "$ORIGINAL_TEXT" igor@38: rm $PERL_SCRIPT_TEMP_NAME igor@38: fi igor@38: } igor@38: igor@38: grep_v_english() igor@38: { igor@38: [ -e "$VOCABULARY" ] || touch "$VOCABULARY" igor@38: eval $(cat $VOCABULARY | tr -d "'" | xargs -n10 echo | tr ' ' '|' | sed 's/^/egrep -xv "RRRRRRR|/' | sed 's/$/"/' | tr '\n' '|')cat igor@38: } igor@38: igor@38: grep_v_english_perl() igor@38: { igor@38: PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-grep-v-english-XXXXXXXX` igor@38: cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME igor@38: if ($ENV{FILTER_WORDS} eq "NO") { igor@38: while(<>) { print; } igor@38: exit(0); igor@38: } igor@38: $voc_files=$ENV{VOC_FILES}; igor@38: $voc_files=~s@^ @@; igor@38: for $voc_file (split /\s+/,$voc_files) { igor@38: if (open(VOC, $voc_file)) { igor@38: while (){ igor@38: chomp; igor@38: #s/'//g; igor@38: $voc{$_}="1"; igor@38: } igor@38: } igor@38: } igor@38: while(<>) { igor@38: chomp; igor@38: if (not defined($voc{$_})) { print "$_\n"; } igor@38: } igor@38: PERL_SCRIPT igor@38: [ -e "$VOCABULARY" ] || touch "$VOCABULARY" igor@38: export VOCABULARY VOC_FILES igor@38: VOC_FILES=$VOCABULARY igor@38: for i in $TAG_NAME igor@38: do igor@38: VOC_FILES="${VOC_FILES} `tag_file_name $i`" igor@38: done igor@38: perl $PERL_SCRIPT_TEMP_NAME igor@38: rm $PERL_SCRIPT_TEMP_NAME igor@38: } igor@38: igor@38: group_words() igor@38: { igor@38: if [ "$OLD_STYLE" = NO ] igor@38: then igor@38: $NEW_WORDS_PY -l "$LANGUAGE" -f group_words "$1" igor@38: else igor@38: group_words_OLD "$@" igor@38: fi igor@38: } igor@38: igor@38: group_words_OLD() igor@38: { igor@38: #if [ "$LANGUAGE" != "en" ] igor@38: #then igor@38: # cat igor@38: # return igor@38: #fi igor@38: PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-group-words-XXXXXXXX` igor@38: cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME igor@38: #!/usr/bin/perl igor@38: igor@38: use Encode; igor@38: use utf8; igor@38: use Lingua::Stem::Snowball qw(stem); igor@38: igor@38: eval { igor@38: # http://stackoverflow.com/questions/251694/how-can-i-check-if-i-have-a-perl-module-before-using-it igor@38: require String::Similarity; igor@38: String::Similarity->import(); igor@38: }; igor@38: unless($@) igor@38: { igor@38: our $HAVE_String_Similarity=1; igor@38: } igor@38: igor@38: igor@38: sub load_notes_dict() igor@38: { igor@38: my %dict; igor@38: if (open(NOTES, $ENV{NOTES_FILE})) { igor@38: while() { igor@38: $_ = decode( "utf8", $_); igor@38: chomp; igor@38: s/^\s+//; igor@38: my ($a,$b)=split /\s+/,$_,2; igor@38: $dict{$a}=$b; igor@38: } igor@38: } igor@38: return %dict; igor@38: } igor@38: igor@38: sub similar($$){ igor@38: my $a=shift; igor@38: my $b=shift; igor@38: if ($HAVE_String_Similarity) { igor@38: return $Similarity{"$a $b"}; igor@38: } igor@38: else { igor@38: return 0; igor@38: } igor@38: } igor@38: igor@38: igor@38: sub normalize_without_linked($) igor@38: { igor@38: if ( $ENV{LANGUAGE} eq "en" ) { return normalize_english(shift); } igor@38: elsif ( $ENV{LANGUAGE} eq "de" ) { return normalize_german(shift); } igor@38: elsif ( $ENV{LANGUAGE} eq "uk" ) { return normalize_ukrainian(shift); } igor@38: elsif ( $ENV{LANGUAGE} eq "io" ) { return normalize_esperanto(shift); } igor@38: else { return shift ; } igor@38: } igor@38: igor@38: sub normalize_with_linked($) igor@38: { igor@38: my $word = normalize_without_linked(shift); igor@38: #return $word; igor@38: if ($linked_words{$word}) { igor@38: return $linked_words{$word}; igor@38: } igor@38: else { igor@38: return $word; igor@38: } igor@38: } igor@38: igor@38: sub normalize($) igor@38: { igor@38: return normalize_with_linked(shift); igor@38: } igor@38: igor@38: sub normalize_ukrainian($) igor@38: { igor@38: $_=lc(shift); igor@38: s/[юіоеуаи]$//g; igor@38: return $_; igor@38: } igor@38: igor@38: sub normalize_esperanto($) igor@38: { igor@38: $_=lc(shift); igor@38: # verbs igor@38: s/i$//; s/is$//; s/os$//; s/as$//; s/us$//; igor@38: igor@38: # nouns igor@38: s/j?n?$//; igor@38: igor@38: return $_; igor@38: } igor@38: igor@38: sub normalize_german($) igor@38: { igor@38: @stems = stem('de', \@_); igor@38: return $stems[0]; igor@38: } igor@38: igor@38: sub normalize_german_($) igor@38: { igor@38: $_=lc(shift); igor@38: igor@38: s/heit$//; s/keit$//; s/tum$//; s/ung$//; s/nis$//;s/schaft$//; s/ist$//; igor@38: s/en$//; s/er$//; igor@38: igor@38: s/lich$//; s/ig$//; igor@38: s/al$//; s/isch$//; igor@38: s/ell$//; s/haft$//; igor@38: igor@38: s/bar$//; s/sam$//; s/lich$//; igor@38: igor@38: @prefixes=qw( igor@38: ab an auf aus bei dazwischen ein fest heraus her hinaus hin los mit nach voraus vorbei vor weg weiter zurück zusammen zu igor@38: be emp ent er ge miss ver zer durch über um unter wieder); igor@38: @prefixes=(); igor@38: for $pref (@prefixes) { igor@38: s/^$pref//; igor@38: } igor@38: igor@38: igor@38: return $_; igor@38: } igor@38: igor@38: sub normalize_english($) igor@38: { igor@38: $_=lc(shift); igor@38: igor@38: s/s$//; igor@38: igor@38: s/ation$//; s/ness$//; s/ship$//; s/ally$//; s/ance$//;s/ity$//; s/ment$//; igor@38: igor@38: s/ed$//; igor@38: s/en$//; igor@38: s/er$//; igor@38: s/est$//; igor@38: s/ing$//; igor@38: igor@38: s/ism$//; s/ist$//; s/ful$//; s/able$//; s/ably$//; igor@38: s/ify$//; s/fy$//; s/ly$//; igor@38: s/ise$//; s/ize$//; igor@38: igor@38: s/e$//; igor@38: return $_; igor@38: } igor@38: igor@38: igor@38: sub compare($$) igor@38: { igor@38: my $a=shift; igor@38: my $b=shift; igor@38: $a =~ s/^\s*//; igor@38: $b =~ s/^\s*//; igor@38: my ($a1, $a2)= split /\s+/,$a,2; igor@38: my ($b1, $b2)= split /\s+/,$b,2; igor@38: igor@38: my $cmp = $group_weight{normalize($a2)} <=> $group_weight{normalize($b2)}; igor@38: igor@38: if ($cmp) { igor@38: return $cmp; igor@38: } igor@38: else { igor@38: if (normalize($a2) ne normalize($b2)) { igor@38: return normalize($a2) cmp normalize($b2); igor@38: } igor@38: else { igor@38: return $a1 <=> $b1; igor@38: } igor@38: } igor@38: } igor@38: igor@38: sub log_($) igor@38: { igor@38: return; igor@38: open(LOG, ">>", "/tmp/log1"); igor@38: print LOG $_[0]; igor@38: close(LOG); igor@38: } igor@38: igor@38: sub find_linked_words($) igor@38: { igor@38: my %linked_words; igor@38: my $dict = shift; igor@38: log_("1"); igor@38: log_(join(" ", keys(%$dict))); igor@38: igor@38: for $key (keys(%$dict)) { igor@38: $val = $dict->{$key}; igor@38: log_($key."\n"); igor@38: if ($val =~ /\@([a-z]*)/) { igor@38: $linked_words{normalize($key)} = normalize($1); igor@38: log_(normalize($key)." = ".normalize($1)."\n"); igor@38: } igor@38: } igor@38: return %linked_words; igor@38: } igor@38: igor@38: sub lc_length($) igor@38: { igor@38: my $a= shift; igor@38: $a =~ s/[a-z]//g; igor@38: return length($a); igor@38: } igor@38: igor@38: our %dict = load_notes_dict(); igor@38: our %linked_words = find_linked_words(\%dict); igor@38: igor@38: our %Vocabulary; igor@38: open(VOC, $ENV{VOCABULARY}) igor@38: or die "Can't open VOCABULARY"; igor@38: while (){ igor@38: chomp; igor@38: #s/'//g; igor@38: $Vocabulary{normalize($_)}="1"; igor@38: } igor@38: close(VOC); igor@38: igor@38: binmode STDIN,":utf8"; igor@38: @lines=; igor@38: for $L (@lines) { igor@38: chomp($L); igor@38: #$L = decode( "utf8", $L); igor@38: $l=$L; igor@38: $l =~ s/^\s*//; igor@38: my ($a, $b)=split(/\s+/,$l,2); igor@38: $group_weight{normalize($b)}+=$a; igor@38: } igor@38: if ($ENV{NEED_TO_USE_VOCABULARY_WHEN_SORT} eq "YES") { igor@38: for $k (keys %group_weight) { igor@38: if (defined($Vocabulary{$k})) { igor@38: $group_weight{$k} *= 2; igor@38: } igor@38: } igor@38: } igor@38: @lines2 = sort { compare($b,$a) } @lines; igor@38: binmode STDOUT, ":utf8"; igor@38: print "# groups ".scalar(keys(%group_weight))."\n"; igor@38: if ($ENV{COMPRESSED_WORDLIST} eq "YES") { igor@38: my $sum = 0; igor@38: my $min = 9999; igor@38: for $L (@lines2) { igor@38: chomp($L); $l=$L; $l =~ s/^(\s*)//; my $spaces = $1; my ($a, $b)=split(/\s+/,$l,2); igor@38: $group_name = normalize($b); igor@38: if ($group_name ne $prev_group_name and $prev_group_name ne '' ) { igor@38: #print (" "x(7-length($sum))),"$sum $main_word\n"; igor@38: print +(" "x(7-length($sum))),"$sum $main_word\n"; igor@38: $sum = $a; igor@38: $min = length($b) + 2*lc_length($b); igor@38: $main_word = $b; igor@38: } igor@38: else { igor@38: $sum += $a; igor@38: if ($min > length($b) + 2*lc_length($b)) { igor@38: $min = length($b) + 2*lc_length($b); igor@38: $main_word = $b; igor@38: } igor@38: } igor@38: $prev_group_name = $group_name; igor@38: } igor@38: } igor@38: else { igor@38: for $l (@lines2) { igor@38: print "$l\n"; igor@38: } igor@38: } igor@38: PERL_SCRIPT igor@38: export VOCABULARY igor@38: export NEED_TO_USE_VOCABULARY_WHEN_SORT igor@38: export LANGUAGE igor@38: export COMPRESSED_WORDLIST igor@38: [ -e "$NOTES_FILE" ] || touch "$NOTES_FILE" igor@38: export NOTES_FILE igor@38: perl $PERL_SCRIPT_TEMP_NAME igor@38: rm $PERL_SCRIPT_TEMP_NAME igor@38: } igor@38: igor@38: text_from_url() igor@38: { igor@38: lynx -dump "$1" | perl -p -e 's@http://[a-zA-Z&_.:/0-9%?=,#+()\[\]~-]*@@' igor@38: } igor@38: igor@38: add_marks() igor@38: { igor@38: PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-grep-v-english-XXXXXXXX` igor@38: cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME igor@38: use Encode; igor@38: igor@38: sub load_notes_dict() igor@38: { igor@38: my %dict; igor@38: if (open(NOTES, $ENV{NOTES_FILE})) { igor@38: while() { igor@38: $_ = decode( "utf8", $_); igor@38: chomp; igor@38: s/^\s+//; igor@38: my ($a,$b)=split /\s+/,$_,2; igor@38: $dict{$a}=$b; igor@38: } igor@38: } igor@38: return %dict; igor@38: } igor@38: igor@38: %dict = load_notes_dict(); igor@38: igor@38: $file = $ARGV[0]; igor@38: if (open(F, $file)) { igor@38: @lines=; igor@38: close(F); igor@38: for (@lines) {$_ = decode( "utf8", $_);}; igor@38: igor@38: if (open(F, ">$file")) { igor@38: binmode F, ":utf8"; igor@38: for (@lines) { igor@38: m/\s+\S+\s+(\S+)/; igor@38: $name=$1; igor@38: if (not /^#/ and defined($dict{$name})) { igor@38: chomp; igor@38: $mark=$dict{$name}; igor@38: $space=" "x(30-length($_)); igor@38: print F "$_$space$mark\n"; igor@38: } igor@38: else { igor@38: print F "$_"; igor@38: } igor@38: } igor@38: close(F); igor@38: } igor@38: } igor@38: PERL_SCRIPT igor@38: [ -e "$NOTES_FILE" ] || touch "$NOTES_FILE" igor@38: export NOTES_FILE igor@38: perl $PERL_SCRIPT_TEMP_NAME "$1" igor@38: rm $PERL_SCRIPT_TEMP_NAME igor@38: } igor@38: igor@38: remove_marks() igor@38: { igor@38: PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-grep-v-english-XXXXXXXX` igor@38: cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME igor@38: $file = $ARGV[0]; igor@38: our %dict; igor@38: if (open(F, $file)) { igor@38: @lines=; igor@38: close(F); igor@38: igor@38: if (open(F, ">$file")) { igor@38: for (@lines) { igor@38: chomp; igor@38: if (not /^#/ and m/(\s+)(\S+)(\s+)(\S+)(\s+)(.*)/) { igor@38: my $name=$4; igor@38: my $comment=$6; igor@38: $dict{$name}=$comment; igor@38: print F "$1$2$3$4\n"; igor@38: } igor@38: else { igor@38: print F "$_\n"; igor@38: } igor@38: } igor@38: } igor@38: } igor@38: if (($ENV{DONT_ADD_MARKS} ne "YES") and open(NOTES, $ENV{NOTES_FILE})) { igor@38: @lines=; igor@38: close(NOTES); igor@38: igor@38: if (open(NOTES, ">".$ENV{NOTES_FILE})) { igor@38: for (@lines) { igor@38: chomp; igor@38: s/^\s+//; igor@38: my ($a,$b)=split /\s+/,$_,2; igor@38: if (not defined($dict{$a}) || ($dict{$a} eq $b)) { igor@38: print NOTES "$_\n"; igor@38: if (defined($dict{$a})) { unset($dict{$a}); } igor@38: } igor@38: } igor@38: for (keys %dict) { igor@38: $mark=$dict{$_}; igor@38: $space=" "x(30-length($_)); igor@38: print NOTES "$_$space$mark\n"; igor@38: } igor@38: } igor@38: } igor@38: PERL_SCRIPT igor@38: [ -e "$NOTES_FILE" ] || touch "$NOTES_FILE" igor@38: export NOTES_FILE igor@38: export DONT_ADD_MARKS igor@38: perl $PERL_SCRIPT_TEMP_NAME "$1" igor@38: rm $PERL_SCRIPT_TEMP_NAME igor@38: } igor@38: igor@38: part() igor@38: { igor@38: PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-part-XXXXXXXX` igor@38: cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME igor@38: #!/usr/bin/perl igor@38: igor@38: my @lines=; igor@38: my $lines=$#lines; igor@38: my $interval=$ARGV[0]; igor@38: if (not $interval) { igor@38: print @lines; igor@38: } igor@38: else { igor@38: my ($start,$stop,$total); igor@38: if ($interval =~ m@(.*)/(.*)@) { igor@38: $start = $1; igor@38: $total = $2; igor@38: } igor@38: else { igor@38: $start=$interval; igor@38: $total=0; igor@38: } igor@38: if ($start =~ m@(.*)-(.*)@) { igor@38: $start = $1; igor@38: $stop = $2; igor@38: } igor@38: if ($start =~ m@(.*)\+(.*)@) { igor@38: $start = $1; igor@38: $stop = $start+$2; igor@38: } igor@38: igor@38: $start=int($lines/$total*$start); igor@38: $stop=int($lines/$total*$stop); igor@38: igor@38: for($i=$start;$i<$stop;$i++){ igor@38: print $lines[$i]; igor@38: } igor@38: } igor@38: PERL_SCRIPT igor@38: perl $PERL_SCRIPT_TEMP_NAME "$1" igor@38: rm $PERL_SCRIPT_TEMP_NAME igor@38: } igor@38: igor@38: if [ "$TAGS_LIST_ONLY" = "YES" ] igor@38: then igor@38: cd "${WORK_DIR}" igor@38: echo ${LANGUAGE}_*.txt | tr ' ' '\n' | grep -v '*' | sed 's/[^_]*_//;s/.txt$//' igor@38: exit 0 igor@38: fi igor@38: igor@38: tag_file_name() igor@38: { igor@38: echo "${LANGUAGE}_${1}.txt" igor@38: } igor@38: igor@38: if [ "$REMOVE_TAG" = "YES" ] igor@38: then igor@38: cd "${WORK_DIR}" igor@38: for i in $TAG_NAME igor@38: do igor@38: echo "$TAGNAME" | grep -q '[/*?]' && continue igor@38: f="`tag_file_name $i`" igor@38: if [ -e "$f" ] igor@38: then igor@38: rm -f "$f" && echo Tag "'$i'" removed igor@38: else igor@38: echo Unknown tag "'$i'" igor@38: fi igor@38: done igor@38: exit 0 igor@38: fi igor@38: igor@38: mkdir -p $WORK_DIR igor@38: oldpwd="$PWD" igor@38: cd $WORK_DIR igor@38: if [ "$MERGE_TAGGED_WORDS" = "YES" ] igor@38: then igor@38: VOC_FILES='' igor@38: for i in $MERGE_THIS_TAGS igor@38: do igor@38: f=`tag_file_name $i` igor@38: [ -e "$f" ] && VOC_FILES="${VOC_FILES} $f" igor@38: done igor@38: if [ -z "$VOC_FILES" ] igor@38: then igor@38: echo Unknown tags: $MERGE_THIS_TAGS > /dev/stderr igor@38: else igor@38: cat $VOC_FILES igor@38: fi igor@38: elif [ "$MERGE_ALL_TAGGED" = "YES" ] igor@38: then igor@38: cat ${LANGUAGE}_*.txt igor@38: elif echo "$1" | grep -q http: igor@38: then igor@38: text_from_url "$1" igor@38: elif [ "$#" != 0 ] igor@38: then igor@38: if echo $1 | grep -q ^/ igor@38: then igor@38: cat "$1" igor@38: else igor@38: cat "$oldpwd/$1" igor@38: fi igor@38: else igor@38: cat igor@38: fi \ igor@38: | part $PART_TO_PROCESS \ igor@38: | tee $ORIGINAL_TEXT \ igor@38: | two_and_three_words \ igor@38: | get_words ${TEMP1}-full \ igor@38: | group_words \ igor@38: | add_stat ${TEMP1}-full \ igor@38: | tee "$TEMP1" > "$TEMP2" igor@38: igor@38: if [ "$STAT_ONLY" = "YES" ] igor@38: then igor@38: cat "$TEMP1" igor@38: elif [ "$NON_INTERACTIVE_MODE" = "YES" ] igor@38: then igor@38: cat "$TEMP1" igor@38: else igor@38: if [ `wc -l "$TEMP2" | awk '{print $1}'` != 0 ] igor@38: then igor@38: [ "$DONT_ADD_MARKS" = "YES" ] || add_marks "$TEMP2" igor@38: if [ "$editor" = vim ] igor@38: then igor@38: vim -c 'set keywordprg='"$LANGUAGE" -c 'set iskeyword=@,48-57,/,.,-,_,+,,,#,$,%,~,=,48-255' "$TEMP2" < /dev/tty > /dev/tty igor@38: else igor@38: $editor "$TEMP2" igor@38: fi igor@38: remove_marks "$TEMP2" igor@38: igor@38: vocabulary="$VOCABULARY" igor@38: [ -n "$TAG_NAME" ] && vocabulary="`tag_file_name $TAG_NAME`" igor@38: diff "$TEMP1" "$TEMP2" | awk '{print $3}' | sort -u >> "$vocabulary" igor@38: fi igor@38: fi igor@38: igor@38: rm -f "$TEMP1" "$TEMP2" "${TEMP1}-full" "$ORIGINAL_TEXT"