From 9567ee46885fb7c9c2ae7f4c68f3c75eae63da7f Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=BCnter=20Milde?= Date: Wed, 11 Apr 2018 20:58:43 +0200 Subject: [PATCH] Python-Skript Update Optimierung der Formatwandlung. Kleinere Korrekturen. --- skripte/python/edit_tools/abgleich_neueintraege.py | 17 +++--- skripte/python/edit_tools/wortliste.py | 68 ++++++++++++---------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/skripte/python/edit_tools/abgleich_neueintraege.py b/skripte/python/edit_tools/abgleich_neueintraege.py index 1843c39..79b02ad 100755 --- a/skripte/python/edit_tools/abgleich_neueintraege.py +++ b/skripte/python/edit_tools/abgleich_neueintraege.py @@ -792,6 +792,7 @@ def print_proposal(entry): else: print unicode(entry) + if __name__ == '__main__': # Pfad zu "../../../wortliste" unabhängig vom Arbeitsverzeichnis:: @@ -849,7 +850,7 @@ if __name__ == '__main__': # Umschreiben in Dictionary, Aussortieren von Abkürzungen words = dict() for entry in wordfile: - if not entry or u'Abk.' in entry.comment: + if u'Abk.' in entry.comment: continue words[entry[0]] = entry @@ -870,6 +871,7 @@ if __name__ == '__main__': words.pop(unwort, None) + # Erstellen der neuen Einträge:: neue = [] @@ -878,11 +880,11 @@ if __name__ == '__main__': proposals = [WordEntry(line.decode('utf8').strip()) for line in sys.stdin - if not line.startswith('#')] + if line.strip() and not line.startswith('#')] for newentry in proposals: OK = False - key = newentry[0] + key = newentry.key() # print key, unicode(newentry) # continue @@ -893,13 +895,8 @@ if __name__ == '__main__': if entry: neue.append(entry) continue - # kleingeschrieben - entry = words.get(key.lower()) - if entry: - neue_grossklein.append(entry) - continue - # Großgeschrieben - entry = words.get(key.title()) + # kleingeschrieben oder Großgeschrieben: + entry = words.get(key.lower()) or words.get(key.title()) if entry: neue_grossklein.append(entry) continue diff --git a/skripte/python/edit_tools/wortliste.py b/skripte/python/edit_tools/wortliste.py index 92e0cce..6da4971 100755 --- a/skripte/python/edit_tools/wortliste.py +++ b/skripte/python/edit_tools/wortliste.py @@ -1096,22 +1096,29 @@ class ShortEntry(WordEntry): # >>> print ShortEntry(abenddienste) # Abend=diens-te # +# Achtung: Ein Lang-Eintrag mit nur zwei Feldern kann unregelmäßig sein und +# daher im Kurzformat mehrere Felder benötigen (siehe Tests) # :: def __init__(self, line, delimiter=';', prune=True): - if type(line) == WordEntry: + if isinstance(line, WordEntry): self.comment = line.comment # Kommentar - self._key = line.key() # Schlüssel + self._key = line.getitem(0) # Schlüssel cachen self.append(line.getitem(3)) # Deutsch, aktuell (Reform 1996) self.append(line.getitem(2)) # "traditionell" (Reform 1901) - self.append(line.getitem(6)) # ohne ß (Schweiz oder versal) "aktuell" - self.append(line.getitem(5)) # ohne ß (Schweiz oder versal) "traditionell" - self.append(line.getitem(7)) # ohne ß (Schweiz) "traditionell" ("süssauer") - # Felder zusammenfassen + if len(line) > 4: + self.append(line.getitem(6)) # ohne ß (Schweiz oder versal) "aktuell" + self.append(line.getitem(5)) # ohne ß (Schweiz oder versal) "traditionell" + self.append(line.getitem(7)) # ohne ß (Schweiz) "traditionell" ("süssauer") + elif u'ß' in self._key: # auskreuzen + self.append(u'') + self.append(u'') + self.append(u'') else: WordEntry.__init__(self, line, delimiter) - if prune: + + if prune: # Felder zusammenfassen self.prune() # Tests @@ -2000,7 +2007,9 @@ def short2long(lines, sort=True, prune=True): entries = [] for line in lines: - for entry in ShortEntry(line).wordentries(prune=False): + shortentry = ShortEntry(line) + shortentry.complete() + for entry in shortentry.wordentries(prune=False): key = entry.key().lower() try: # Eintrag mit gleichem Schlüssel vorhanden? altentry = words[key] @@ -2117,10 +2126,9 @@ def long2short(lines, prune=True, drop_sz=False): for line in lines: longentry = WordEntry(line) entry = ShortEntry(longentry, prune=False) - key = entry._key.lower() # Schlüssel ohne Großschreibung + key = entry.key().lower() # Schlüssel ohne Großschreibung - # Einträge mit leerem ersten Feld für schnelleren Zugriff in - # `dictionary` sammeln (werden später einsortiert): + # Einträge mit leerem ersten Feld werden später einsortiert: if prune and not entry[0]: words_x[key] = entry continue @@ -2138,7 +2146,7 @@ def long2short(lines, prune=True, drop_sz=False): for entry in entries: # Auffüllen: - for i in (1, 2, 3, 4): + for i in range(1, len(entry)): if not entry[i]: # Feld ausgekreuzt key_i = join_word(entry.getitem(i, substitute=True)).lower() # print i, key_i @@ -2163,7 +2171,7 @@ def long2short(lines, prune=True, drop_sz=False): if key in words_merged: continue # ggf. ergänzen: - if not entry[3]: # de-1901-x-versal + if len(entry) > 2 and not entry[3]: # de-1901-x-versal key = join_word(entry.getitem(3, substitute=True)).lower() try: co_entry = words_x[key] @@ -2266,41 +2274,39 @@ def join_word(wort, assert_complete=False): # # :: - table = {} - for char in u'.=-<>': - table[ord(char)] = None - key = wort.translate(table) + for marker in u'=<>-.': + wort = wort.replace(marker, u'') # Spezielle Trennungen für die traditionelle Rechtschreibung # (siehe ../../dokumente/README.wortliste):: - if '{' in key or '}' in key: - key = key.replace(u'{ck/kk}', u'ck') - key = key.replace(u'{ck/k', u'k') - key = key.replace(u'k}', u'k') + if '{' in wort or '}' in wort: + wort = wort.replace(u'{ck/kk}', u'ck') + wort = wort.replace(u'{ck/k', u'k') + wort = wort.replace(u'k}', u'k') # Konsonanthäufungen an Wortfuge: '{xx/xxx}' -> 'xx': - key = re.sub(ur'\{(.)\1/\1\1\1\}', ur'\1\1', key) + wort = re.sub(ur'\{(.)\1/\1\1\1\}', ur'\1\1', wort) # schon getrennt: ('{xx/xx' -> 'xx' und 'x}' -> 'x'): - key = re.sub(ur'\{(.)\1/\1\1$', ur'\1\1', key) - key = re.sub(ur'^(.)\}', ur'\1', key) + wort = re.sub(ur'\{(.)\1/\1\1$', ur'\1\1', wort) + wort = re.sub(ur'^(.)\}', ur'\1', wort) # Trennstellen in doppeldeutigen Wörtern:: - if '[' in key or ']' in key: - key = re.sub(ur'\[(.*)/\1\]', ur'\1', key) + if '[' in wort or ']' in wort: + wort = re.sub(ur'\[(.*)/\1\]', ur'\1', wort) # schon getrennt: - key = re.sub(ur'\[([^/\[]+)$', ur'\1', key) - key = re.sub(ur'^([^/\]]+)\]', ur'\1', key) + wort = re.sub(ur'\[([^/\[]+)$', ur'\1', wort) + wort = re.sub(ur'^([^/\]]+)\]', ur'\1', wort) # Test auf verbliebene komplexe Trennstellen:: if assert_complete: for spez in u'[{/}]': - if spez in key: + if spez in wort: raise AssertionError('Spezialtrennung %s, %s' % - (wort.encode('utf8'), key.encode('utf8'))) + (wort.encode('utf8'), wort.encode('utf8'))) - return key + return wort # zerlege() # --------- -- 2.11.4.GIT