1
1
# Authors: David Goodger, Ueli Schlaepfer
2
2
# Contact: goodger@users.sourceforge.net
3
# Revision: $Revision: 1.24 $
4
# Date: $Date: 2004/05/04 00:38:15 $
3
# Revision: $Revision: 4183 $
4
# Date: $Date: 2005-12-12 05:12:02 +0100 (Mon, 12 Dec 2005) $
5
5
# Copyright: This module has been placed in the public domain.
32
32
default_priority = 820
35
header = self.generate_header()
36
footer = self.generate_footer()
38
decoration = nodes.decoration()
41
document = self.document
42
index = document.first_child_not_matching_class(
45
document += decoration
47
document[index:index] = [decoration]
35
header_nodes = self.generate_header()
37
decoration = self.document.get_decoration()
38
header = decoration.get_header()
39
header.extend(header_nodes)
40
footer_nodes = self.generate_footer()
42
decoration = self.document.get_decoration()
43
footer = decoration.get_footer()
44
footer.extend(footer_nodes)
49
46
def generate_header(self):
79
76
nodes.reference('', 'reStructuredText', refuri='http://'
80
77
'docutils.sourceforge.net/rst.html'),
81
78
nodes.Text(' source.\n')])
82
footer = nodes.footer()
83
footer += nodes.paragraph('', '', *text)
79
return [nodes.paragraph('', '', *text)]
84
class ExposeInternals(Transform):
87
Expose internal attributes if ``expose_internals`` setting is set.
90
default_priority = 840
92
def not_Text(self, node):
93
return not isinstance(node, nodes.Text)
96
if self.document.settings.expose_internals:
97
for node in self.document.traverse(self.not_Text):
98
for att in self.document.settings.expose_internals:
99
value = getattr(node, att, None)
100
if value is not None:
101
node['internal:' + att] = value
89
104
class Messages(Transform):
99
114
unfiltered = self.document.transform_messages
100
threshold = self.document.reporter['writer'].report_level
115
threshold = self.document.reporter.report_level
102
117
for msg in unfiltered:
103
118
if msg['level'] >= threshold and not msg.parent:
104
119
messages.append(msg)
106
section = nodes.section(CLASS='system-messages')
121
section = nodes.section(classes=['system-messages'])
107
122
# @@@ get this from the language module?
108
123
section += nodes.title('', 'Docutils System Messages')
109
124
section += messages
120
135
default_priority = 870
123
visitor = SystemMessageFilterVisitor(self.document)
124
self.document.walk(visitor)
127
class SystemMessageFilterVisitor(nodes.SparseNodeVisitor):
129
def unknown_visit(self, node):
132
def visit_system_message(self, node):
133
if node['level'] < self.document.reporter['writer'].report_level:
134
node.parent.remove(node)
138
for node in self.document.traverse(nodes.system_message):
139
if node['level'] < self.document.reporter.report_level:
140
node.parent.remove(node)
137
143
class TestMessages(Transform):
140
146
Append all post-parse system messages to the end of the document.
148
Used for testing purposes.
143
default_priority = 890
151
default_priority = 880
146
154
for msg in self.document.transform_messages:
148
156
self.document += msg
151
class FinalChecks(Transform):
154
Perform last-minute checks.
156
- Check for dangling references (incl. footnote & citation).
159
default_priority = 840
159
class StripComments(Transform):
162
Remove comment elements from the document tree (only if the
163
``strip_comments`` setting is enabled).
166
default_priority = 740
162
visitor = FinalCheckVisitor(
164
self.document.transformer.unknown_reference_resolvers)
165
self.document.walk(visitor)
166
if self.document.settings.expose_internals:
167
visitor = InternalAttributeExposer(self.document)
168
self.document.walk(visitor)
171
class FinalCheckVisitor(nodes.SparseNodeVisitor):
173
def __init__(self, document, unknown_reference_resolvers):
174
nodes.SparseNodeVisitor.__init__(self, document)
175
self.document = document
176
self.unknown_reference_resolvers = unknown_reference_resolvers
178
def unknown_visit(self, node):
181
def visit_reference(self, node):
182
if node.resolved or not node.hasattr('refname'):
184
refname = node['refname']
185
id = self.document.nameids.get(refname)
187
for resolver_function in self.unknown_reference_resolvers:
188
if resolver_function(node):
191
if self.document.nameids.has_key(refname):
192
msg = self.document.reporter.error(
193
'Duplicate target name, cannot be used as a unique '
194
'reference: "%s".' % (node['refname']), base_node=node)
196
msg = self.document.reporter.error(
197
'Unknown target name: "%s".' % (node['refname']),
199
msgid = self.document.set_id(msg)
200
prb = nodes.problematic(
201
node.rawsource, node.rawsource, refid=msgid)
202
prbid = self.document.set_id(prb)
203
msg.add_backref(prbid)
204
node.parent.replace(node, prb)
208
self.document.ids[id].referenced = 1
211
visit_footnote_reference = visit_citation_reference = visit_reference
214
class InternalAttributeExposer(nodes.GenericNodeVisitor):
216
def __init__(self, document):
217
nodes.GenericNodeVisitor.__init__(self, document)
218
self.internal_attributes = document.settings.expose_internals
220
def default_visit(self, node):
221
for att in self.internal_attributes:
222
value = getattr(node, att, None)
223
if value is not None:
224
node['internal:' + att] = value
169
if self.document.settings.strip_comments:
170
for node in self.document.traverse(nodes.comment):
171
node.parent.remove(node)