Wiki Aventurica:Werkzeuge/Bel2tab.py
aus Wiki Aventurica, dem DSA-Fanprojekt
Umwandlungsskript für Belohnungen für Abenteuer
Keiichi war so nett und hat eine Umwandlungsroutine entworfen, mit der einfach einzugebende Daten praktisch in eine Wiki-Tabelle umgewandelt werden können. Der Sourcecode liegt in Python vor.
#!/usr/bin/python # -*- coding: utf-8 -*- u"""Ad hoc übersetzer für das Wiki Aventurica ------------------------------------------ gedacht zur Übertragung der Daten von [[Belohnungen für Abenteuer]] in eine Tabelle von Keiichi ---- In eine Klasse umgesetzt von Alrik""" __version__='$Id: bel2tab.py,v 0.35 2005/05/10 09:40:00 Keiichi Exp $' import re, Tkinter from tkFileDialog import * from tkSimpleDialog import * class Belohnung2Wikitabelle: u"""Eine Ad-hoc-Übersetzerklasse, um einfacher zu editierende Daten in eine Wiki-Tabelle umzuformen""" def __init__(self, meister=None): pass # Einzelteile in Wiki-Tabellenzeile übertragen def __towiki(self, p1, p2, p3, p4, p5, design): if design==1: return u' |'+p1+'\n |'+p2+'\n |'+p3+'\n |'+p4+'\n |'+p5+'\n |-\n' else: return u'|'+p1+' ||'+p2+' ||'+p3+' ||'+p4+' ||'+p5+'\n|-\n' # Das eigentliche Programm def text2tab(self, text, design): outstring = u"""{{Achtung|Text=<center>Die Daten auf dieser Seite werden automatisch erzeugt.</center><br/> Bitte hier keine Änderungen durchführen, sondern stattdessen auf der Seite: [[Belohnungen für Abenteuer]]. Danke!}}\n\n""" # Tabellenanfang if design==1: outstring+=u'{| border=1\n !Abenteuer\n !Abenteuerpunkte\n !Geld\n !Erfahrung\n !Sonstiges\n |-\n' else: outstring+=u'{| border=1\n!Abenteuer !!Abenteuerpunkte !!Geld !!Erfahrung !!Sonstiges\n |-\n' ## Regelwerk, also eine Schablone herstellen, die dann auf den gesamten Text angewandt wird ## damit sind dann alle Textbestandteile dazwischen ausgeblendet # head variante 1, z.B. [[Der Inquisitor|E4 Der Inquisitor]] head1 = ('^\[\[.+\|(.+)\]\]') # head variante 2, z.B. [[Rückkehr der Finsternis]] 7GI.1 - [[Alptraum ohne Ende, 7GI]] head2 = ('^\[\[.+\]\].+\[\[(.+)\]\]') # Sind für beide Heads gleich rule2 = ('^\*Abenteuerpunkte:(.+)') rule3 = ('^\*Geld:(.+)') rule4 = ('^\*Erfahrung:(.+)') rule5 = ('^\*Sonstiges \(Waffen/Artefakte/etc\.\):(.+)') # Mit dieser Regel kommen die Regexps besser mit dem Wikilayout klar. Matcht entweder ein Newline oder alles mögliche bis zum nächsten Match flexrule = '(?:\n*?|[\s\S]*?)' # komplette Regel zusammenbauen crule1 = head1+flexrule+rule2+flexrule+rule3+flexrule+rule4+flexrule+rule5 crule2 = head2+flexrule+rule2+flexrule+rule3+flexrule+rule4+flexrule+rule5 crule = (crule1+'|'+crule2) # Regel compilieren und im text matchen, Problem: siehe oben p = re.compile(crule,re.MULTILINE) x = p.findall(text) # Fallunterscheidung für beide Heads. for i in x: if i[0]=='': outstring=outstring+self.__towiki(i[5],i[6],i[7],i[8],i[9], design) else: outstring=outstring+self.__towiki(i[0],i[1],i[2],i[3],i[4], design) #tabellenende if design==1: outstring+=u' ' outstring+=u'|}\n\n[[Kategorie:Listen]]' return outstring #zum Testen: if __name__=="__main__": fenster=Tkinter.Tk() design=askinteger(u"Design",u"""Wie soll das Design aussehen? Tabellenspalten zeilenweise darstellen (=1) oder alle Spalten in jeweils einer Zeile (=sonstige Zahl) ?""") quelldatei=u"Belohnung für Abenteuer.wiki.txt" quelldatei = askopenfilename(defaultextension='*.txt', filetypes=[('Alle Dateien','*.*'), ('Textdateien','*.txt'),('Wikidateien','*.wiki.txt')], initialfile=quelldatei) zieldatei=u'Belohnung für Abenteuer(Tabelle).wiki.txt' try: t=open(quelldatei,'r') except IOError: print u"Dateifehler, die Datei '%s' gibts vermutlich nicht. ->Abbruch" % quelldatei else: txt = t.read() t.close() b2t = Belohnung2Wikitabelle() try: vvv = b2t.text2tab(txt,design) except UnicodeDecodeError: ##ohne Fehlerabfrage hängt das Tk-Fenster abgestürzt herum print "Fehler: UnicodeDecodeError aufgetreten! Es wird CP1252 probiert..." txt=txt.decode("CP1252") try: vvv = b2t.text2tab(txt,design) except UnicodeDecodeError: ##ohne Fehlerabfrage hängt das Tk-Fenster abgestürzt herum print "Fehler: UnicodeDecodeError aufgetreten! Es wird CP1252 probiert..." else: print vvv zieldatei = asksaveasfile(defaultextension='*.txt', filetypes=[('Alle Dateien','*.*'), ('Textdateien','*.txt'),('Wikidateien','*.wiki.txt')], initialfile=zieldatei).name try: t=open(zieldatei,'w') except IOError: print u"Fehler: '%s' konnte nicht zum Schreiben geöffnet werden. ->Abbruch" % zieldatei else: t.write(vvv) t.flush() t.close() fenster.destroy()