1 -- -*- coding: utf-8 -*-
3 --- Diese Modul stellt Funktionen zur Zerlegung der Wortliste in einzelne
6 -- @name parse_wortliste
9 -- lokale Modul-Tabelle
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
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
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.
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
96 -- 7 * reformierte Rechtschreibung,
98 -- 8 * traditionelle Rechtschreibung in der Schweiz,
101 -- Muster für Wörter, die keiner expliziten Versalschreibung
104 local ua
= feld
* _feld
* opcomment
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
)
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
216 -- Exportiere Modul-Tabelle.