11from glob import iglob
22from operator import itemgetter
3- from itertools import accumulate
43from collections import defaultdict
54
65non_han = {* ',: ' }
@@ -18,9 +17,9 @@ def column_start(column):
1817for filename in ['char.csv' , 'scripts/ignore.csv' ]:
1918 with open (filename , encoding = 'utf-8' ) as f :
2019 assert next (f ).startswith ('char,jyutping' )
21- listed |= {tuple (line .rstrip ('\n ' ).split (',' )[:1 ]) for line in f }
20+ listed |= {tuple (line .rstrip ('\n ' ).split (',' )[:2 ]) for line in f }
2221
23- unlisted = defaultdict (list )
22+ unlisted = defaultdict (lambda : defaultdict ( list ) )
2423for filename in iglob ("*.csv" ):
2524 if filename == 'char.csv' :
2625 continue
@@ -32,58 +31,49 @@ def column_start(column):
3231 romans_column_index = column_names .index ("jyutping" )
3332
3433 for line_num , line in enumerate (f , 2 ):
35- def yield_chars (chars , start ):
34+ def yield_chars (chars ):
3635 s = ''
3736 is_punctuation = True
38- for i , char in enumerate ( chars , start ) :
37+ for char in chars :
3938 if (char in non_han ) != is_punctuation :
4039 if s :
4140 if not is_punctuation :
42- yield ( i , s )
41+ yield s
4342 s = ''
4443 is_punctuation = not is_punctuation
4544 if not is_punctuation and s and not (is_ascii_lowercase_letter (char ) and is_ascii_letter (s [- 1 ])):
46- yield ( i , s )
45+ yield s
4746 s = ''
4847 s += char
49- if s :
50- i += 1
51- if not is_punctuation :
52- yield (i , s )
48+ if s and not is_punctuation :
49+ yield s
5350
54- def yield_romans (romans , start ):
51+ def yield_romans (romans ):
5552 s = ''
5653 is_space = True
57- for i , roman in enumerate ( romans , start ) :
54+ for roman in romans :
5855 if (roman == ' ' ) != is_space :
5956 if s :
6057 if not is_space :
61- yield ( i , s )
58+ yield s
6259 s = ''
6360 is_space = not is_space
6461 s += roman
65- if s :
66- i += 1
67- if not is_space :
68- yield (i , s )
62+ if s and not is_space :
63+ yield s
6964
7065 columns = line .rstrip ('\n ' ).split (',' )
71- columns_start = list (accumulate (map (column_start , columns ), initial = 0 ))
7266
7367 if chars_column_index < len (columns ) > romans_column_index :
7468 chars_orig = columns [chars_column_index ]
7569 romans_orig = columns [romans_column_index ]
76- chars = yield_chars (chars_orig , columns_start [chars_column_index ])
77- romans = yield_romans (romans_orig , columns_start [romans_column_index ])
78- for char_i , char in chars :
79- try :
80- roman_i , roman = next (romans )
81- except StopIteration :
82- break
83- if (char , roman ) not in listed :
84- unlisted [(char , roman )].append (f'{ filename } :{ line_num } ' )
70+ chars = yield_chars (chars_orig )
71+ romans = yield_romans (romans_orig )
72+ for pair in zip (chars , romans ):
73+ if pair not in listed :
74+ unlisted [pair ][filename ].append (f'{ line_num } { chars_orig } { romans_orig } ' )
8575
8676with open ('scripts/unlisted.csv' , 'w' , encoding = 'utf-8' ) as f :
8777 print ('char' , 'jyutping' , 'location' , sep = ',' , file = f )
8878 for (char , roman ), locations in sorted (unlisted .items (), key = itemgetter (0 )):
89- print (char , roman , ';' .join (locations ), sep = ',' , file = f )
79+ print (char , roman , ';' .join (f' { filename } :[ { "|" . join ( dict . fromkeys ( lines )) } ]' for filename , lines in locations . items () ), sep = ',' , file = f )
0 commit comments