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
30 # path for local Python modules
31 sys
.path
.insert(0, os
.path
.join(os
.path
.dirname(__file__
), 'python'))
33 from edit_tools
.wortliste
import (WordEntry
, udiff
, sortkey_duden
)
38 # Sortierschlüssel für den früher genutzten ("W.-Lemberg-") Algorithmus,
41 # * Sortieren nach gesamter Zeile
42 # * mit dem Unix-Aufruf `sort -d`
47 def sortkey_wl(entry
):
48 # Sortieren nach gesamter Zeile
52 ersetzungen
= {ord(u
'ß'): u
'ss'} # ß -> ss
53 # Feldtrenner und Trennzeichen ignorieren (Simulation von `sort -d`)
54 for char
in u
';-·=|[]{}':
55 ersetzungen
[ord(char
)] = None
56 key
= key
.translate(ersetzungen
)
58 # Akzente/Umlaute weglassen:
59 key
= unicodedata
.normalize('NFKD', key
) # Akzente mit 2-Zeichen-Kombi
60 key
= key
.encode('ascii', 'ignore') # ignoriere nicht-ASCII Zeichen
61 # Großschreibung ignorieren
67 # Aufruf von der Kommandozeile
68 # ============================
72 if __name__
== '__main__':
76 parser
= optparse
.OptionParser(usage
=usage
)
77 parser
.add_option('-o', '--outfile', dest
='patchfile',
78 help='Ausgangsdatei (Patch), Vorgabe "wortliste-sortiert.patch"',
79 default
='wortliste-sortiert.patch')
80 parser
.add_option('-a', '--legacy-sort', action
="store_true",
81 help='alternative (obsolete) Sortierordnung',
83 parser
.add_option('-d', '--dump', action
="store_true", default
=False,
84 help='Schreibe die sortierte Liste '
85 'auf die Standardausgabe.')
87 (options
, args
) = parser
.parse_args()
89 # Achtung: bool(options.legacy_sort) ist immer True, daher nicht
90 # ``if options.legacy_sort: ...`` verwenden!
91 if options
.legacy_sort
is True:
94 sortkey
= sortkey_duden
96 # Einlesen in eine Liste::
98 eingangsdateiname
= ', '.join(arg
.replace('-', '<stdin>') for arg
in args
100 infiles
= [sys
.stdin
if arg
=='-' else open(arg
) for arg
in args
103 wortliste
= [WordEntry(line
.rstrip().decode('utf-8'))
104 for infile
in infiles
for line
in infile
]
105 # Notiz: verschachtelte Listen entflechten
106 # [i for lst in lsts for i in lst]
110 sortiert
= sorted(wortliste
, key
=sortkey
)
113 for line
in sortiert
:
114 print unicode(line
).encode('utf8')
117 patch
= udiff(wortliste
, sortiert
,
118 eingangsdateiname
, eingangsdateiname
+'-sortiert',
122 if options
.patchfile
:
123 patchfile
= open(options
.patchfile
, 'w')
124 patchfile
.write(patch
+ '\n')
126 print 'keine Änderungen'