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])