Python-Skripte: kleine Korrekturen.
[wortliste.git] / skripte / python / lang_s / s2long-s.py
blobb91443b57353c6f40f6640e77fbd2b272b439aff
1 #!/usr/bin/env python3
2 # -*- coding: utf8 -*-
3 # :Copyright: © 2012, 2014 Günter Milde.
4 # :Licence: This work may be distributed and/or modified under
5 # the conditions of the `LaTeX Project Public License`,
6 # either version 1.3 of this license or (at your option)
7 # any later version.
8 # :Version: 0.3 (2014-06-14)
10 # ===================================================================
11 # Langes oder rundes S: Automatische Konversion nach Silbentrennung
12 # ===================================================================
14 # ::
16 u"""
17 Erstelle eine Wortliste mit (hoffentlich) korrekter lang-S Schreibung.
19 Automatische Bestimmung der S-Schreibung auf Basis der Silbentrennung
20 in der `Wortliste der deutschsprachigen Trennmustermannschaft`.
22 Für die Wandlung mit Hilfe der patgen-generierten Muster siehe
23 ``../patuse/``.
24 """
26 # .. contents::
28 # Vorspann
29 # ========
31 # Lade Funktionen und Klassen für reguläre Ausdrücke::
33 import os, argparse, re, sys
35 # path for local Python modules (parent dir of this file's dir)
36 sys.path.insert(0,
37 os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
38 from edit_tools.wortliste import WordFile, WordEntry, join_word
41 # Trennzeichen
42 # ------------
44 # Die Trennzeichen der Wortliste sind
46 # == ================================================================
47 # \· Notentext-Trennstellen (am Wortrand und in Abkürzungen)
48 # . unerwünschte Trennstellen, z.B. Ur-in.stinkt
49 # = Haupttrennstellen
50 # \- einfache Trennstellen
51 # < Trennstellen nach Vorsilben
52 # > Trennstellen vor Suffixen
53 # == ================================================================
56 # Funktionen
57 # ==========
59 # ſ-Regeln
60 # --------
62 # Siehe [wikipedia]_ und [Duden71]_ (Regeln K 44,45)::
64 def s_ersetzen(word):
66 # Ausnahmeregeln
67 # ~~~~~~~~~~~~~~
69 # Für sz und sk gelten Regeln, welche die Herkunft der Wörter beachten.
70 # Diese und weitere spezielle Fälle, welche Lang-S vor Trennstellen verlangen
71 # sind in `Ausnahmen Lang-S`_ gelistet::
73 for (ausnahme, ersetzung) in ausnahmen_lang_s:
74 if ausnahme in word:
75 word = word.replace(ausnahme, ersetzung)
76 # print(u"ſ-Ausnahme", ersetzung, word)
78 # Allgemeine Regeln
79 # ~~~~~~~~~~~~~~~~~
81 # ſ steht im Silbenanlaut::
83 word = re.sub(r'(^|[-<>=·.])s', r'\1ſ', word)
85 # ſ steht im Inlaut als stimmhaftes s zwischen Vokalen
86 # (gilt auch für ungetrenntes ss zwischen Selbstlauten, z.B. Hausse, Baisse)::
88 word = re.sub(r'([AEIOUYÄÖÜaeiouäöüé])s([aeiouyäöüé])', r'\1ſ\2', word)
89 word = re.sub(r'([AEIOUYÄÖÜaeiouäöüé])ss([aeiouyäöüé])', r'\1ſſ\2', word)
92 # Doppel-S statt ß
93 # ----------------
95 # Wenn kein ß vorhanden ist (GROSSSCHREIBUNG) und in der Schweiz wird ss
96 # statt ß geschrieben. Seit 1996 wird auch am Wort-/Silbenende und vor t nach
97 # kurzem Vokal ss geschrieben. Der "Reformduden" empfielt im Fraktursatz die
98 # Schreibung "ſs" (die auch vor 1901 in Gebrauch war).
100 # Wir übernehmen diese Schreibung am Wort-/Silbenende::
102 word = re.sub('ss($|[-=<>.])', r'ſs\1', word)
104 # Vor t schreiben wir nach kurzem Vokal Doppel-ſ::
106 word = word.replace('sst', 'ſſt')
108 # Nach langem Vokal steht auch in de-1996 ein ß, in de-x-GROSS ist keine
109 # ſ-Wandlung nötig/möglich.
110 # TODO: in der Schweizer Orthographie müßte nach langem Vokal oder Zwielaut
111 # auch vor t ein ſs stehen (beißt -> beiſst).
113 # Verbindungen und Digraphen
114 # --------------------------
116 # ſ steht in den Verbindungen sp, st, sch und in Digraphen::
118 word = word.replace('st', 'ſt')
119 word = word.replace('sp', 'ſp')
120 word = word.replace('sch', 'ſch')
122 # word = word.replace('ps', 'pſ')
123 word = word.replace('Ps', 'Pſ') # Ψ
124 word = re.sub(r'^ps', r'pſ', word) # ψ (ps am Wortanfang)
125 word = re.sub(r'([-<>=·.])ps', r'\1pſ', word) # ψ (ps am Silbenanfang)
128 # ſ vor Trennstellen
129 # ------------------
131 # Die Verbindungen ss, sp, st werden zu ſſ, ſp und ſt, auch wenn sie
132 # durch eine Nebentrennstelle (Trennung innerhalb eines Wortbestandteiles)
133 # getrennt sind. Das s bleibt rund im Auslaut, d.h. am Wortende und vor
134 # einer Haupttrennstelle (Trennung an der Grenze zweier Wortbestandteile
135 # (Vorsilb<Stamm, Bestimmungswort=Grundwort).
137 # ::
139 word = re.sub(r's([-.]+)ſ([aeiouyäöüé])', r'ſ\1ſ\2', word)
140 word = re.sub(r's([-.]+)p([^h])', r'ſ\1p\2', word)
141 word = re.sub(r'(^|[^s])s([-.]+)t', r'\1ſ\2t', word) # Reformschreibung
143 # ſ wird auch geschrieben, wenn der S-Laut nur scheinbar im Auslaut steht,
144 # weil ein folgendes unbetontes e ausfällt:
146 # "ss-l", aber nicht bei "...eiss-l" und "Ess-lingen" mit ss statt ß::
148 word = re.sub(r'([^iE])ss-l', r'\1ſſ-l', word) # Droſſ-lung, ...
150 # "s-l" (Baſ-ler, pinſ-le, Kapſ-lung, Wechſ-ler, wechſ-le, Rieſ-ling),
151 # aber nicht bei
153 # | M.s-l: Mus-lim, Mos-lem, ...
154 # | [iys]s-l: Gris-ly, is-lam, Crys-ler, ... (ss-l siehe obige Regel)
155 # | s-la: Bra-tis-la-va, Gos-lar, Bres-lau,
157 # ::
159 word = re.sub(r'([^mM][^siy])s-l([^a])', r'\1ſ-l\2', word)
161 # (für weitere Fälle siehe auch `Ausnahmen Lang-S`_):
164 # Fremdwörter und Eigennamen mit Schluss-ß
165 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
167 # Der 1971er [Duden71]_ führt zu englischen Fremdwörtern mit Schluß-ß die
168 # österreichische Schreibung mit "ss" auf (Miß, engl. und österr. Schreibung
169 # Miss) wobei das Schluß-s nicht unterstrichen ist (also lang sein müßte?). So
170 # auch Boss, Business, Stewardess.
172 # Dagegen sagt [en.wiktionary.org]_: "the digraph «ss» was often written «ſs»
173 # rather than «ſſ»". Die Lang-S Seite der [wikipedia]_ zeigt Beispiele der
174 # englischen Schreibung "Congreſs".
176 # ::
178 # TODO ſſ oder ſs (wie in de-1996)? :
179 # if lang == 'de-1901':
180 # word = re.sub(r'ss$', r'ſſ', word)
181 # word = word.replace('ss=', 'ſſ=')
182 # word = word.replace('ss-ſch', 'ſſ-ſch')
184 return word
187 # Ausnahmen Lang-S
188 # ~~~~~~~~~~~~~~~~~~~
190 # Teilstrings mit Lang-S vor Trennstelle.
192 # ſ wird geschrieben, wenn der S-Laut nur scheinbar im Auslaut steht,
193 # weil ein folgendes unbetontes e ausfällt::
195 ausnahmen_lang_s = [
197 'Pilſ-ner', # < Pilsen, aber Mes-ner, Meiss-ner (de-ch)
198 'Klauſ-ner', # < Klause, aber Gleiss-ner (de-ch)
199 'riſſ-ne', # ge<riss-ne, ... (de-ch)
200 'oſſ-ne', # ge<schoss-ne, ge<schloss-ne, ... (de-ch)
201 'er<leſ-ne', # auserlesne
202 'unſ-r', # unsre, unsrige, ...
203 'ſſl', # Röſſl
204 'ſl', # Beiſl, Häuſl
205 'kreiſ-le',
206 'Wieſn',
207 'Schiſſ-la-weng',
208 'Pſſſt', # im Duden pst!
209 'WiſſZeitVG', # Abkürzung Wiſſenſchaft...
212 # ſ steht in Abkürzungen, wenn es im abgekürzten Wort steht
213 # (Abſ. - Abſatz/Abſender, (de)creſc. - (de)creſcendo, daſ. - daſelbst ...)
214 # ::
216 ausnahmen_lang_s.extend([
218 'creſc', # creſcendo
219 'Diſſ', # Diſſertation
220 'Maſſ', # Maſſachuſetts
224 # Alternativtrennung, wo beide Fälle ſ verlangen::
226 ausnahmen_lang_s.extend([
228 'er<.]ſat', # Kin[-der=/d=er<.]satz, ...
229 'er<.]ſät', # Kin[-der=/d=er<.]sätze, ...
230 'ſ[-ter=/t' # Tes[-ter=/t=er<.]ken-nung
235 # Fremdwörter und Eigennamen
236 # --------------------------
238 # Schreibung nach Regeln der Herkunftssprache. Dabei ist zu bedenken, daß zu
239 # der Zeit, als das lange s im Antiquasatz noch üblich war (bis ca. 1800), die
240 # Rechtschreibung freier gehandhabt wurde und mehrfach Wandlungen unterworfen
241 # war [West06]_.
243 # Im Deutschen werden im Fraktursatz nicht eingedeutschte Fremdwörter
244 # lateinischen und romanischen Ursprungs in Antiqua mit rund-s geschrieben.
246 # English:
247 # The long, medial, or descending ess, as distinct from the short or
248 # terminal ess. In Roman script, the long ess was used everywhere except at
249 # the end of words, where the short ess was used, and frequently in what is
250 # now the digraph «ss», which was often written «ſs» rather than «ſſ»
251 # [en.wiktionary.org]_. See also [Typefounder08]_ and [West06]_.
253 # ::
255 ausnahmen_lang_s.extend(
257 'ſh', # (englisch)
258 # 'Diſc', # (englisch) TODO: so, oder Disc (wie eingedeutscht Disk)
259 'Cſar', # Cs -> Tsch (Csardas, ... ungarisch)
260 'ſz', # polnisch, ungarisch (Liszt, Puszta)
262 # ts am Silbenanfang (chinesisch, japanisch, griechisch)::
264 'Tſa', 'Tſe', 'tſe', 'tſi', 'Tſu', 'tſu',
266 # In vielen (aber nicht allen) Fremdwörtern steht ſz trotz Trennzeichen::
268 'ſ-ce-', # Fluo-res-ce-in
269 'ſ-ze-', # Aszese, aszetisch, Damaszener, vis-ze-ral, ...
270 'ſ-zen', # Adoleszenz, Aszendent, ...
271 'ſ-zet', # As-zet
272 # ſ-zi (aber Dis-zi-plin):
273 'Aſ-zi', # Aszites
274 'aſ-zi', # fasziniert, lasziv
275 'ſ-zil-l' , # Oszillation, Oszilloskop, ...
276 'gnoſ-zie', # rekognoszieren,
277 'reſ-zi', # fluoreszieren, phosporeszieren, Fluo-res-cin, ...
278 'le-biſ-zi', # Plebiszit, ...
279 'viſ-zi', # Mukoviszidose
281 # ſ steht in der Endung sk in Wörtern und Namen slawischen Ursprungs
283 # ::
285 'Gdanſk',
286 'owſk', # Litowſk
287 'Minſk',
288 'Mur-manſk',
289 'ſi-birſk',
290 'Smo-lenſk',
292 # ſ steht auch in Iſmael, Iſrael, Iſlam (in Österreich Islam)
294 'Iſ-lam',
295 'Iſ-la-m',
296 'iſ-la-m',
297 'Iſ-ma-e',
298 'Iſ-ra-e',
299 'iſ-ra-e',
301 # ſſ steht in vollständig assimilierten Präfixen auf s (dis-, as-)::
303 'aſ<ſ', # Aſſoziation, ...
304 'diſ<ſ', # Diſſoziation, ...
305 'Diſ<ſ', # diſſonant, ... TODO: aber Disſtreſs
309 # Wandel in liste mit (Ausnahme, Ersetzung)::
311 ausnahmen_lang_s = [(exc.replace('ſ', 's'), exc) for exc in ausnahmen_lang_s]
313 # s-Regeln
314 # --------
316 # Test auf verbliebene Unklarheiten
318 # Wenn ein Wort "s" nur an Stellen enthält wo die Regeln rundes S vorsehen,
319 # ist die automatische Konversion abgeschlossen.
321 # Ausnahmen und spezielle Regeln
323 # Liste von Teilstrings, welche stets rund-s behalten ::
325 ausnahmen_rund_s = [
327 # Abkürzungen::
329 'Ausg', # Ausgang, Ausgabe
330 'ausſchl',
331 'desgl', # des<gleichen
332 'Esc', # engl. Escape
333 'hrsg', # herausgegeben
334 'Hrsg', # Herausgeber
335 'insb',
337 # ausgelassenes flüchtiges e::
339 'Dresd-ne', # Dresd-ner/Dresd-ne-rin
341 # s steht auch in einigen Fremdwörtern vor z und c::
343 'on<fis-zie', # konfiszieren, ...
344 # 'le-bis-z', # plebiszit (nach [Duden71] mit Lang-S)
345 'is-zi-pl', # Disziplin (nach [Duden71], aber Duden (1934) Diſziplin)
346 'mas-ze-ner', # Damaszener
347 'Disc', # TODO: rund oder Diſc (aber eingedeutscht Disk)
349 # ss im Auslaut (vgl. `Fremdwörter und Eigennamen`_)::
351 # 'Gauss', # vgl. "Briefwechsel zwischen C.F. Gauss und
352 # H.C. Schumacher, herausg. von C.A.F. Peters"
353 # aber Boſſ, Busineſſ, Dreſſ
358 def is_complete(word):
360 # Kurztest: schon alles gewandelt?::
362 if 's' not in word:
363 return True
365 # Ersetze s an Stellen, wo es rund zu schreiben ist, durch ς (Schluss-Sigma)
366 # und teste auf verbliebene Vorkommen.
368 # Einzelfälle mit rundem S (substrings)::
370 for fall in ausnahmen_rund_s:
371 if fall in word:
372 # print('s-Ausnahme', fall, word)
373 word = word.replace(fall, fall.replace('s','ς'))
375 # s steht am Wortende, auch in Zusammensetzungen (vor Haupttrennstellen)::
377 word = re.sub(r's($|[=<>])', r'ς\1', word)
379 # Einige ältere Quellen schreiben ss am Schluss von Fremdwörtern oder Namen
380 # (Gauss). Andere schreiben ſs oder ſſ. (Vgl. `Fremdwörter und Eigennamen
381 # mit Schluss-ß`_) Wir verwenden ſs (TODO oder?)::
383 #word = re.sub(r'ss(=|$)', r'ςς\1', word)
385 # s steht am Silbenende (vor Nebentrennstellen), wenn kein p, t, z oder ſ
386 # folgt (in der traditionellen Schreibung wird st nicht getrennt)::
388 word = re.sub(r'ss?([·.\-][^ptzſ])', r'ς\1', word) # konservativ
390 # s steht auch vor Nebentrennstellen, wenn sch folgt::
392 word = word.replace('s-ſch','ς-ſch')
394 # s steht nach Vorsilben (wie aus<) auch wenn s, p, t, oder z folgt::
396 word = word.replace('s<','ς<')
398 # s steht vor Trennstellen am Suffixanfang
399 # auch wenn s, p, t, oder z folgt (Ols>sen, Jonas>son, Wachs>tum)::
401 word = word.replace('s>','ς>')
403 # s steht meist im Inlaut vor k, n, w (aber: siehe Lang-ſ-Ausnahmen)::
405 word = re.sub(r's([knw])', r'ς\1', word)
407 # s steht in der Verbindung sst, die in der Schweiz und
408 # bei fehlendem ß (GROSS) für ßt steht::
410 # TODO: nur nach Zwielaut und langem Vokal.
411 # word = word.replace('ſst', 'ſςt')
412 # word = word.replace('ſs-t', 'ſς-t')
414 # s steht als zweiter Buchstabe im ersetzten ß::
416 word = word.replace('-ſs', '-ſς') # traditionelle Orthographie
418 # und suche nach übrigen Vorkommen::
420 return 's' not in word
423 # Aufruf von der Kommandozeile
424 # ============================
426 # ::
428 if __name__ == '__main__':
430 # Pfad zu "../../../wortliste" unabhängig vom Arbeitsverzeichnis::
432 default_wortliste = os.path.relpath(os.path.join(
433 os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(
434 os.path.abspath(__file__))))),
435 'wortliste'))
437 # Optionen::
439 parser = argparse.ArgumentParser(description=__doc__)
440 parser.add_argument('WORTLISTE', nargs='?',
441 help=u'Eingangsdatei im "Wortliste-Format" '
442 '("-" für Standardeingabe), '
443 'Vorgabe "%s".'%default_wortliste,
444 default=default_wortliste)
445 parser.add_argument('-l', '--language', dest='language',
446 help=u'Sprachvariante(n) (kommagetrennte Liste von '
447 'ISO Sprachtags), Vorgabe "de-1901"',
448 default='de-1901')
449 parser.add_argument('-d', '--drop-homonyms', action="store_true",
450 default=False,
451 help=u'Bei mehrdeutigen Wörtern, die sich nur in '
452 'Lang-S-Schreibung unterscheiden, nimm nur das erste.')
454 args = parser.parse_args()
457 # Angabe der Sprachvariante nach [BCP47]_ (Reformschreibung 'de' oder
458 # 'de-1996', Schweiz 'de-CH', ...)::
460 lang = args.language
462 # Iterator::
464 if args.WORTLISTE == '-':
465 wordfile = (WordEntry(line.rstrip()) for line in sys.stdin)
466 else:
467 wordfile = WordFile(args.WORTLISTE)
470 # Hauptschleife
471 # =============
473 # Konvertiere die Wörter der Trennliste und sortiere die Ergebnisse in
474 # Listen::
476 no_of_words = 0 # Gesamtwortzahl der gewählten Sprache(n)
477 irreversible = [] # Rückkonversion ungleich Original (Fehler)
478 offen = [] # Der Algorithmus kann die Schreibweise (noch) nicht ermitteln
480 # Iteration über alle Zeilen der Wortliste::
482 for entry in wordfile:
484 word = entry.get(lang) # Wort mit Trennstellen
485 if not word: # Wort existiert nicht in der Sprachvariante
486 continue
487 no_of_words += 1
489 # Vorsortieren
490 # ------------
492 # Wörter ohne Binnen-s müssen nicht konvertiert werden. Damit wird die
493 # Wortliste ungefähr um die Hälfte kürzer::
495 if 's' not in entry[0][:-1]:
496 print(entry[0])
497 continue
499 # Regelbasierte s/ſ-Schreibung::
501 lang_s_word = s_ersetzen(word)
503 # Einsortieren nach Vollständigkeit der Ersetzungen::
505 # print(lang, lang_s_word, unicode(entry))
506 entry.set(lang_s_word, lang) # Rückschreiben von teilweisen Ersetzungen
508 if lang_s_word.replace('ſ', 's') != word:
509 entry.comment = lang_s_word.replace('ſ', 's') + u" != " + word
510 irreversible.append(entry)
511 continue
513 if not is_complete(lang_s_word):
514 offen.append(entry)
515 continue
517 # Mehrdeutigkeiten [ſ/s] oder [s/ſ] auflösen::
519 lang_s_word = join_word(lang_s_word)
520 if '/' in lang_s_word:
521 # 1. Alternative:
522 print(re.sub(r'\[(.+)/.+\]', r'\1', lang_s_word))
523 if not args.drop_homonyms:
524 print(re.sub(r'\[.+/(.+)\]', r'\1', lang_s_word))
525 else:
526 print(lang_s_word)
527 # print(lang_s_word)
530 # Auswertung
531 # ==========
533 # ::
535 sys.stderr.write("# Gesamtwortzahl %s %s\n" % (lang, no_of_words))
536 sys.stderr.write("# erkannte Konvertierungsfehler: %d\n"
537 % len(irreversible))
538 for entry in irreversible:
539 sys.stderr.write(str(entry)+'\n')
540 sys.stderr.write("# noch offen/unklar: %d\n" % len(offen))
541 for entry in offen:
542 sys.stderr.write(str(entry)+'\n')
545 # Diskussion
546 # ==========
548 # Für gebrochene Schriften gibt es den `ISO Sprachtag`_
550 # :Latf: Latin (Fraktur variant)
552 # (Lateinisches Alphabet, gebrochen), e.g. "de-1901-Latf",
553 # "de-1996-Latf".
555 # .. _ISO Sprachtag: http://www.unicode.org/iso15924/iso15924-codes.html
557 # Statistik
558 # ---------
560 # Gesamtwortzahl (traditionelle Rechtschreibung): 427746
561 # Automatisch konvertiert: 427740
562 # Kategorisierung der Trennstellen fehlt: 0
563 # noch offen: 6
565 # Die Mehrzahl der Wörter der Trennliste wurde nach den Regeln des Dudens in
566 # die Schreibung mit langem `S` (ſ) konvertiert (wobei ungefähr die Hälfte der
567 # Wörter kein kleines `s` enthält womit die Konversion trivial wird).
569 # Für eine beschränke Anzahl offener Fälle wurden Ausnahmeregeln und Ausnahmen
570 # implementiert.
572 # Das Resultat muß noch auf nicht erfaßte Ausnahmen und Sonderfälle geprüft
573 # werden. Fehlentscheidungen sind nicht auszuschließen.
576 # Offene Fälle
577 # ------------
579 # Wörter mit identischer Schreibung ohne Lang-S
580 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
582 # Einige mehrdeutige Zusammensetzungen unterscheiden sich in der
583 # Lang-S-Schreibung, z.B.
585 # * Wach[s/ſ]tube: Wach-Stube / Wachs-Tube
586 # * Ga[s/ſ]traſſe: Gas-Trasse / Gast-Rasse
587 # * Schiff[ſ/s]tau: Schiffs-Tau / Schiff-Stau
589 # Im Normalfall schreibt s2long-s.py beide Varianten in die Ausgabedatei. Die
590 # Option --drop_homonyms kann verwendet werden, wenn dies nicht erwünscht ist.
592 # Unklare Schreibung
593 # ~~~~~~~~~~~~~~~~~~
595 # * Ersetztes SZ in reformierter Rechtschreibung, wenn ein Selbstlaut folgt
596 # (z.B. "Straſ-ſe" oder "Straſ-se).
598 # - Während in 1901-er Rechtschreibung die Trennung vor dem "ss" erfolgt
599 # (was Ersetzung mit "ſs" impliziert) wäre bei Trennung "wie normales
600 # Doppel-S" dann ein rundes S am Silbenanfang.
602 # Korrekte Fallunterscheidung geht nur bei Betrachtung der Nachbarfelder.
604 # * Tonarten (As-Dur oder Aſ-Dur)
606 # - Im Fraktur-Duden steht As *in Antiqua* mit rundem s, also
607 # keine Aussage zur Schreibung in Fraktur.
608 # - Im 1971-er [Duden71]_ steht As (Tonart) ohne Unterstreichung des `s`,
609 # das wäre Lang-S, obgleich am Wortende! Ebenso für Es, Cis, ...
611 # Wir brauchen keine Ausnahme, da korrekterweise die Tonart immer in Antiqua
612 # zu setzen ist.
615 # Quellen
616 # =======
618 # .. [Duden71] `Der Große Duden` 16. Auflage, VEB Bibliographisches Institut
619 # Leipzig, 1971
621 # Kennzeichnet im Stichwortteil rundes „s“ durch Unterstreichen.
623 # .. [Duden34] `Der Große Duden`, Leipzig 1934
625 # In Fraktur.
627 # .. [wikipedia] Langes s
628 # http://de.wikipedia.org/wiki/Langes_s
630 # .. [en.wiktionary.org]
631 # http://en.wiktionary.org/wiki/%C5%BF
633 # .. [Typefounder08]
634 # http://typefoundry.blogspot.com/2008/01/long-s.html
636 # .. [West06] Andrew West, `The rules for long s`, 2006
637 # http://babelstone.blogspot.com/2006/06/rules-for-long-s.html
639 # .. [BCP47] A. Phillips und M. Davis, (Editoren.),
640 # `Tags for Identifying Languages`, http://www.rfc-editor.org/rfc/bcp/bcp47.txt
642 # .. Links:
644 # .. _Wortliste der deutschsprachigen Trennmustermannschaft:
645 # http://mirrors.ctan.org/language/hyphenation/dehyph-exptl/projektbeschreibung.pdf