Merge branch 'master' of git+ssh://repo.or.cz/srv/git/wortliste
[wortliste.git] / skripte / parse_wortliste.lua
blob5fa672f7d82698b7577330c1ea3b71e3124f4a35
1 -- -*- coding: utf-8 -*-
3 --- Diese Modul stellt Funktionen zur Zerlegung der Wortliste in einzelne
4 -- Felder bereit.
5 -- @class module
6 -- @name parse_wortliste
9 -- lokale Modul-Tabelle
10 local M = {}
13 -- Definiere Muster für einige Spezialzeichen.
14 local sep = lpeg.P ";"-- Feldtrenner
15 local com = lpeg.P "#"-- Kommentar
16 local spc = lpeg.P " "-- Leerzeichen
17 local num = lpeg.R "09"-- Ziffern
19 -- Muster für Felder mit festem Inhalt (leere Felder).
20 local leer2 = lpeg.P "-2-"
21 local leer3 = lpeg.P "-3-"
22 local leer4 = lpeg.P "-4-"
23 local leer5 = lpeg.P "-5-"
24 local leer6 = lpeg.P "-6-"
25 local leer7 = lpeg.P "-7-"
26 local leer8 = lpeg.P "-8-"
27 local leerX = lpeg.P "-" * num * lpeg.P "-"
28 -- Kürzel für leere Felder mit voranstehendem Feldtrenner.
29 local _leer2 = sep * leer2
30 local _leer3 = sep * leer3
31 local _leer4 = sep * leer4
32 local _leer5 = sep * leer5
33 local _leer6 = sep * leer6
34 local _leer7 = sep * leer7
35 local _leer8 = sep * leer8
37 -- Muster für ein Feld beliebigen Inhalts, welches nicht mit -[0-9]-
38 -- beginnt. Die Capture enthält den Feldinhalt.
39 local feld = (lpeg.C((1 - (sep + spc + com))^0) - leerX)
40 -- Kürzel für Feld mit voranstehendem Feldtrenner.
41 local _feld = sep * feld
43 -- Muster für Kommentare der Form: beliebig viele Leerzeichen, gefolgt
44 -- von einem Kommentarzeichen, gefolgt von beliebigem Inhalt bis zum
45 -- Zeilenende. Die Capture enthält den eigentlichen Kommentartext ohne
46 -- das Kommentarzeichen.
47 local opcomment = spc^0 * (com * lpeg.C(lpeg.P(1)^0))^-1 * -1
50 -- Grammatik
52 -- Kurze Beschreibung des Formats der Wortliste:
54 -- Jede Zeile enthält eine bestimmte Schreibvariante eines Wortes.
55 -- Unterschiedliche Schreibvarianten deselben Wortes sind nicht
56 -- miteinander verknüpft.
58 -- Feldtrenner ist das Semikolon. Kommentare werden durch '#'
59 -- eingeleitet und erstrecken sich bis zum Zeilenende. Vor dem
60 -- Kommentarzeichen sind beliebige Leerzeichen erlaubt.
62 -- Leere Felder bestehen aus der Feldnummer eingeschlossen in
63 -- Minuszeichen, z. B. steht -2- für ein leeres Feld 2.
65 -- Feld 1 enthät ein Wort in ungetrennter Schreibung.
67 -- Die Felder 2, 3, 4 enthalten Wörter, die keiner expliziten
68 -- Versalschreibung entsprechen ('ß' durch 'ss' ersetzt). Die Felder 3,
69 -- 4 treten immer paarweise auf. Enthielten sie denselben Inhalt, so
70 -- wird stattdessen Feld 2 verwendet. Die Felder 3 und 4 existieren
71 -- dann nicht.
73 -- Die Felder 5, 6, 7, 8 enthalten Wörter, die expliziter
74 -- Versalschreibung entsprechen ('ß' durch 'ss' ersetzt). Die Felder 6,
75 -- 7, 8 treten immer zu dritt auf. Enthielten sie alle denselben
76 -- Inhalt, so wird stattdessen Feld 5 verwendet. Die Felder 6, 7, 8
77 -- existieren dann nicht.
79 -- Feld Beschreibung
81 -- 1 * ungetrennt,
83 -- 2 * keine explizite Versalschreibung,
84 -- * falls in allen Rechtschreibungen gleich,
86 -- 3 * traditionelle Rechtschreibung,
88 -- 4 * reformierte Rechtschreibung,
90 -- 5 * explizite Versalschreibung,
91 -- * falls in allen Rechtschreibungen gleich,
93 -- 6 * traditionelle Rechtschreibung in Deutschland und/oder
94 -- Österreich,
96 -- 7 * reformierte Rechtschreibung,
98 -- 8 * traditionelle Rechtschreibung in der Schweiz,
101 -- Muster für Wörter, die keiner expliziten Versalschreibung
102 -- entsprechen.
104 local ua = feld * _feld * opcomment
105 -- einfach;ein·fach
107 local uxt_ = feld * _leer2 * _feld * _leer4 * opcomment
108 -- Abfallager;-2-;Ab·fa{ll/ll·l}a·ger;-4-
109 -- Abfluß;-2-;Ab-fluß;-4-
111 local ux_r = feld * _leer2 * _leer3 * _feld * opcomment
112 -- Abfalllager;-2-;-3-;Ab-fall=la-ger
114 local uxtr = feld * _leer2 * _feld * _feld * opcomment
115 -- abgelöste;-2-;ab-ge-lö-ste;ab-ge-lös-te
118 -- Muster für Wörter, die expliziter Versalschreibung entsprechen ('ß'
119 -- durch 'ss' ersetzt).
121 local ux__c = feld * _leer2 * _leer3 * _leer4 * _feld * opcomment
122 -- Abstoss;-2-;-3-;-4-;Ab·stoss
124 local ux__xt__ = feld * _leer2 * _leer3 * _leer4 * _leer5 * _feld * _leer7 * _leer8 * opcomment
125 -- Litfasssäulenstilleben;-2-;-3-;-4-;-5-;Lit-fass-säu-len-sti{ll/ll-l}e-ben;-7-;-8-
127 local ux__x_r_ = feld * _leer2 * _leer3 * _leer4 * _leer5 * _leer6 * _feld * _leer8 * opcomment
128 -- Fussballliga;-2-;-3-;-4-;-5-;-6-;Fuss·ball·li·ga;-8-
130 local ux__x__s = feld * _leer2 * _leer3 * _leer4 * _leer5 * _leer6 * _leer7 * _feld * opcomment
131 -- Litfassäule;-2-;-3-;-4-;-5-;-6-;-7-;Lit·fa{ss/ss·s}äu·le
133 local ux__xtr_ = feld * _leer2 * _leer3 * _leer4 * _leer5 * _feld * _feld * _leer8 * opcomment
134 -- süsssauer;-2-;-3-;-4-;-5-;süss·sau·er;süss·sau·er;-8-
136 local ux__xt_s = feld * _leer2 * _leer3 * _leer4 * _leer5 * _feld * _leer7 * _feld * opcomment
137 -- Fussballiga;-2-;-3-;-4-;-5-;Fuss·ba{ll/ll·l}i·ga;-7-;Fuss·ba{ll/ll·l}i·ga
139 local ux__xtrs = feld * _leer2 * _leer3 * _leer4 * _leer5 * _feld * _feld * _feld * opcomment
140 -- Füsse;-2-;-3-;-4-;-5-;Fü·sse;Füs·se;Füs·se
143 -- Muster für Wörter, die in der reformierten Rechtschreibung
144 -- existieren, in der traditionellen Rechtschreibung jedoch nur in
145 -- Versalschreibweise ('ß' durch 'ss' ersetzt).
147 local ux_rc = feld * _leer2 * _leer3 * _feld * _feld * opcomment
148 -- Abfluss;-2-;-3-;Ab-fluss;Ab·fluss
150 local ux_rxtr_ = feld * _leer2 * _leer3 * _feld * _leer5 * _feld * _feld * _leer8 * opcomment
151 -- Litfasssäule;-2-;-3-;Lit·fass·säu·le;-5-;Lit·fass·säu·le;Lit·fass·säu·le;-8-
153 local ux_rxtrs = feld * _leer2 * _leer3 * _feld * _leer5 * _feld * _feld * _feld * opcomment
154 -- dussligste;-2-;-3-;duss·ligs·te;-5-;duss·lig·ste;duss·ligs·te;duss·lig·ste
157 --- Zerlege eine Zeile der Wortliste.
158 -- @param line eine Zeile aus der Wortliste
159 -- @return Tabelle mit gültigen Feldern
160 local function parse(line)
161 local u, a, t, r
162 local ca, ct, cr, cs
163 local com
165 u, a, com = ua:match(line)
166 if u and a then return { u = u, a = a, comment = com, type = "ua" } end
168 u, t, com = uxt_:match(line)
169 if u and t then return { u = u, t = t, comment = com, type = "uxt_" } end
171 u, r, com = ux_r:match(line)
172 if u and r then return { u = u, r = r, comment = com, type = "ux_r" } end
174 u, t, r, com = uxtr:match(line)
175 if u and t and r then return { u = u, t = t, r = r, comment = com, type = "uxtr" } end
179 u, ca, com = ux__c:match(line)
180 if u and ca then return { u = u, ca = ca, comment = com, type = "ux__c" } end
182 u, ct, com = ux__xt__:match(line)
183 if u and ct then return { u = u, ct = ct, comment = com, type = "ux__xt__" } end
185 u, cr, com = ux__x_r_:match(line)
186 if u and cr then return { u = u, cr = cr, comment = com, type = "ux__x_r_" } end
188 u, cs, com = ux__x__s:match(line)
189 if u and cs then return { u = u, cs = cs, comment = com, type = "ux__x__s" } end
191 u, ct, cs, com = ux__xt_s:match(line)
192 if u and ct and cs then return { u = u, ct = ct, cs = cs, comment = com, type = "ux__xt_s" } end
194 u, ct, cr, com = ux__xtr_:match(line)
195 if u and ct and cr then return { u = u, ct = ct, cr = cr, comment = com, type = "ux__xtr_" } end
197 u, ct, cr, cs, com = ux__xtrs:match(line)
198 if u and ct and cr and cs then return { u = u, ct = ct, cr = cr, cs = cs, comment = com, type = "ux__xtrs" } end
202 u, r, ca, com = ux_rc:match(line)
203 if u and r and ca then return { u = u, r = r, ca = ca, comment = com, type = "ux_rc" } end
205 u, r, ct, cr, com = ux_rxtr_:match(line)
206 if u and r and ct and cr then return { u = u, r = r, ct = ct, cr = cr, comment = com, type = "ux_rxtr_" } end
208 u, r, ct, cr, cs, com = ux_rxtrs:match(line)
209 if u and r and ct and cr and cs then return { u = u, r = r, ct = ct, cr = cr, cs = cs, comment = com, type = "ux_rxtrs" } end
211 return nil
213 M.parse = parse
216 -- Exportiere Modul-Tabelle.
217 return M