1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
from lxml import etree
from docutils.io import DocTreeInput, StringOutput
from docutils.utils import new_document
from docutils.core import Publisher
from docutils.readers.doctree import Reader as DoctreeReader
from docutils import nodes, writers
from sphinx.util.pycompat import b
XML_HEAD = u"""<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "../dtd/map.dtd">
"""
def render_map(builder, node):
if node:
doc = new_document(b('<partial node>'))
doc.append(node)
publisher = Publisher( source_class = DocTreeInput, destination_class=StringOutput)
publisher.set_components('standalone', 'restructuredtext', 'pseudoxml')
publisher.reader = DoctreeReader()
publisher.writer = DitaMapWriter(builder)
publisher.process_programmatic_settings(None, {'output_encoding': 'utf-8'}, None)
publisher.set_source(doc, None)
publisher.set_destination(None, None)
publisher.publish()
return publisher.writer.output
output = XML_HEAD
output += u"<map></map>"
return output
class DitaMapWriter(writers.Writer):
def __init__(self, builder):
writers.Writer.__init__(self)
self.builder = builder
def translate(self):
visitor = DitaMapTranslator(self.document, self.builder)
self.document.walkabout(visitor)
self.output = XML_HEAD
self.output += visitor.body
class DitaMapTranslator(nodes.NodeVisitor):
def __init__(self, document, builder):
nodes.NodeVisitor.__init__(self, document)
self.builder = builder
self.root = None
self.node = None
self.parent = None
def visit_document(self, node):
self.root = self.node = self.parent = etree.Element('map')
def depart_document(self, node):
self.body = etree.tostring(self.root, pretty_print=True)
def visit_Text(self, node):
pass
def depart_Text(self, node):
pass
def visit_paragraph(self, node):
pass
def depart_paragraph(self, node):
pass
def visit_compound(self, node):
pass
def depart_compound(self, node):
pass
def visit_compact_paragraph(self, node):
pass
def depart_compact_paragraph(self, node):
pass
def visit_bullet_list(self, node):
if self.node != None:
self.parent = self.node
def depart_bullet_list(self, node):
if self.parent != None:
self.parent = self.parent.getparent()
def visit_list_item(self, node):
pass
def depart_list_item(self, node):
pass
def visit_reference(self, node):
if node.get('anchorname') == '':
self.node = etree.SubElement(self.parent, 'topicref', {'href':node.get('refuri')})
def depart_reference(self, node):
pass
|