Nacharbeiten "Normalisierung".
[wortliste.git] / skripte / sort.py
blob13b9b7e361220de3428daa7e686752f57033a30c
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
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)
35 # sortkey_wl
36 # ----------
38 # Sortierschlüssel für den früher genutzten ("W.-Lemberg-") Algorithmus,
39 # d.h Emulation von:
41 # * Sortieren nach gesamter Zeile
42 # * mit dem Unix-Aufruf `sort -d`
43 # * und locale DE.
45 # ::
47 def sortkey_wl(entry):
48 # Sortieren nach gesamter Zeile
49 key = unicode(entry)
51 # Ersetzungen:
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
62 key = key.lower()
64 return key
67 # Aufruf von der Kommandozeile
68 # ============================
70 # ::
72 if __name__ == '__main__':
74 # Optionen:
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',
82 default=False)
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:
92 sortkey = sortkey_wl
93 else:
94 sortkey = sortkey_duden
96 # Einlesen in eine Liste::
98 eingangsdateiname = ', '.join(arg.replace('-', '<stdin>') for arg in args
99 ) or '<stdin>'
100 infiles = [sys.stdin if arg=='-' else open(arg) for arg in args
101 ] or [sys.stdin]
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]
108 # Sortieren::
110 sortiert = sorted(wortliste, key=sortkey)
112 if options.dump:
113 for line in sortiert:
114 print unicode(line).encode('utf8')
115 sys.exit()
117 patch = udiff(wortliste, sortiert,
118 eingangsdateiname, eingangsdateiname+'-sortiert',
119 encoding='utf-8')
120 if patch:
121 print patch
122 if options.patchfile:
123 patchfile = open(options.patchfile, 'w')
124 patchfile.write(patch + '\n')
125 else:
126 print 'keine Änderungen'