#! /usr/local/bin/python # treepad.py import sys, os, re, string # # constants # VERSION = "" # # regexes # END_RE = re.compile(r'^ ([^ ]+)$') class Node: def __init__(self): self.title = "" self.level = 0 self.article = [] self.children = [] self.parent = None self.end = "" def __str__(self): return "%s/%d" % (self.title, self.level) def addchild(self, node): assert self.level == node.level-1 and node.parent is None node.parent = self self.children.append( node ) def findparent(self, node): if self.level == (node.level-1): return self return self.parent.findparent(node) def writenode(self, fp): fp.write("dt=Text\n") fp.write("\n") fp.write("%s\n" % self.title) fp.write("%s\n" % self.level) for line in self.article: fp.write("%s\n" % line) fp.write(" %s\n" % self.end) def writetree(self, fp): self.writenode(fp) for node in self.children: node.writetree(fp) class NodeReader: def __init__(self, fname, fp): self.fname = fname self.fp = fp def expect(self, text, line=None): if line is None: line = self.fp.readline().strip() assert line == text, "expected " + line + " == " + text def readstart(self): self.expect(VERSION) def readnode(self): line = self.fp.readline() if line is None: return None line = line.strip() if len(line) < 1: return None self.expect("dt=Text", line) self.expect("") node = Node() node.title = self.fp.readline().strip() node.level = int(self.fp.readline().strip()) while 1: line = self.fp.readline() m = re.match(END_RE, line) if m: node.end = m.group(1).strip() break node.article.append( line.strip() ) return node class TreeReader: def __init__(self, fname, fp=None): if fp is None: fp = open(fname, 'r') self.nodereader = NodeReader(fname, fp) self.root = None self.prev = None def add(self, node): if self.prev is None: assert node.level == 0 self.root = node else: assert node.level > 0 parent = self.prev.findparent(node) parent.addchild( node ) self.prev = node def read(self): self.nodereader.readstart() prev = None while 1: node = self.nodereader.readnode() if node is None: break self.add(node) class TreeWriter: def __init__(self, fname, fp=None): if fp is None: fp = open(fname, 'w') self.fname = fname self.fp = fp def write(self, root): self.fp.write("%s\n" % VERSION) root.writetree(self.fp) # Main # class Main: def __init__(self): self.infile = sys.argv[1] self.outfile = sys.argv[2] self.reader = TreeReader(self.infile) self.writer = TreeWriter(self.outfile) def Run(self): self.reader.read() self.writer.write( self.reader.root ) if __name__ == '__main__': Main().Run()