Wiki Aventurica:Werkzeuge/Bel2tab.py

aus Wiki Aventurica, dem DSA-Fanprojekt
Version vom 31. Mai 2006, 16:40 Uhr von AlrikOhnegrund (Diskussion | Beiträge) (verschoben)
(Unterschied) ← Nächstältere Version | Zeige aktuelle Version an (Unterschied) | Nächstjüngere Version → (Unterschied)

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()