3 # :Copyright: © 2012 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)
8 # :Version: 0.2 (2012-03-16)
16 Sortiere eine Wortliste und erstelle einen Patch im "unified diff" Format.
17 Ohne Angabe einer Eingangsdatei wird von der Standardeingabe gelesen.
19 Die Kodierung ist UTF8.
21 Es wird wahlweise nach Duden oder nach der bis März 2012 für die Wortliste
22 genutzten Regel sortiert. Voreinstellung ist Dudensortierung.
25 usage
= u
'%prog [Optionen] [Eingangsdatei]\n' + __doc__
28 import unicodedata
, sys
, optparse
, os
29 # path for local Python modules
30 sys
.path
.append(os
.path
.join(os
.path
.dirname(__file__
), 'python'))
31 from werkzeug
import WordFile
, WordEntry
, join_word
, udiff
, sortkey_duden
37 # Sortierschlüssel für den früher genutzten ("W.-Lemberg-") Algorithmus,
40 # * Sortieren nach gesamter Zeile
41 # * mit dem Unix-Aufruf `sort -d`
46 def sortkey_wl(entry
):
47 # Sortieren nach gesamter Zeile
51 ersetzungen
= {ord(u
'ß'): u
'ss'} # ß -> ss
52 # Feldtrenner und Trennzeichen ignorieren (Simulation von `sort -d`)
53 for char
in u
';-·=|[]{}':
54 ersetzungen
[ord(char
)] = None
55 key
= key
.translate(ersetzungen
)
57 # Akzente/Umlaute weglassen:
58 key
= unicodedata
.normalize('NFKD', key
) # Akzente mit 2-Zeichen-Kombi
59 key
= key
.encode('ascii', 'ignore') # ignoriere nicht-ASCII Zeichen
60 # Großschreibung ignorieren
66 # Aufruf von der Kommandozeile
67 # ============================
71 if __name__
== '__main__':
75 parser
= optparse
.OptionParser(usage
=usage
)
76 parser
.add_option('-o', '--outfile', dest
='patchfile',
77 help='Ausgangsdatei (Patch), Vorgabe "wortliste-sortiert.patch"',
78 default
='wortliste-sortiert.patch')
79 parser
.add_option('-a', '--legacy-sort', action
="store_true",
80 help='alternative (obsolete) Sortierordnung',
82 parser
.add_option('-d', '--dump', action
="store_true", default
=False,
83 help='Schreibe sortierte Liste auf die Standardausgabe.')
85 (options
, args
) = parser
.parse_args()
87 # Achtung: bool(options.legacy_sort) ist immer True, daher nicht
88 # ``if options.legacy_sort: ...`` verwenden!
89 if options
.legacy_sort
is True:
92 sortkey
= sortkey_duden
94 # Einlesen in eine Liste::
97 eingangsdateiname
= args
[0]
98 wordfile
= WordFile(eingangsdateiname
)
99 wortliste
= list(wordfile
)
101 eingangsdateiname
= 'stdin'
102 wortliste
= [WordEntry(line
.rstrip().decode('utf-8'))
103 for line
in sys
.stdin
]
107 sortiert
= sorted(wortliste
, key
=sortkey
)
110 for line
in sortiert
:
111 print unicode(line
).encode('utf8')
114 patch
= udiff(wortliste
, sortiert
,
115 eingangsdateiname
, eingangsdateiname
+'-sortiert',
119 if options
.patchfile
:
120 patchfile
= open(options
.patchfile
, 'w')
121 patchfile
.write(patch
+ '\n')
123 print 'keine Änderungen'