new-words

view new-words-py.sh @ 47:d708e2c1bad8

compressed wordlist support
author Igor Chubin <igor@chub.in>
date Mon Feb 07 21:21:17 2011 +0200 (2011-02-07)
parents 5f90e44eecfc
children 7194bdb56475
line source
1 #!/bin/bash
3 show_usage()
4 {
5 cat <<HELP > /dev/stderr
7 USAGE:
9 new-words [ -l lang ] [ -s ] [ ARG ]
11 SWITCHES:
13 -h print this screen
14 -c show compressed wordlist: one word per group
15 -G turn off word grouping
16 -k put higher words that are similar to the known words (only for English)
17 -l lang override language settings
18 -n non-interactive mode (don't run vi)
19 -N turn off known words filtering
20 -a don't add marks (and don't save marks added by user)
21 -p pages work with specified pages only (pages = start-stop/total )
22 -s show the text statistics (percentage of known words and so on) and exit
23 -S show your vocabulary statistics (number of words and word groups)
24 -t tag tag known words with tag
25 -T show list of active tags
26 -m tag merge the words tagged with "tag" into the main vocabulary
27 -M merge the words tagged with any tag into the main vocabulary
28 -r tag remove subvocabulary for the "tag"
29 -2 -3 find 2 and 3 words' sequences
31 The language of the text can be specified also
32 by name of the program new-words (correspondent link must be created before).
33 For example, these calls are equivalent:
35 de-words URL
36 new-words -l de URL
38 HELP
39 }
41 if [ "$1" = "-h" ]
42 then
43 show_usage
44 exit 0
45 fi
47 NEW_WORDS_PY=/home/igor/hg/new-words/new-words.py
48 WORK_DIR=~/.new-words/
49 TEMP1=`mktemp /tmp/new-words-temp1.XXXXXXXXXX`
50 TEMP2=`mktemp /tmp/new-words-temp2.XXXXXXXXXX`
51 export ORIGINAL_TEXT=`mktemp /tmp/new-words-orig.XXXXXXXXXX`
52 editor=${EDITOR:-vim}
54 # language detection
56 LANGUAGE=en
57 my_name="`echo $0 | sed s@.*/@@ | sed s/-.*// `"
58 for arg
59 do
60 if echo "$arg" | grep -q http://...wikipedia.org/wiki/
61 then
62 LANGUAGE="`echo $arg | sed s@http://@@ | sed s@.wikipedia.*@@`"
63 fi
64 done
65 [ "${my_name}" = "new" ] || LANGUAGE="$my_name"
67 #----------------------------------------------------
68 # command line options processing
70 STAT_ONLY=NO
71 NEED_TO_USE_VOCABULARY_WHEN_SORT=NO
72 DONT_ADD_MARKS=NO
73 NON_INTERACTIVE_MODE=NO
74 PART_TO_PROCESS=''
75 GROUP_WORDS_BY_THREE=NO
76 GROUP_WORDS_BY_TWO=NO
77 TAG_NAME=''
78 MERGE_THIS_TAGS=''
79 TAGS_LIST_ONLY=NO
80 MERGE_TAGGED_WORDS=NO
81 MERGE_ALL_TAGGED=NO
82 DONT_ADD_MARKLINES=NO
83 FILTER_WORDS=YES
84 SHOW_VOC_STAT=NO
85 COMPRESSED_WORDLIST=NO
86 WORDS_GROUPING=YES
87 while getopts Gcl:sSkanNp:t:Tm:Mr:23 opt
88 do
89 case "$opt" in
90 c) COMPRESSED_WORDLIST=YES;;
91 G) WORDS_GROUPING=NO;;
92 s) STAT_ONLY=YES;;
93 S) SHOW_VOC_STAT=YES;;
94 k) NEED_TO_USE_VOCABULARY_WHEN_SORT=YES;;
95 l) LANGUAGE="$OPTARG";;
96 a) DONT_ADD_MARKS=YES;;
97 n) NON_INTERACTIVE_MODE=YES;;
98 N) FILTER_WORDS=NO;;
99 p) PART_TO_PROCESS="$OPTARG";;
100 t) TAG_NAME="$OPTARG";;
101 T) TAGS_LIST_ONLY="YES";;
102 m) DONT_ADD_MARKLINES="YES"; MERGE_TAGGED_WORDS="YES"; MERGE_THIS_TAGS="$TAG_NAME $OPTARG";;
103 M) DONT_ADD_MARKLINES="YES"; MERGE_ALL_TAGGED="YES";;
104 r) REMOVE_TAG="YES"; TAG_NAME="$TAG_NAME $OPTARG";;
105 2) GROUP_WORDS_BY_TWO=YES;;
106 3) GROUP_WORDS_BY_THREE=YES;;
107 \?) # unknown flag
108 show_usage
109 exit 1;;
110 esac
111 done
112 shift `expr $OPTIND - 1`
114 if [ "$1" = "-l" ]
115 then
116 LANGUAGE="$2"
117 shift 2
118 fi
120 VOCABULARY=${LANGUAGE}.txt
121 NOTES_FILE=notes-${LANGUAGE}.txt
123 if [ "${SHOW_VOC_STAT}" = "YES" ]
124 then
125 $0 -l "${LANGUAGE}" -N -n ${WORK_DIR}/${VOCABULARY} | head -1 | awk '{print $5}' | tr -d "<>"
126 exit 0
127 fi
129 text_from_url()
130 {
131 lynx -dump "$1" | perl -p -e 's@http://[a-zA-Z&_.:/0-9%?=,#+()\[\]~-]*@@'
132 }
134 add_marks()
135 {
136 $NEW_WORDS_PY -l "$LANGUAGE" -f add_notes "$1"
137 }
138 remove_marks()
139 {
140 $NEW_WORDS_PY -l "$LANGUAGE" -f remove_notes "$1"
141 }
142 get_words_group_words_add_stat()
143 {
144 COMPRESSED_WORDLIST="$COMPRESSED_WORDLIST" \
145 GROUP_WORDS_BY_TWO="$GROUP_WORDS_BY_TWO" \
146 GROUP_WORDS_BY_THREE="$GROUP_WORDS_BY_THREE" \
147 STAT_ONLY="$STAT_ONLY" \
148 WORDS_GROUPING="$WORDS_GROUPING" \
149 FILTER_WORDS="$FILTER_WORDS" \
150 $NEW_WORDS_PY -l "$LANGUAGE" -f get_words_group_words_add_stat "$1"
151 }
153 part()
154 {
155 PERL_SCRIPT_TEMP_NAME=`mktemp /tmp/perl-part-XXXXXXXX`
156 cat <<'PERL_SCRIPT' > $PERL_SCRIPT_TEMP_NAME
157 #!/usr/bin/perl
159 my @lines=<STDIN>;
160 my $lines=$#lines;
161 my $interval=$ARGV[0];
162 if (not $interval) {
163 print @lines;
164 }
165 else {
166 my ($start,$stop,$total);
167 if ($interval =~ m@(.*)/(.*)@) {
168 $start = $1;
169 $total = $2;
170 }
171 else {
172 $start=$interval;
173 $total=0;
174 }
175 if ($start =~ m@(.*)-(.*)@) {
176 $start = $1;
177 $stop = $2;
178 }
179 if ($start =~ m@(.*)\+(.*)@) {
180 $start = $1;
181 $stop = $start+$2;
182 }
184 $start=int($lines/$total*$start);
185 $stop=int($lines/$total*$stop);
187 for($i=$start;$i<$stop;$i++){
188 print $lines[$i];
189 }
190 }
191 PERL_SCRIPT
192 perl $PERL_SCRIPT_TEMP_NAME "$1"
193 rm $PERL_SCRIPT_TEMP_NAME
194 }
196 if [ "$TAGS_LIST_ONLY" = "YES" ]
197 then
198 cd "${WORK_DIR}"
199 echo ${LANGUAGE}_*.txt | tr ' ' '\n' | grep -v '*' | sed 's/[^_]*_//;s/.txt$//'
200 exit 0
201 fi
203 tag_file_name()
204 {
205 echo "${LANGUAGE}_${1}.txt"
206 }
208 if [ "$REMOVE_TAG" = "YES" ]
209 then
210 cd "${WORK_DIR}"
211 for i in $TAG_NAME
212 do
213 echo "$TAGNAME" | grep -q '[/*?]' && continue
214 f="`tag_file_name $i`"
215 if [ -e "$f" ]
216 then
217 rm -f "$f" && echo Tag "'$i'" removed
218 else
219 echo Unknown tag "'$i'"
220 fi
221 done
222 exit 0
223 fi
225 mkdir -p $WORK_DIR
226 oldpwd="$PWD"
227 cd $WORK_DIR
228 if [ "$MERGE_TAGGED_WORDS" = "YES" ]
229 then
230 VOC_FILES=''
231 for i in $MERGE_THIS_TAGS
232 do
233 f=`tag_file_name $i`
234 [ -e "$f" ] && VOC_FILES="${VOC_FILES} $f"
235 done
236 if [ -z "$VOC_FILES" ]
237 then
238 echo Unknown tags: $MERGE_THIS_TAGS > /dev/stderr
239 else
240 cat $VOC_FILES
241 fi
242 elif [ "$MERGE_ALL_TAGGED" = "YES" ]
243 then
244 cat ${LANGUAGE}_*.txt
245 elif echo "$1" | grep -q http:
246 then
247 text_from_url "$1"
248 elif [ "$#" != 0 ]
249 then
250 if echo $1 | grep -q ^/
251 then
252 cat "$1"
253 else
254 cat "$oldpwd/$1"
255 fi
256 else
257 cat
258 fi \
259 | part $PART_TO_PROCESS \
260 | tee $ORIGINAL_TEXT \
261 | \
262 get_words_group_words_add_stat \
263 | tee "$TEMP1" > "$TEMP2"
265 if [ "$STAT_ONLY" = "YES" ]
266 then
267 cat "$TEMP1"
268 elif [ "$NON_INTERACTIVE_MODE" = "YES" ]
269 then
270 cat "$TEMP1"
271 else
272 if [ `wc -l "$TEMP2" | awk '{print $1}'` != 0 ]
273 then
274 [ "$DONT_ADD_MARKS" = "YES" ] || add_marks "$TEMP2"
275 if [ "$editor" = vim ]
276 then
277 vim -c 'set keywordprg='"$LANGUAGE" -c 'set iskeyword=@,48-57,/,.,-,_,+,,,#,$,%,~,=,48-255' "$TEMP2" < /dev/tty > /dev/tty
278 else
279 $editor "$TEMP2"
280 fi
281 remove_marks "$TEMP2"
283 vocabulary="$VOCABULARY"
284 [ -n "$TAG_NAME" ] && vocabulary="`tag_file_name $TAG_NAME`"
285 diff "$TEMP1" "$TEMP2" | awk '{print $3}' | sort -u >> "$vocabulary"
286 fi
287 fi
289 rm -f "$TEMP1" "$TEMP2" "${TEMP1}-full" "$ORIGINAL_TEXT"