TurboXML
Verfasst: Donnerstag 6. September 2007, 21:22
noch nie hats sowiel spass gemacht XML dateien zu schreiben:
Code: Alles auswählen
class TurboXML(object):
def __init__(self):
self.last_tags = []
self.data = ''
self.complete_tag = False
def _mtc(self):#_manage_tag_completeation
if self.complete_tag == None: #with a slash
return ' />'
elif self.complete_tag == True:
return '>'
elif self.complete_tag == False:
return ''
assert False
def exe(self, cmd):
if cmd.startswith('end'):
if not self.last_tags:
raise NameError, 'all tags are already closed'
elif len(cmd) > 3 and cmd[3:] != self.last_tags[-1]:
raise ValueError, 'closing the tag "%s" would result in invalid XML' % cmd[3:]
self.data += '%s</%s>' % (self._mtc(), self.last_tags.pop())
self.complete_tag = False
elif cmd.endswith("_"):
self.data += "%s<%s" % (self._mtc(), cmd[:-1])
self.complete_tag = None #with a slash
return self
else:
self.data += "%s<%s" % (self._mtc(), cmd)
self.complete_tag = True
self.last_tags.append(cmd)
return self
return self
def __getattr__(self, attr):
return self.exe(attr)
def __call__(self, text=None, **args):
if text == None:
#fuegt die argumente hinzu
self.data += " %s%s" % (' '.join(['%s="%s"'%(key, value.__str__()) for key, value in args.iteritems()]), self._mtc())
self.complete_tag = False #sollte schon so True sein
return self
else:
#schreiben
self.data += '%s%s' % (self._mtc(), text) #evtl escape html
self.complete_tag = False
return self
def __str__(self):
return self.data + self._mtc()
if __name__ == "__main__":
page = TurboXML()
page.html.head.title('helo world').end.endhead.body(bgcolor='red')
[getattr(page, 'h'+str(i+1))('halo welt in schriftgroesse ' + str(i+1)).end.br_('\n') for i in range(7)]
page.endbody.endhtml
print page
#=====output
#<html><head><title>helo world</title></head><body bgcolor="red"><h0>halo welt in schriftgroesse 0</h0><br />
#<h1>halo welt in schriftgroesse 1</h1><br />
#<h2>halo welt in schriftgroesse 2</h2><br />
#<h3>halo welt in schriftgroesse 3</h3><br />
#<h4>halo welt in schriftgroesse 4</h4><br />
#<h5>halo welt in schriftgroesse 5</h5><br />
#<h6>halo welt in schriftgroesse 6</h6><br />
#<h7>halo welt in schriftgroesse 7</h7><br />
#</body></html>