Lang-S-Konversion: Ausnahmeliste.
[wortliste.git] / skripte / sort.py
blob3e02e9cce76244c254eed34db17fb4ed54b0f816
1 #!/usr/bin/env python
2 # -*- coding: utf8 -*-
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)
7 # any later version.
8 # :Version: 0.2 (2012-03-16)
10 # sort.py
11 # *******
13 # ::
15 u"""
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.
23 """
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
34 # sortkey_wl
35 # ----------
37 # Sortierschlüssel für den früher genutzten ("W.-Lemberg-") Algorithmus,
38 # d.h Emulation von:
40 # * Sortieren nach gesamter Zeile
41 # * mit dem Unix-Aufruf `sort -d`
42 # * und locale DE.
44 # ::
46 def sortkey_wl(entry):
47 # Sortieren nach gesamter Zeile
48 key = unicode(entry)
50 # Ersetzungen:
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
61 key = key.lower()
63 return key
66 # Aufruf von der Kommandozeile
67 # ============================
69 # ::
71 if __name__ == '__main__':
73 # Optionen:
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',
81 default=False)
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:
90 sortkey = sortkey_wl
91 else:
92 sortkey = sortkey_duden
94 # Einlesen in eine Liste::
96 if args:
97 eingangsdateiname = args[0]
98 wordfile = WordFile(eingangsdateiname)
99 wortliste = list(wordfile)
100 else:
101 eingangsdateiname = 'stdin'
102 wortliste = [WordEntry(line.rstrip().decode('utf-8'))
103 for line in sys.stdin]
105 # Sortieren::
107 sortiert = sorted(wortliste, key=sortkey)
109 if options.dump:
110 for line in sortiert:
111 print unicode(line).encode('utf8')
112 sys.exit()
114 patch = udiff(wortliste, sortiert,
115 eingangsdateiname, eingangsdateiname+'-sortiert',
116 encoding='utf-8')
117 if patch:
118 print patch
119 if options.patchfile:
120 patchfile = open(options.patchfile, 'w')
121 patchfile.write(patch + '\n')
122 else:
123 print 'keine Änderungen'