Mercurial > hg > lxmldump
annotate lxmldump.py @ 44:d7b4b2fb0214
Add support for hyphenation data.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 26 May 2021 13:25:27 +0300 |
parents | 8ed576574712 |
children | 23f00a0da841 |
rev | line source |
---|---|
0 | 1 #!/usr/bin/python3 -B |
2 # coding=utf-8 | |
3 ### | |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
4 ### lxmldump - Convert and dump ISO/FDIS 1951 XML file data |
4 | 5 ### Programmed and designed by Matti 'ccr' Hämäläinen <ccr@tnsp.org> |
6 ### (C) Copyright 2021 Tecnic Software productions (TNSP) | |
7 ### | |
23 | 8 ### Released / distributed under 3-clause BSD license |
9 ### (see file "COPYING" for more information) | |
10 ### | |
4 | 11 ### Python 3.7+ required! |
0 | 12 ### |
13 import sys | |
14 import signal | |
15 import re | |
16 from pathlib import Path | |
17 import xml.etree.ElementTree as xmlET | |
5
274b2091137c
Some more work on cleaning this up.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
18 import unicodedata |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
19 import argparse |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
20 import textwrap |
0 | 21 |
22 assert sys.version_info >= (3, 7) | |
23 | |
24 | |
25 ### | |
26 ### Default settings | |
27 ### | |
25
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
28 # Operation modes |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
29 PKK_MODE_NORMAL = 0 |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
30 PKK_MODE_DUMP = 1 |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
31 PKK_MODE_XML = 2 |
35
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
32 PKK_MODE_ANKI = 3 |
25
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
33 |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
34 |
30
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
35 pkk_modes_list = { |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
36 PKK_MODE_NORMAL: "normal", |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
37 PKK_MODE_DUMP: "dump", |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
38 PKK_MODE_XML: "xml", |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
39 PKK_MODE_ANKI: "anki", |
30
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
40 } |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
41 |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
42 |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
43 pkk_mode_defaults = { |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
44 # Default Ptr URL format strings |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
45 "ptr_fmt": { |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
46 PKK_MODE_NORMAL: u"<PTR:{href}>{text}</PTR>", |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
47 PKK_MODE_ANKI: u"<a href='https://kaino.kotus.fi/cgi-bin/kks/karjala.cgi?a={href}'>{text}</a>", |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
48 }, |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
49 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
50 "word_fmt": { |
44
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
51 PKK_MODE_NORMAL: "\"{word}\"{search}{attr}\n{hyphenation}", |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
52 PKK_MODE_ANKI: "{word}{attr}\n", |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
53 }, |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
54 "word_attr_list": { |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
55 PKK_MODE_NORMAL: " ({alist}) ", |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
56 }, |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
57 "word_attr_list_empty": { |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
58 PKK_MODE_NORMAL: " ", |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
59 }, |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
60 "word_attr_list_item": { |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
61 PKK_MODE_NORMAL: "{text}", |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
62 }, |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
63 "word_attr_list_sep": { |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
64 PKK_MODE_NORMAL: " ; ", |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
65 PKK_MODE_ANKI: " : ", |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
66 }, |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
67 |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
68 "search_list": { |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
69 PKK_MODE_NORMAL: ", {alist}", |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
70 }, |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
71 "search_list_empty": { |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
72 PKK_MODE_NORMAL: "", |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
73 }, |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
74 "search_list_item": { |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
75 PKK_MODE_NORMAL: "\"{text}\"", |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
76 }, |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
77 "search_list_sep": { |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
78 PKK_MODE_NORMAL: ", ", |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
79 }, |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
80 |
44
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
81 "hyphenation": { |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
82 PKK_MODE_NORMAL: "{indent}hyph \"{text}\"\n", |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
83 }, |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
84 "no_hyphenation": { |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
85 PKK_MODE_NORMAL: "", |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
86 }, |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
87 |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
88 "sense_index": { |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
89 PKK_MODE_NORMAL: "{indent}sense #{index}\n", |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
90 PKK_MODE_ANKI: "[{index}]:\n", |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
91 }, |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
92 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
93 "definition_fmt": { |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
94 PKK_MODE_NORMAL: "{indent}defn \"{text}\"\n", |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
95 PKK_MODE_ANKI: "? {text}\n", |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
96 }, |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
97 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
98 "example_fmt": { |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
99 PKK_MODE_NORMAL: "{indent}exmp \"{text}\"{geostr}\n", |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
100 PKK_MODE_ANKI: "- {text}{geostr}\n", |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
101 }, |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
102 "example_geo_list": { |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
103 PKK_MODE_NORMAL: " ({alist})", |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
104 }, |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
105 "example_geo_list_empty": { |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
106 PKK_MODE_NORMAL: "", |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
107 }, |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
108 "example_geo_list_item": { |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
109 PKK_MODE_NORMAL: "{text} [{tclass}]", |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
110 }, |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
111 "example_geo_list_sep": { |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
112 PKK_MODE_NORMAL: ", ", |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
113 }, |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
114 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
115 "word_end": { |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
116 PKK_MODE_NORMAL: "\n", |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
117 }, |
30
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
118 } |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
119 |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
120 |
25
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
121 # Element annotation mappings |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
122 pkk_element_annotation_map = { |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
123 "Fragment" : { |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
124 PKK_MODE_NORMAL: ["<", ">"], |
35
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
125 PKK_MODE_ANKI: ["<", ">"], |
25
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
126 }, |
7 | 127 } |
128 | |
129 | |
28 | 130 # List of words in kks1/ useful for debugging, option -p |
7 | 131 pkk_debug_list = [ |
132 "ahas", | |
133 "ahavakkaine", | |
134 "ahavakala", | |
135 "ahavakoittuo", | |
136 "ahvaliha", | |
9 | 137 "aloilleh", |
18 | 138 "hanjahtoakseh", |
19 | 139 "akkalisto", |
33 | 140 "alto-", |
7 | 141 ] |
142 | |
143 | |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
144 pkk_settings = {} |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
145 |
21 | 146 |
0 | 147 ### |
148 ### Misc. helper functions, etc | |
149 ### | |
150 def pkk_cleanup(): | |
151 return 0 | |
152 | |
153 | |
13 | 154 ## Print string to stdout using normalized Unicode if enabled |
5
274b2091137c
Some more work on cleaning this up.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
155 def pkk_print(smsg): |
12 | 156 try: |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
157 if pkk_cfg.normalize: |
12 | 158 sys.stdout.write(unicodedata.normalize("NFC", smsg)) |
159 else: | |
160 sys.stdout.write(smsg) | |
161 | |
162 except (BrokenPipeError, IOError) as e: | |
163 sys.stderr.close() | |
164 | |
0 | 165 |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
166 ## Get indentation string |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
167 def pkk_geti(indent): |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
168 return " " * pkk_cfg.indent * indent |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
169 |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
170 |
13 | 171 ## Print string with indentation |
7 | 172 def pkk_printi(indent, smsg): |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
173 pkk_print(pkk_geti(indent) + smsg) |
7 | 174 |
0 | 175 |
176 ## Fatal error handler | |
177 def pkk_fatal(smsg): | |
178 print(u"ERROR: "+ smsg) | |
179 sys.exit(1) | |
180 | |
181 | |
182 ## Handler for SIGINT signals | |
183 def pkk_signal_handler(signal, frame): | |
184 pkk_cleanup() | |
185 print(u"\nQuitting due to SIGINT / Ctrl+C!") | |
186 sys.exit(1) | |
187 | |
188 | |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
189 class pkk_set_mode(argparse.Action): |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
190 def __call__(self, parser, namespace, value, option_string=None): |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
191 lvalue = value.strip().lower() |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
192 for mode in pkk_modes_list: |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
193 if pkk_modes_list[mode] == lvalue: |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
194 setattr(namespace, self.dest, mode) |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
195 return |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
196 |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
197 pkk_fatal(f"Invalid output mode '{lvalue}'.") |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
198 |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
199 |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
200 ## Value handling |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
201 class pkk_set_value(argparse.Action): |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
202 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
203 rexpr = re.compile(r'\s*(\w+)\s*=\s*(.*)\s*') |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
204 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
205 def __call__(self, parser, namespace, values, option_string=None): |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
206 rmatch = re.match(self.rexpr, values) |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
207 if rmatch: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
208 rid = rmatch.group(1).lower().replace("-", "_") |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
209 rval = rmatch.group(2) |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
210 if rid in pkk_mode_defaults: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
211 pkk_settings[rid] = rval |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
212 else: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
213 pkk_fatal(f"Invalid option '{option_string} {values}': No such ID '{rid}'.") |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
214 else: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
215 pkk_fatal(f"Invalid option '{option_string} {values}': Expected id=value.") |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
216 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
217 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
218 ## Get mode if it exists |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
219 def pkk_test_value(mid): |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
220 if mid in pkk_mode_defaults: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
221 if pkk_cfg.mode in pkk_mode_defaults[mid]: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
222 mmode = pkk_cfg.mode |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
223 else: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
224 mmode = PKK_MODE_NORMAL |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
225 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
226 if mmode in pkk_mode_defaults[mid]: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
227 return mmode |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
228 else: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
229 return None |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
230 else: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
231 return None |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
232 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
233 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
234 ## Get default value per mode |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
235 def pkk_get_value(mid): |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
236 if mid in pkk_settings and pkk_settings[mid] != None: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
237 return pkk_settings[mid] |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
238 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
239 mmode = pkk_test_value(mid) |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
240 if mmode == None: |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
241 pkk_fatal(f"Internal error: No mode for ID '{mid}'.") |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
242 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
243 return pkk_mode_defaults[mid][mmode] |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
244 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
245 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
246 def pkk_get_fmt(mid): |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
247 return pkk_get_value(mid).replace("\\n", "\n") |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
248 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
249 |
28 | 250 ## Annotate given string with prefix and suffix based on tag |
26 | 251 def pkk_str_annotate(mtag, mstr): |
25
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
252 if pkk_cfg.annotate and mtag in pkk_element_annotation_map: |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
253 if pkk_cfg.mode in pkk_element_annotation_map[mtag]: |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
254 mmode = pkk_cfg.mode |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
255 else: |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
256 mmode = PKK_MODE_NORMAL |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
257 |
26 | 258 return pkk_element_annotation_map[mtag][mmode][0] + mstr + pkk_element_annotation_map[mtag][mmode][1] |
25
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
259 else: |
26 | 260 return mstr |
25
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
261 |
8a6738f67106
Factor string annotation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
24
diff
changeset
|
262 |
13 | 263 ## Clean string by removing tabs and newlines |
10 | 264 def pkk_str_clean(mstr): |
265 return re.sub(r'[\n\r\t]', '', mstr) | |
266 | |
267 | |
28 | 268 ## Format a "Ptr" node as text |
9 | 269 def pkk_ptr_to_text(pnode): |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
270 pfmt = pkk_get_fmt("ptr_fmt") |
30
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
271 return pfmt.format( |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
272 text=("".join(pnode.itertext())).strip(), |
34755af2ea1f
Make Ptr field URL formatting configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
273 href=pnode.attrib["{http://www.w3.org/TR/xlink}href"]) |
9 | 274 |
275 | |
13 | 276 ## Get text inside a given node |
16 | 277 def pkk_node_to_text(lnode): |
7 | 278 stmp = "" |
279 for pnode in lnode.iter(): | |
9 | 280 if pnode.tag == "Ptr": |
281 stmp += pkk_ptr_to_text(pnode) | |
282 else: | |
283 if isinstance(pnode.text, str): | |
37
e176fcfc0235
Fix overstripping of concatenated strings.
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
284 stmp += pkk_str_annotate(pnode.tag, pkk_str_clean(pnode.text)) |
7 | 285 |
9 | 286 if isinstance(pnode.tail, str): |
10 | 287 stmp += pkk_str_clean(pnode.tail) |
7 | 288 |
289 return stmp.strip() | |
290 | |
291 | |
13 | 292 ## Simple recursive dump starting at given node |
7 | 293 def pkk_dump_recursive(indent, lnode): |
294 if lnode.tag in ["Example"]: | |
16 | 295 stmp = pkk_node_to_text(lnode) |
27
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
296 pkk_printi(indent, f"{lnode.tag} \"{stmp}\"\n") |
6 | 297 else: |
7 | 298 if isinstance(lnode.text, str): |
27
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
299 textstr = pkk_str_clean(lnode.text).strip() |
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
300 if textstr != "": |
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
301 textstr = " \""+ textstr +"\"" |
7 | 302 else: |
27
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
303 textstr = "" |
6 | 304 |
305 if len(lnode.attrib) > 0: | |
27
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
306 attrstr = " "+ str(lnode.attrib) |
6 | 307 else: |
27
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
308 attrstr = "" |
6 | 309 |
27
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
310 pkk_printi(indent, f"{lnode.tag}{attrstr}{textstr}\n") |
6 | 311 for qnode in lnode.findall("./*"): |
7 | 312 pkk_dump_recursive(indent + 1, qnode) |
6 | 313 |
314 | |
17 | 315 ## Output item(s) under given node with given format string |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
316 def pkk_output_subs(indent, dnode, dsub, dfmtname): |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
317 dfmt = pkk_get_fmt(dfmtname) |
7 | 318 for qnode in dnode.findall(dsub): |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
319 pkk_print(dfmt.format( |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
320 text=pkk_node_to_text(qnode), |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
321 indent=pkk_geti(indent))) |
7 | 322 |
323 | |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
324 def pkk_get_list_str(dlist, dprefix, dfilter): |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
325 if len(dlist) > 0: |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
326 if dfilter: |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
327 tfmt = pkk_get_fmt(dprefix + "_list_item") |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
328 tlist = [tfmt.format(text=i) for i in dlist] |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
329 else: |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
330 tlist = dlist |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
331 |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
332 return pkk_get_fmt(dprefix + "_list").format( |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
333 alist=pkk_get_fmt(dprefix + "_list_sep").join(tlist)) |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
334 else: |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
335 return pkk_get_fmt(dprefix + "_list_empty") |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
336 |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
337 |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
338 ## Output a main "Headword" or "Sense" node |
7 | 339 def pkk_output_sense(indent, dnode): |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
340 # Definition for this sense |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
341 pkk_output_subs(indent, dnode, "./Definition", "definition_fmt") |
7 | 342 |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
343 # Examples for this sense |
7 | 344 for wnode in dnode.findall("./ExampleBlock/ExampleCtn"): |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
345 geolist = [] |
24
8c8e8e4504bb
Remove verbosity option as it is not really used.
Matti Hamalainen <ccr@tnsp.org>
parents:
23
diff
changeset
|
346 for qnode in wnode.findall("./FreeTopic[@type='levikki']/GeographicalUsage"): |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
347 geolist.append(pkk_get_fmt("example_geo_list_item").format( |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
348 text=pkk_node_to_text(qnode), |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
349 tclass=qnode.attrib["class"])) |
7 | 350 |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
351 pkk_print(pkk_get_fmt("example_fmt").format( |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
352 text=pkk_node_to_text(wnode.find("./Example")), |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
353 geostr=pkk_get_list_str(geolist, "example_geo", False), |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
354 indent=pkk_geti(indent + 1))) |
7 | 355 |
356 | |
17 | 357 ## Output one "DictionaryEntry" node |
7 | 358 def pkk_output_node(indent, dnode): |
6 | 359 |
7 | 360 for wnode in dnode.findall("./HeadwordCtn"): |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
361 # Get head word |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
362 headword = pkk_node_to_text(wnode.find("./Headword")) |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
363 |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
364 # Collect search forms |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
365 srchlist = [] |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
366 for qnode in wnode.findall("./SearchForm"): |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
367 srchlist.append(pkk_node_to_text(qnode)) |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
368 |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
369 # Remove dupe if headword is also in srchlist |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
370 if headword in srchlist: |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
371 srchlist.remove(headword) |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
372 |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
373 # Remove other duplicates and sort |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
374 srchlist = list(set(srchlist)) |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
375 srchlist.sort(reverse=False, key=lambda attr: (attr, len(attr))) |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
376 |
44
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
377 # Get hyphenation note, if any |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
378 hnode = wnode.find("./Hyphenation") |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
379 if hnode != None: |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
380 hyphenation = pkk_get_fmt("hyphenation").format( |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
381 text=pkk_node_to_text(hnode), |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
382 indent=pkk_geti(indent + 1)) |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
383 else: |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
384 hyphenation = pkk_get_fmt("no_hyphenation").format( |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
385 indent=pkk_geti(indent + 1)) |
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
386 |
18 | 387 # Create list with grammatical attributes (noun, verb, etc.) |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
388 attrlist = [] |
18 | 389 for pnode in wnode.findall("./PartOfSpeechCtn/PartOfSpeech"): |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
390 attrlist.append(pnode.attrib["freeValue"]) |
18 | 391 |
392 for pnode in wnode.findall("./GrammaticalNote"): | |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
393 attrlist.append(pkk_node_to_text(pnode)) |
18 | 394 |
395 # Remove duplicates and sort the list | |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
396 attrlist = list(set(attrlist)) |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
397 attrlist.sort(reverse=False, key=lambda attr: (attr, len(attr))) |
27
d77ab8a300b1
Use Python 3.6/3.7 format strings where we can.
Matti Hamalainen <ccr@tnsp.org>
parents:
26
diff
changeset
|
398 |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
399 # Print the headword and attributes if any |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
400 pkk_print(pkk_get_fmt("word_fmt").format( |
43
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
401 word=headword, |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
402 attr=pkk_get_list_str(attrlist, "word_attr", True), |
8ed576574712
More improvements to output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
42
diff
changeset
|
403 search=pkk_get_list_str(srchlist, "search", True), |
44
d7b4b2fb0214
Add support for hyphenation data.
Matti Hamalainen <ccr@tnsp.org>
parents:
43
diff
changeset
|
404 hyphenation=hyphenation, |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
405 indent=pkk_geti(indent))) |
18 | 406 |
407 # Print main "sense" | |
7 | 408 pkk_output_sense(indent + 1, wnode) |
6 | 409 |
18 | 410 # Print any other "senses" |
7 | 411 index = 1 |
412 for wnode in dnode.findall("./SenseGrp"): | |
40
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
413 pkk_print(pkk_get_fmt("sense_index").format( |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
414 index=index, |
bc8d8ef4a248
More work on output flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents:
39
diff
changeset
|
415 indent=pkk_geti(indent + 1))) |
7 | 416 pkk_output_sense(indent + 2, wnode) |
417 index += 1 | |
6 | 418 |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
419 pkk_print(pkk_get_fmt("word_end")) |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
420 |
6 | 421 |
0 | 422 ### |
423 ### Main program starts | |
424 ### | |
425 signal.signal(signal.SIGINT, pkk_signal_handler) | |
426 | |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
427 optparser = argparse.ArgumentParser( |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
428 description="lxmldump - Convert and dump ISO/FDIS 1951 XML file data", |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
429 usage="%(prog)s [options] <input xml file(s)>", |
31
4cbefe4c6f53
Improve help, list the default Ptr format strings for each mode.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
430 add_help=False |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
431 ) |
0 | 432 |
22 | 433 optparser.add_argument("filenames", |
434 type=str, action="extend", nargs="*", | |
435 metavar="filename", | |
436 help="XML filename(s)") | |
0 | 437 |
31
4cbefe4c6f53
Improve help, list the default Ptr format strings for each mode.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
438 optparser.add_argument("-h", "--help", |
4cbefe4c6f53
Improve help, list the default Ptr format strings for each mode.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
439 dest="show_help", |
4cbefe4c6f53
Improve help, list the default Ptr format strings for each mode.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
440 action="store_true", |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
441 help="show this help message") |
31
4cbefe4c6f53
Improve help, list the default Ptr format strings for each mode.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
442 |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
443 optparser.add_argument("-m", "--mode", |
22 | 444 dest="mode", |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
445 action=pkk_set_mode, |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
446 default=PKK_MODE_NORMAL, |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
447 help="set output mode (see below)") |
35
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
448 |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
449 optparser.add_argument("-s", "--set", |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
450 action=pkk_set_value, |
38
0e586b4ab62c
Cosmetic adjustments to help.
Matti Hamalainen <ccr@tnsp.org>
parents:
37
diff
changeset
|
451 metavar="ID=STR", |
0e586b4ab62c
Cosmetic adjustments to help.
Matti Hamalainen <ccr@tnsp.org>
parents:
37
diff
changeset
|
452 help='set format string (see below)') |
32
cfecd039506e
Make word attribute separator string configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
31
diff
changeset
|
453 |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
454 optparser.add_argument("-n", "--normalize", |
22 | 455 dest="normalize", |
29
f91ef7d7615b
Use store_true feature of argparse.
Matti Hamalainen <ccr@tnsp.org>
parents:
28
diff
changeset
|
456 action="store_true", |
22 | 457 help="output NFC normalized Unicode") |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
458 |
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
459 optparser.add_argument("-a", "--annotate", |
22 | 460 dest="annotate", |
29
f91ef7d7615b
Use store_true feature of argparse.
Matti Hamalainen <ccr@tnsp.org>
parents:
28
diff
changeset
|
461 action="store_true", |
22 | 462 help="annotate strings") |
0 | 463 |
22 | 464 optparser.add_argument("-i", "--indent", |
465 dest="indent", | |
466 type=int, choices=range(0, 32), default=4, | |
38
0e586b4ab62c
Cosmetic adjustments to help.
Matti Hamalainen <ccr@tnsp.org>
parents:
37
diff
changeset
|
467 metavar="N", |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
468 help='set indentation level (default: %(default)s)') |
0 | 469 |
35
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
470 optparser.add_argument("-p", "--debug", |
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
471 dest="debug", |
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
472 action="store_true", |
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
473 help=argparse.SUPPRESS) |
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
474 |
0 | 475 |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
476 ### Parse arguments |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
477 pkk_cfg = optparser.parse_args() |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
478 |
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
479 |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
480 ### Show help if needed |
31
4cbefe4c6f53
Improve help, list the default Ptr format strings for each mode.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
481 if len(pkk_cfg.filenames) == 0 or pkk_cfg.show_help: |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
482 optparser.print_help() |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
483 print(u"\nAvailable output modes:") |
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
484 print(" " + ", ".join(pkk_modes_list.values())) |
31
4cbefe4c6f53
Improve help, list the default Ptr format strings for each mode.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
485 |
41 | 486 if pkk_cfg.mode not in [PKK_MODE_NORMAL, PKK_MODE_ANKI]: |
487 pkk_cfg.mode = PKK_MODE_NORMAL | |
488 | |
489 print(u"\nAvailable format strings and values (mode '{}'):".format( | |
490 pkk_modes_list[pkk_cfg.mode])) | |
491 | |
39
f53ea742b57f
Refactor output mode handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
38
diff
changeset
|
492 for mid in pkk_mode_defaults: |
41 | 493 stmp = pkk_get_value(mid).replace("\\", "\\\\").replace("\n", "\\n") |
42 | 494 print(u" {:22s} : '{}'".format(mid, stmp)) |
41 | 495 |
0 | 496 sys.exit(0) |
497 | |
498 | |
6 | 499 ### Handle each input file |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
500 for filename in pkk_cfg.filenames: |
0 | 501 # Parse XML file into element tree |
502 try: | |
503 uxml = xmlET.parse(filename) | |
504 except Exception as e: | |
505 pkk_fatal(u"SVG/XML parsing failed: {0}".format(str(e))) | |
506 | |
507 # Dump output | |
508 try: | |
509 xroot = uxml.getroot() | |
510 for dnode in xroot.findall("./DictionaryEntry"): | |
7 | 511 |
20
f274504eafd0
Use Python argparse module instead of custom self-rolled argument parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
19
diff
changeset
|
512 if pkk_cfg.debug and dnode.attrib["identifier"] not in pkk_debug_list: |
7 | 513 continue |
514 | |
35
5aafa87dbec2
Some Anki-related stuff, not finalized and thus hidden.
Matti Hamalainen <ccr@tnsp.org>
parents:
34
diff
changeset
|
515 if pkk_cfg.mode in [PKK_MODE_NORMAL, PKK_MODE_ANKI]: |
19 | 516 try: |
517 pkk_output_node(0, dnode) | |
518 except Exception as e: | |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
519 print("") |
19 | 520 pkk_dump_recursive(0, dnode) |
521 print(str(e)) | |
522 sys.exit(0) | |
21 | 523 elif pkk_cfg.mode == PKK_MODE_DUMP: |
7 | 524 pkk_dump_recursive(0, dnode) |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
525 print("") |
21 | 526 elif pkk_cfg.mode == PKK_MODE_XML: |
36
4c8aafff8c5f
Refactor output handling to be (mostly) configurable.
Matti Hamalainen <ccr@tnsp.org>
parents:
35
diff
changeset
|
527 pkk_print(str(xmlET.tostring(dnode, encoding="utf8")) + "\n\n") |
0 | 528 else: |
10 | 529 pkk_fatal("Invalid operation mode?") |
7 | 530 |
0 | 531 except (BrokenPipeError, IOError) as e: |
532 sys.stderr.close() | |
533 sys.exit(1) | |
534 | |
535 pkk_cleanup() | |
536 sys.exit(0) |