Commit 74c3de6f authored by Amos Latteier's avatar Amos Latteier

Updated docbook coverage to allow StructuredText to work. No more KeyErrors...

Updated docbook coverage to allow StructuredText to work. No more KeyErrors upon importing StructuredText. Also updated it to work with the current DocumentClass.py and with docbook 4.1.
parent 4ac681d1
...@@ -88,238 +88,245 @@ from string import join, split, find, lstrip ...@@ -88,238 +88,245 @@ from string import join, split, find, lstrip
class DocBookClass: class DocBookClass:
element_types={ element_types={
'#text': '_text', '#text': '_text',
'StructuredTextDocument': 'document', 'StructuredTextDocument': 'document',
'StructuredTextParagraph': 'paragraph', 'StructuredTextParagraph': 'paragraph',
'StructuredTextExample': 'example', 'StructuredTextExample': 'example',
'StructuredTextBullet': 'bullet', 'StructuredTextBullet': 'bullet',
'StructuredTextNumbered': 'numbered', 'StructuredTextNumbered': 'numbered',
'StructuredTextDescription': 'description', 'StructuredTextDescription': 'description',
'StructuredTextDescriptionTitle': 'descriptionTitle', 'StructuredTextDescriptionTitle': 'descriptionTitle',
'StructuredTextDescriptionBody': 'descriptionBody', 'StructuredTextDescriptionBody': 'descriptionBody',
'StructuredTextSection': 'section', 'StructuredTextSection': 'section',
'StructuredTextSectionTitle': 'sectionTitle', 'StructuredTextSectionTitle': 'sectionTitle',
'StructuredTextLiteral': 'literal', 'StructuredTextLiteral': 'literal',
'StructuredTextEmphasis': 'emphasis', 'StructuredTextEmphasis': 'emphasis',
'StructuredTextStrong': 'strong', 'StructuredTextStrong': 'strong',
'StructuredTextLink': 'link', 'StructuredTextLink': 'link',
'StructuredTextXref': 'xref', 'StructuredTextXref': 'xref',
} 'StructuredTextSGML': 'sgml',
}
def dispatch(self, doc, level, output):
getattr(self, self.element_types[doc.getNodeName()])(doc, level, output) def dispatch(self, doc, level, output):
getattr(self, self.element_types[doc.getNodeName()])(doc, level, output)
def __call__(self, doc, level=1):
r=[] def __call__(self, doc, level=1):
self.dispatch(doc, level-1, r.append) r=[]
return join(r,'') self.dispatch(doc, level-1, r.append)
return join(r,'')
def _text(self, doc, level, output):
if doc.getNodeName() == 'StructuredTextLiteral': def _text(self, doc, level, output):
output(doc.getNodeValue()) if doc.getNodeName() == 'StructuredTextLiteral':
else: output(doc.getNodeValue())
output(lstrip(doc.getNodeValue())) else:
output(lstrip(doc.getNodeValue()))
def document(self, doc, level, output):
output('<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n') def document(self, doc, level, output):
output('<book>\n') output('<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN">\n')
children=doc.getChildNodes() output('<book>\n')
if (children and children=doc.getChildNodes()
children[0].getNodeName() == 'StructuredTextSection'): if (children and
output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue()) children[0].getNodeName() == 'StructuredTextSection'):
for c in children: output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
for c in children:
getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</book>\n')
def section(self, doc, level, output):
output('\n<section>\n')
children=doc.getChildNodes()
for c in children:
getattr(self, self.element_types[c.getNodeName()])(c, level+1, output)
output('\n</section>\n')
def sectionTitle(self, doc, level, output):
output('<title>')
for c in doc.getChildNodes():
try:
getattr(self, self.element_types[c.getNodeName()])(c, level, output) getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</book>\n') except:
print "failed", c.getNodeName(), c
def section(self, doc, level, output): output('</title>\n')
output('\n<sect%s>\n' % (level + 1))
children=doc.getChildNodes() def description(self, doc, level, output):
for c in children: p=doc.getPreviousSibling()
getattr(self, self.element_types[c.getNodeName()])(c, level+1, output) if p is None or p.getNodeName() is not doc.getNodeName():
output('\n</sect%s>\n' % (level + 1)) output('<variablelist>\n')
for c in doc.getChildNodes():
def sectionTitle(self, doc, level, output): getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('<title>') n=doc.getNextSibling()
for c in doc.getChildNodes(): if n is None or n.getNodeName() is not doc.getNodeName():
getattr(self, self.element_types[c.getNodeName()])(c, level, output) output('</variablelist>\n')
output('</title>\n')
def descriptionTitle(self, doc, level, output):
def description(self, doc, level, output): output('<varlistentry><term>\n')
p=doc.getPreviousSibling() for c in doc.getChildNodes():
if p is None or p.getNodeName() is not doc.getNodeName(): getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('<variablelist>\n') output('</term>\n')
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output) def descriptionBody(self, doc, level, output):
n=doc.getNextSibling() output('<listitem><para>\n')
if n is None or n.getNodeName() is not doc.getNodeName(): for c in doc.getChildNodes():
output('</variablelist>\n') getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</para></listitem>\n')
def descriptionTitle(self, doc, level, output): output('</varlistentry>\n')
output('<varlistentry><term>\n')
for c in doc.getChildNodes(): def bullet(self, doc, level, output):
getattr(self, self.element_types[c.getNodeName()])(c, level, output) p=doc.getPreviousSibling()
output('</term>\n') if p is None or p.getNodeName() is not doc.getNodeName():
output('<itemizedlist>\n')
def descriptionBody(self, doc, level, output): output('<listitem><para>\n')
output('<listitem><para>\n')
for c in doc.getChildNodes(): for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output) getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</para></listitem>\n') n=doc.getNextSibling()
output('</varlistentry>\n') output('</para></listitem>\n')
if n is None or n.getNodeName() is not doc.getNodeName():
output('</itemizedlist>\n')
def numbered(self, doc, level, output):
p=doc.getPreviousSibling()
if p is None or p.getNodeName() is not doc.getNodeName():
output('<orderedlist>\n')
output('<listitem><para>\n')
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output)
n=doc.getNextSibling()
output('</para></listitem>\n')
if n is None or n.getNodeName() is not doc.getNodeName():
output('</orderedlist>\n')
def example(self, doc, level, output):
i=0
for c in doc.getChildNodes():
if i==0:
output('<programlisting>\n<![CDATA[\n')
##
## eek. A ']]>' in your body will break this...
##
output(prestrip(c.getNodeValue()))
output('\n]]></programlisting>\n')
else:
getattr(self, self.element_types[c.getNodeName()])(
c, level, output)
def paragraph(self, doc, level, output):
output('<para>\n\n')
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(
c, level, output)
output('</para>\n\n')
def link(self, doc, level, output):
output('<ulink url="%s">' % doc.href)
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</ulink>')
def bullet(self, doc, level, output): def emphasis(self, doc, level, output):
p=doc.getPreviousSibling() output('<emphasis>')
if p is None or p.getNodeName() is not doc.getNodeName(): for c in doc.getChildNodes():
output('<itemizedlist>\n') getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('<listitem><para>\n') output('</emphasis> ')
for c in doc.getChildNodes(): def literal(self, doc, level, output):
getattr(self, self.element_types[c.getNodeName()])(c, level, output) output('<literal>')
n=doc.getNextSibling() for c in doc.getChildNodes():
output('</para></listitem>\n') output(c.getNodeValue())
if n is None or n.getNodeName() is not doc.getNodeName(): output('</literal>')
output('</itemizedlist>\n')
def numbered(self, doc, level, output):
p=doc.getPreviousSibling()
if p is None or p.getNodeName() is not doc.getNodeName():
output('<orderedlist>\n')
output('<listitem><para>\n')
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output)
n=doc.getNextSibling()
output('</para></listitem>\n')
if n is None or n.getNodeName() is not doc.getNodeName():
output('</orderedlist>\n')
def example(self, doc, level, output):
i=0
for c in doc.getChildNodes():
if i==0:
output('<programlisting>\n<![CDATA[\n')
##
## eek. A ']]>' in your body will break this...
##
output(prestrip(c.getNodeValue()))
output('\n]]></programlisting>\n')
else:
getattr(self, self.element_types[c.getNodeName()])(
c, level, output)
def paragraph(self, doc, level, output):
output('<para>\n\n')
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(
c, level, output)
output('</para>\n\n')
def link(self, doc, level, output):
# output('<link linkend="%s">' % doc.href)
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output)
# output('</link>')
def emphasis(self, doc, level, output): def strong(self, doc, level, output):
output('<emphasis>') output('<emphasis>')
for c in doc.getChildNodes(): for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output) getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</emphasis> ') output('</emphasis>')
def literal(self, doc, level, output): def xref(self, doc, level, output):
output('<literal>') output('<xref linkend="%s"/>' % doc.getNodeValue())
for c in doc.getChildNodes():
output(c.getNodeValue())
output('</literal>')
def strong(self, doc, level, output): def sgml(self, doc, level, output):
output('<emphasis>') output(doc.getNodeValue())
for c in doc.getChildNodes():
getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</emphasis>')
def xref(self, doc, level, output):
output('<xref linkend="%s">' % doc.getNodeValue())
def prestrip(v): def prestrip(v):
v=string.replace(v, '\r\n', '\n') v=string.replace(v, '\r\n', '\n')
v=string.replace(v, '\r', '\n') v=string.replace(v, '\r', '\n')
v=string.replace(v, '\t', ' ') v=string.replace(v, '\t', ' ')
lines=string.split(v, '\n') lines=string.split(v, '\n')
indent=len(lines[0]) indent=len(lines[0])
for line in lines: for line in lines:
if not len(line): continue if not len(line): continue
i=len(line)-len(string.lstrip(line)) i=len(line)-len(string.lstrip(line))
if i < indent: if i < indent:
indent=i indent=i
nlines=[] nlines=[]
for line in lines: for line in lines:
nlines.append(line[indent:]) nlines.append(line[indent:])
return string.join(nlines, '\r\n') return string.join(nlines, '\n')
class DocBookChapter(DocBookClass): class DocBookChapter(DocBookClass):
def document(self, doc, level, output): def document(self, doc, level, output):
output('<chapter>\n') output('<chapter>\n')
children=doc.getChildNodes() children=doc.getChildNodes()
if (children and if (children and
children[0].getNodeName() == 'StructuredTextSection'): children[0].getNodeName() == 'StructuredTextSection'):
output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue()) output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
for c in children[0].getChildNodes()[1:]: for c in children[0].getChildNodes()[1:]:
getattr(self, self.element_types[c.getNodeName()])(c, level, output) getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</chapter>\n') output('</chapter>\n')
ets = DocBookClass.element_types ets = DocBookClass.element_types
ets.update({'StructuredTextImage': 'image'}) ets.update({'StructuredTextImage': 'image'})
class DocBookChapterWithFigures(DocBookChapter): class DocBookChapterWithFigures(DocBookChapter):
element_types = ets element_types = ets
def image(self, doc, level, output): def image(self, doc, level, output):
if hasattr(doc, 'key'): if hasattr(doc, 'key'):
output('<figure id="%s"><title>%s</title>\n' % (doc.key, doc.getNodeValue()) ) output('<figure id="%s"><title>%s</title>\n' % (doc.key, doc.getNodeValue()) )
else: else:
output('<figure><title>%s</title>\n' % doc.getNodeValue()) output('<figure><title>%s</title>\n' % doc.getNodeValue())
## for c in doc.getChildNodes(): ## for c in doc.getChildNodes():
## getattr(self, self.element_types[c.getNodeName()])(c, level, output) ## getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('<graphic fileref="%s"></graphic>\n</figure>\n' % doc.href) output('<graphic fileref="%s"></graphic>\n</figure>\n' % doc.href)
class DocBookArticle(DocBookClass): class DocBookArticle(DocBookClass):
def document(self, doc, level, output): def document(self, doc, level, output):
output('<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n') output('<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">\n')
output('<article>\n') output('<article>\n')
children=doc.getChildNodes() children=doc.getChildNodes()
if (children and if (children and
children[0].getNodeName() == 'StructuredTextSection'): children[0].getNodeName() == 'StructuredTextSection'):
output('<artheader>\n<title>%s</title>\n</artheader>\n' % output('<articleinfo>\n<title>%s</title>\n</articleinfo>\n' %
children[0].getChildNodes()[0].getNodeValue()) children[0].getChildNodes()[0].getNodeValue())
for c in children: for c in children:
getattr(self, self.element_types[c.getNodeName()])(c, level, output) getattr(self, self.element_types[c.getNodeName()])(c, level, output)
output('</article>\n') output('</article>\n')
class DocBookBook: class DocBookBook:
def __init__(self, title=''): def __init__(self, title=''):
self.title = title self.title = title
self.chapters = [] self.chapters = []
def addChapter(self, chapter): def addChapter(self, chapter):
self.chapters.append(chapter) self.chapters.append(chapter)
def read(self): def read(self):
out = '<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n<book>\n' out = '<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN">\n<book>\n'
out = out + '<title>%s</title>\n' % self.title out = out + '<title>%s</title>\n' % self.title
for chapter in self.chapters: for chapter in self.chapters:
out = out + chapter + '\n</book>\n' out = out + chapter + '\n</book>\n'
return out return out
def __str__(self): def __str__(self):
return self.read() return self.read()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment