From 19d72db35b29f179c34c60aa4088cadf3eda880b Mon Sep 17 00:00:00 2001 From: Deon Lackey Date: Thu, 12 Aug 2010 16:15:13 -0400 Subject: edits to make the varlist area work better --- docbook2nroff.py | 199 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 114 insertions(+), 85 deletions(-) diff --git a/docbook2nroff.py b/docbook2nroff.py index ae35773..7c379da 100755 --- a/docbook2nroff.py +++ b/docbook2nroff.py @@ -2,30 +2,80 @@ import sys from xml import sax -class Variable(object): - def __init__(self): - self.term = None - self.listitem = None +class Block(object): + pass - def __str__(self): - return "%s %s" % (self.term, self.listitem) - -class TextBlock(object): - def __init__(self, text = "", order = 0): +class BasicTextBlock(Block): + def __init__(self, text = ""): self.text = text - self.order = order def __str__(self): return self.text -class Para(TextBlock): +class Para(BasicTextBlock): def __str__(self): return "\n.PP\n" + self.text.lstrip() -class Code(TextBlock): +class Lpara(BasicTextBlock): + def __str__(self): + return "\n.IP\n" + self.text.lstrip() + +class ProgramListing(BasicTextBlock): def __str__(self): return "\n.nf\n%s\n.fi\n" % self.text.lstrip() +class ListItem(Block): + def __init__(self): + self.paras = [] + + def __str__(self): + ret = "" + for p in self.paras: + ret += str(p) + return ret + +class VariableList(Block): + def __init__(self): + self.entries = [] + + def __str__(self): + ret = "" + for p in self.entries: + ret += str(p) + return ret + +class Variable(Block): + def __init__(self): + self.term = None + self.listitem = None + + def __str__(self): + return "\n.TP \n.B %s\n%s\n" % (self.term, str(self.listitem)) + +class RefSection(Block): + def __init__(self, id): + self.id = id + self.title = None + self.elements = [] + + def first(self, vtype): + for o in self.elements: + if isinstance(o, vtype): + return o + return None + + def last(self, vtype): + for o in reversed(self.elements): + if isinstance(o, vtype): + return o + return None + + def __str__(self): + ret = ".SH %s \n" % self.title + for p in self.elements: + ret += str(p) + return ret + class DocBookToNroffHandler(sax.ContentHandler): def __init__(self, out=sys.stdout): ########################################################################################### @@ -37,11 +87,6 @@ class DocBookToNroffHandler(sax.ContentHandler): self.refmeta = {} self.refnamediv = {} self.synopsis = {} - self.refsection = {} - - self.mypara = None - self.myvar = None - self.myprogramlisting = None self.elementcount = 0 self.formatting = [] self.justformatted = False @@ -60,56 +105,66 @@ class DocBookToNroffHandler(sax.ContentHandler): ########################################################################################### #print >> self.out, "+" + name name = name.lower() - self.stack.insert(0, name) + self.stack.append(name) self.elementcount += 1 #print >> self.out, self.stack ########################################################################################### -# if name == "arg": -# attrs.get("choice") - if "refsection" == name: - self.refsection["id"] = attrs["id"] + self.refsection = RefSection(attrs["id"]) if "para" == name: - self.mypara = Para(order=self.elementcount) + if "listitem" in self.stack: + self.refsection.last(VariableList).entries[-1].listitem.paras.append(Lpara()) + elif "refsection" in self.stack: + self.refsection.elements.append(Para()) + + if "variablelist" == name: + self.refsection.elements.append(VariableList()) if "varlistentry" == name: - self.myvar = Variable() + self.refsection.last(VariableList).entries.append(Variable()) + + if "listitem" == name: + self.refsection.last(VariableList).entries[-1].listitem = ListItem() if "programlisting" == name: - self.myprogramlisting = Code(order=self.elementcount) + self.refsection.elements.append(ProgramListing()) if self.is_formatting(name): self.formatting.append(self.translate_formatting(name)) - def characters(self, content): + def characters(self, content): ########################################################################################### + name = self.stack[-1] #print >> self.out, content ########################################################################################### + #TODO this should always use += content instead of = content, in case content is incomplete + if "refentryinfo" in self.stack: - if "refentrytitle" in self.stack: + if "refentrytitle" == name: self.refentryinfo["refentrytitle"] = content - if "manvolnum" in self.stack: + if "manvolnum" == name: self.refentryinfo["manvolnum"] = content - if "productname" in self.stack: + if "productname" == name: self.refentryinfo["productname"] = content - if "date" in self.stack: + if "date" == name: self.refentryinfo["date"] = content - + elif "refmeta" in self.stack: - if "refmeta" in self.stack: + if "manvolnum" == name: self.refmeta["manvolnum"] = content - + elif "refnamediv" in self.stack: - if "refname" in self.stack: - self.refentryinfo["refname"] = content - if "refpurpose" in self.stack: - self.refentryinfo["refpurpose"] = content + if "refname" == name: + self.refnamediv["refname"] = content + if "refpurpose" == name: + self.refnamediv["refpurpose"] = content elif "cmdsynopsis" in self.stack: - if "command" in self.stack: + if "command" == name: self.synopsis["command"] = content + #don't check more explicitly, take all text content under the arg elif "arg" in self.stack: if not self.synopsis.has_key("args"): self.synopsis["args"] = [] @@ -117,31 +172,35 @@ class DocBookToNroffHandler(sax.ContentHandler): elif "refsection" in self.stack: if "title" in self.stack: - self.refsection["title"] = content + self.refsection.title = content elif "varlistentry" in self.stack: - if "term" in self.stack: - self.myvar.term = content + if "term" == name: + self.refsection.last(VariableList).entries[-1].term = content elif "listitem" in self.stack: - self.myvar.listitem = content + if "para" in self.stack: + self._add_formatted_text(self.refsection.last(VariableList).entries[-1].listitem.paras[-1], content) elif "programlisting" in self.stack: - self.myprogramlisting.text += content + self.refsection.last(ProgramListing).text += content elif "para" in self.stack: - if self.formatting: - self.mypara.text += "\n.%s %s\n" % ("".join(self.formatting), content) - self.justformatted = True - else: - if self.justformatted: - self.mypara.text += content.lstrip() - else: - self.mypara.text += content - self.justformatted = False + self._add_formatted_text(self.refsection.last(Para), content) + + def _add_formatted_text(self, mypara, content): + if self.formatting: + mypara.text += "\n.%s %s\n" % ("".join(self.formatting), content) + self.justformatted = True + else: + if self.justformatted: + mypara.text += content.lstrip() + else: + mypara.text += content + self.justformatted = False def endElement(self, name): ########################################################################################### #print >> self.out, "-" + name name = name.lower() - del self.stack[0] + self.stack.pop() #print >> self.out, self.stack ########################################################################################### @@ -149,48 +208,18 @@ class DocBookToNroffHandler(sax.ContentHandler): print >> self.out, ".TH %(refentrytitle)s %(manvolnum)s \"%(date)s\" \"USER COMMANDS\"" % self.refentryinfo if "refnamediv" == name: - print >> self.out, ".SH NAME \n %(refname)s \- %(refpurpose)s" % self.refentryinfo + print >> self.out, ".SH NAME \n %(refname)s \- %(refpurpose)s" % self.refnamediv if "cmdsynopsis" == name: self.synopsis["argcombo"] = " ".join(self.synopsis["args"]) print >> self.out, ".SH Synopsis \n.B %(command)s \n%(argcombo)s" % self.synopsis if "refsection" == name: - print >> self.out, ".SH %(title)s \n" % self.refsection - if self.refsection.has_key("varlist"): - for v in self.refsection["varlist"]: - print >> self.out, ".TP \n.B %s\n%s" % (v.term,v.listitem) - - if self.refsection.has_key("textblock"): - self.refsection["textblock"].sort(cmp = lambda a,b: a.order - b.order) - for p in self.refsection["textblock"]: - print >> self.out, str(p) - - self.refsection = {} - - if "varlistentry" == name: - if not self.refsection.has_key("varlist"): - self.refsection["varlist"] = [] - self.refsection["varlist"].append(self.myvar) - self.myvar = None - - if "programlisting" == name: - if not self.refsection.has_key("textblock"): - self.refsection["textblock"] = [] - self.refsection["textblock"].append(self.myprogramlisting) - self.myprogramlisting = None - - if "para" == name: - if not self.refsection.has_key("textblock"): - self.refsection["textblock"] = [] - self.refsection["textblock"].append(self.mypara) - self.mypara = None + print >> self.out, str(self.refsection) if self.is_formatting(name): self.formatting.pop() - - parser = sax.make_parser() parser.setContentHandler(DocBookToNroffHandler()) parser.parse(open(sys.argv[1], "r")) -- cgit