summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeon Lackey <dlackey@redhat.com>2010-08-12 16:15:13 -0400
committerDeon Lackey <dlackey@redhat.com>2010-08-12 16:15:13 -0400
commit19d72db35b29f179c34c60aa4088cadf3eda880b (patch)
tree61c3f02ee784e7988f8dea221235bfaba0a5905c
parentdd7b81d015a27ca50351a8d09bff72d6b80f3488 (diff)
downloadrepo-19d72db35b29f179c34c60aa4088cadf3eda880b.tar.gz
repo-19d72db35b29f179c34c60aa4088cadf3eda880b.tar.xz
repo-19d72db35b29f179c34c60aa4088cadf3eda880b.zip
edits to make the varlist area work better
-rwxr-xr-xdocbook2nroff.py199
1 files 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"))