import sys class Node(object): pass class Frag(Node, list): def __init__(self, *content): list.__init__(self) for child in content: if isinstance(child, Frag): list.extend(self, child) list.append(self, child) def convert(self, converter): node = self.__class__() for child in self: child = child.convert(converter) node.append(child) return node class el(Node): class Attrs(Node, dict): pass def __init__(self, *content): self.attrs = self.Attrs() self.content = Frag(*content) def append(self, item): self.content.append(item) def convert(self, converter): node = self.__class__() node.content = self.content.convert(converter) return node class StaticPage: def __init__(self, name, *children): self.children = children def __getitem__(self, index): return self.get(index) def get(self, index): return self.children[index] def __len__(self): return len(self.children) class XISTPage(StaticPage): def get(self, index): if index==StaticPage.__len__(self): pass else: return StaticPage.get(self, index) pages = XISTPage("Python", XISTPage("CVS")) class page(el): empty = False def line(self, type): e = el() e2 = el() e2.append(el(el(el()))) e.append(e2) return e def links(self): e = el() for page in pages: e.append(self.line("child")) return e def convert(self, converter): c = el(el(el(self.links()))) e = el(el(el(), el(c))) e = Frag(e) return e.convert(converter) def execute(): node = page() node = node.convert(None) execute()