import cStringIO, cgi, sys, urllib
import docutils.core, docutils.io
from docutils import writers, nodes, languages
class Writer(writers.Writer):
settings_spec = ()
settings_default_overrides = {}
output = None
def translate(self):
visitor = DumbPythonPointFormatter(self.document)
self.document.walkabout(visitor)
self.output = visitor.astext()
#self.head_prefix = visitor.head_prefix
#self.head = visitor.head
#self.body_prefix = visitor.body_prefix
#self.body = visitor.body
#self.body_suffix = visitor.body_suffix
class DumbPythonPointFormatter(nodes.NodeVisitor):
def __init__(self, document):
nodes.NodeVisitor.__init__(self, document)
self.section = 0
self.closers = []
self.slidenum = 0
self.body = []
self.w = self.body.append
self.suppress_para = 0
def astext(self):
return ''.join(self.body)
def visit_reference(self, node):
pass
def depart_reference(self, node):
pass
def visit_document(self, node):
self.w('\n'
'\n'
'\n')
def depart_document(self, node):
self.w('\n'
'\n')
def visit_section(self, node):
if node['names']:
name = node.attributes['names'][0]
else:
name = node.attributes['dupnames'][0]
self.slidenum += 1
self.w('\n'
'\n'%(self.slidenum, name))
def depart_section(self, node):
self.w('\n\n')
def visit_title(self, node):
self.w('')
self.suppress_para = 1
def depart_title(self, node):
self.suppress_para = 0
self.w('\n')
def visit_paragraph(self, node):
if not self.suppress_para: self.w('')
def depart_paragraph(self, node):
if not self.suppress_para: self.w('\n')
# Simple lists
def visit_bullet_list(self, node):
pass
def depart_bullet_list(self, node):
pass
def visit_enumerated_list(self, node):
pass
def depart_enumerated_list(self, node):
pass
def visit_list_item(self, node):
self.w('')
self.suppress_para = 1
def depart_list_item(self, node):
self.suppress_para = 0
self.w('\n')
# Definition List
def visit_definition_list(self, node):
pass
def depart_definition_list(self, node):
pass
def visit_definition_list_item(self, node):
pass
def depart_definition_list_item(self, node):
pass
def visit_term(self, node):
self.w('')
def depart_term(self, node):
self.w('')
def visit_classifier(self, node):
self.w('')
def depart_classifier(self, node):
self.w('')
def visit_definition(self, node):
self.w('\n')
self.suppress_para = 1
def depart_definition(self, node):
self.suppress_para = 0
self.w('\n')
def visit_field(self, node):
self.w('')
def depart_field(self, node):
self.w('\n')
def visit_field_body(self, node):
self.suppress_para = 1
return
def depart_field_body(self, node):
self.suppress_para = 0
def visit_field_list(self, node):
return
def depart_field_list(self, node):
return
def visit_field_name(self, node):
self.w('')
def depart_field_name(self, node):
self.w(':')
self.w('')
# Literal Block
def visit_literal_block(self, node):
self.w('')
self.suppress_para = 1
def depart_literal_block(self, node):
self.suppress_para = 0
self.w('\n')
# Block Quote
def visit_block_quote(self, node):
self.w('')
def depart_block_quote(self, node):
self.w('\n')
def visit_image(self, node):
''' EMPTY
uri CDATA #REQUIRED
alt CDATA #IMPLIED
height NMTOKEN #IMPLIED
width NMTOKEN #IMPLIED
scale NMTOKEN #IMPLIED
'''
attrs = node.attributes
l = ['src="%(uri)s"'%attrs]
# TODO: scale
self.w(''%node.attributes['uri'])
def depart_image(self, node):
pass
#
# Tables:
# NOT IN DOM YET
#
def visit_table(self, node):
'''
+------------------------+------------+----------+----------+
| Header row, column 1 | Header 2 | Header 3 | Header 4 |
| (header rows optional) | | | |
+========================+============+==========+==========+
| body row 1, column 1 | column 2 | column 3 | column 4 |
+------------------------+------------+----------+----------+
| body row 2 | Cells may span columns. |
+------------------------+------------+---------------------+
| body row 3 | Cells may | - Table cells |
+------------------------+ span rows. | - contain |
| body row 4 | | - body elements. |
+------------------------+------------+---------------------+
'''
self.w('
\n')
def depart_table(self, node):
self.w('
\n')
def visit_tgroup(self, node):
pass
def depart_tgroup(self, node):
pass
def visit_colspec(self, node):
pass
def depart_colspec(self, node):
pass
def visit_row(self, node):
self.body.append(self.starttag(node, 'tr', ''))
def depart_row(self, node):
self.body.append('\n')
def visit_thead(self, node):
self.thead = 1
def depart_thead(self, node):
self.thead = 0
def visit_tbody(self, node):
self.thead = 1
def depart_tbody(self, node):
self.thead = 0
def visit_entry(self, node):
if self.thead:
s = 'th '
else:
s = 'td '
attrs = node.attributes
if attrs.has_key('morecols'):
s = s + 'colspan=%d '%(attrs['morecols']+1)
if attrs.has_key('morerows'):
s = s + 'rowspan=%d '%(attrs['morerows']+1)
self.w('<%svalign="top" align="left">'%s)
def depart_entry(self, node):
if self.thead:
self.w('\n')
else:
self.w('\n')
def visit_emphasis(self, node):
self.w('')
def depart_emphasis(self, node):
self.w('')
def visit_strong(self, node):
self.w('')
def depart_strong(self, node):
self.w('')
def visit_interpreted(self, node):
pass #raise NotImplementedError, node
def depart_interpreted(self, node):
pass #raise NotImplementedError, node
def visit_literal(self, node):
self.w('')
def depart_literal(self, node):
self.w('
')
def visit_reference(self, node):
attrs = node.attributes
doc = self.document
ok = 1
if attrs.has_key('refuri'):
self.w(''%attrs['refuri'])
elif doc.explicit_targets.has_key(attrs['refname']):
# an external reference has been defined
ref = doc.explicit_targets[attrs['refname']]
if ref.attributes.has_key('refuri'):
self.w(''%ref.attributes['refuri'])
else:
self.w(''%attrs['refname'])
elif doc.implicit_targets.has_key(attrs['refname']):
# internal reference
name = attrs['refname']
self.w(''%urllib.quote(name))
else:
self.w('target "%s" '
'undefined'%attrs['refname'])
def depart_reference(self, node):
self.w('')
def visit_footnote_reference(self, node):
raise NotImplementedError, node
def visit_substitution_reference(self, node):
pass
def depart_substitution_reference(self, node):
pass
def visit_problematic(self, node):
raise NotImplementedError, node
def depart_problematic(self, node):
raise NotImplementedError, node
def visit_system_message(self, node):
print >>sys.stderr, '%s: %s'%(node.attributes['type'], node[0][0].data)
def depart_system_message(self, node):
pass
def visit_comment(self, node):
pass
def depart_comment(self, node):
pass
def visit_Text(self, node):
self.w(cgi.escape(node.data))
def depart_Text(self, node):
pass
def main(filename, debug=0):
pub = docutils.core.Publisher()
pub.set_reader('standalone', None, 'restructuredtext')
pub.writer = Writer()
pub.get_settings()
pub.settings._destination = ''
pub.source = docutils.io.StringInput(source=open(filename).read(),
encoding='latin-1')
pub.destination = docutils.io.StringOutput(encoding='latin-1')
document = pub.reader.read(pub.source, pub.parser, pub.settings)
pub.apply_transforms(document)
if debug == 1:
print document.pformat()
else:
print pub.writer.write(document, pub.destination)
if __name__ == '__main__':
if len(sys.argv) > 2:
main(sys.argv[1], debug=1)
else:
main(sys.argv[1])