##Das Format Format Folio Flat File (FFF) ist ein XML-ähnliches Textformat.
##Nach Durchsicht einiger Beispieldateien gehen wir davon aus,
##daß pro Artikel folgende Tags definiert sind und der entsprechende
##Inhalt dem öffnenden Tag folgt:
##<...:Titel> oder
##
##
##
##
##
##
## oder Absätze
##
##Außerdem gehen wir davon aus, daß folgende optionale Tags pro Artikel
##maximal einmal definiert sind und der entsprechende Inhalt dem öffnenden Tag
##folgt:
##
## Artikel ist für jeden zugänglich
## bzw. Schlagworte
## bzw. Untertitel
# -*- coding: cp1252 -*-
# by Alex Duesel, www.mandarine.tv
import sgmllib, string, re
class MyParser(sgmllib.SGMLParser):
def __init__(self):
sgmllib.SGMLParser.__init__(self)
self.result = ""
def handle_data(self, data):
if data:
self.result = data
def start_titel(self, attributes):
print "processing Titel..."
def end_titel(self):
print self.result
def start_jahrgang(self, attributes):
print "processing Jahr..."
def end_jahrgang(self):
print self.result
def start_seite(self, attributes):
print "processing Seite..."
def end_seite(self):
print self.result
def start_autor(self, attributes):
print "processing Autor..."
def end_autor(self):
print self.result
def start_rubrik(self, attributes):
print "processing Rubrik..."
def end_rubrik(self):
print self.result
def start_ausgabe(self, attributes):
print "processing Ausgabe..."
def end_ausgabe(self):
print self.result
def start_bemerkungen(self, attributes):
print "processing Bemerkungen..."
def end_bemerkungen(self):
print self.result
def do_frei(self):
print "processing freigabe JA"
def do_absatz(self, attrs):
print "processing Absatz:"
print ' '.join([v for k,v in attrs])
def do_schlagworte(self, attrs):
print "processing Schlagworte:"
print ' '.join([v for k,v in attrs])
def do_untertitel(self, attrs):
print "processing Untertitel:"
print ' '.join([v for k,v in attrs])
class SpecialCaseParser:
# Extrawuerste, wie dieses <...:Titel> Tag
def __init__(self):
self.scan_re = re.compile(r"(?:(?P<.*?\:Titel>))")
def _titel_handle(self, case):
print "processing Spezial Titel tag...."
print case.split(':')[0][1:]
def handle(self, match):
for type, hit in match.groupdict().items():
if hit:
return apply(getattr(self, '_' + type + '_handle'), (hit,))
else:
raise "Can't handle match " + `match`
def process(self, txt):
re.sub(self.scan_re, self.handle, txt)
TAG_MAP = {
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'',
'':'>'
}
def prepare_text(txt):
# falls das zu langsam wird, koennte alles mit regex
# statt SGMLParser realisiert werden, wie oben
for k in TAG_MAP.keys():
txt = txt.replace(k,TAG_MAP[k])
return txt
def process(s):
special = SpecialCaseParser()
special.process(s)
parser = MyParser()
parser.feed(s)
parser.close()
test_txt = '''
1991
2
54
J.R.R Tolkien
Abenteuer
schöne Geschichte
Der Herr der Ringe
1993
4
254
J.R.R Tolkien
Abenteuer Saga
sehr spannende Geschichte
'''
process(prepare_text(test_txt))