| Home | Trees | Indices | Help |
|
|---|
|
|
1 #
2 # rst.py: ReStructuredText docstring parsing
3 # Edward Loper
4 #
5 # Created [06/28/03 02:52 AM]
6 # $Id: restructuredtext.py 1661 2007-11-07 12:59:34Z dvarrazzo $
7 #
8
9 """
10 Epydoc parser for ReStructuredText strings. ReStructuredText is the
11 standard markup language used by the Docutils project.
12 L{parse_docstring()} provides the primary interface to this module; it
13 returns a L{ParsedRstDocstring}, which supports all of the methods
14 defined by L{ParsedDocstring}.
15
16 L{ParsedRstDocstring} is basically just a L{ParsedDocstring} wrapper
17 for the C{docutils.nodes.document} class.
18
19 Creating C{ParsedRstDocstring}s
20 ===============================
21
22 C{ParsedRstDocstring}s are created by the C{parse_document} function,
23 using the C{docutils.core.publish_string()} method, with the following
24 helpers:
25
26 - An L{_EpydocReader} is used to capture all error messages as it
27 parses the docstring.
28 - A L{_DocumentPseudoWriter} is used to extract the document itself,
29 without actually writing any output. The document is saved for
30 further processing. The settings for the writer are copied from
31 C{docutils.writers.html4css1.Writer}, since those settings will
32 be used when we actually write the docstring to html.
33
34 Using C{ParsedRstDocstring}s
35 ============================
36
37 C{ParsedRstDocstring}s support all of the methods defined by
38 C{ParsedDocstring}; but only the following four methods have
39 non-default behavior:
40
41 - L{to_html()<ParsedRstDocstring.to_html>} uses an
42 L{_EpydocHTMLTranslator} to translate the C{ParsedRstDocstring}'s
43 document into an HTML segment.
44 - L{split_fields()<ParsedRstDocstring.split_fields>} uses a
45 L{_SplitFieldsTranslator} to divide the C{ParsedRstDocstring}'s
46 document into its main body and its fields. Special handling
47 is done to account for consolidated fields.
48 - L{summary()<ParsedRstDocstring.summary>} uses a
49 L{_SummaryExtractor} to extract the first sentence from
50 the C{ParsedRstDocstring}'s document.
51 - L{to_plaintext()<ParsedRstDocstring.to_plaintext>} uses
52 C{document.astext()} to convert the C{ParsedRstDocstring}'s
53 document to plaintext.
54
55 @todo: Add ParsedRstDocstring.to_latex()
56 @var CONSOLIDATED_FIELDS: A dictionary encoding the set of
57 'consolidated fields' that can be used. Each consolidated field is
58 marked by a single tag, and contains a single bulleted list, where
59 each list item starts with an identifier, marked as interpreted text
60 (C{`...`}). This module automatically splits these consolidated
61 fields into individual fields. The keys of C{CONSOLIDATED_FIELDS} are
62 the names of possible consolidated fields; and the values are the
63 names of the field tags that should be used for individual entries in
64 the list.
65 """
66 __docformat__ = 'epytext en'
67
68 # Imports
69 import re, os, os.path
70 from xml.dom.minidom import *
71
72 from docutils.core import publish_string
73 from docutils.writers import Writer
74 from docutils.writers.html4css1 import HTMLTranslator, Writer as HTMLWriter
75 from docutils.writers.latex2e import LaTeXTranslator, Writer as LaTeXWriter
76 from docutils.readers.standalone import Reader as StandaloneReader
77 from docutils.utils import new_document
78 from docutils.nodes import NodeVisitor, Text, SkipChildren
79 from docutils.nodes import SkipNode, TreeCopyVisitor
80 from docutils.frontend import OptionParser
81 from docutils.parsers.rst import directives, roles
82 import docutils.nodes
83 import docutils.transforms.frontmatter
84 import docutils.transforms
85 import docutils.utils
86
87 from epydoc.compat import * # Backwards compatibility
88 from epydoc.markup import *
89 from epydoc.apidoc import ModuleDoc, ClassDoc
90 from epydoc.docwriter.dotgraph import *
91 from epydoc.docwriter.xlink import ApiLinkReader
92 from epydoc.markup.doctest import doctest_to_html, doctest_to_latex, \
93 HTMLDoctestColorizer
94
95 #: A dictionary whose keys are the "consolidated fields" that are
96 #: recognized by epydoc; and whose values are the corresponding epydoc
97 #: field names that should be used for the individual fields.
98 CONSOLIDATED_FIELDS = {
99 'parameters': 'param',
100 'arguments': 'arg',
101 'exceptions': 'except',
102 'variables': 'var',
103 'ivariables': 'ivar',
104 'cvariables': 'cvar',
105 'groups': 'group',
106 'types': 'type',
107 'keywords': 'keyword',
108 }
109
110 #: A list of consolidated fields whose bodies may be specified using a
111 #: definition list, rather than a bulleted list. For these fields, the
112 #: 'classifier' for each term in the definition list is translated into
113 #: a @type field.
114 CONSOLIDATED_DEFLIST_FIELDS = ['param', 'arg', 'var', 'ivar', 'cvar', 'keyword']
115
117 """
118 Parse the given docstring, which is formatted using
119 ReStructuredText; and return a L{ParsedDocstring} representation
120 of its contents.
121 @param docstring: The docstring to parse
122 @type docstring: C{string}
123 @param errors: A list where any errors generated during parsing
124 will be stored.
125 @type errors: C{list} of L{ParseError}
126 @param options: Extra options. Unknown options are ignored.
127 Currently, no extra options are defined.
128 @rtype: L{ParsedDocstring}
129 """
130 writer = _DocumentPseudoWriter()
131 reader = _EpydocReader(errors) # Outputs errors to the list.
132 publish_string(docstring, writer=writer, reader=reader,
133 settings_overrides={'report_level':10000,
134 'halt_level':10000,
135 'warning_stream':None})
136 return ParsedRstDocstring(writer.document)
137
139 """A reporter that ignores all debug messages. This is used to
140 shave a couple seconds off of epydoc's run time, since docutils
141 isn't very fast about processing its own debug messages."""
143
145 """
146 An encoded version of a ReStructuredText docstring. The contents
147 of the docstring are encoded in the L{_document} instance
148 variable.
149
150 @ivar _document: A ReStructuredText document, encoding the
151 docstring.
152 @type _document: C{docutils.nodes.document}
153 """
155 """
156 @type document: C{docutils.nodes.document}
157 """
158 self._document = document
159
160 # The default document reporter and transformer are not
161 # pickle-able; so replace them with stubs that are.
162 document.reporter = OptimizedReporter(
163 document.reporter.source, 'SEVERE', 'SEVERE', '')
164 document.transformer = docutils.transforms.Transformer(document)
165
167 # Inherit docs
168 if errors is None: errors = []
169 visitor = _SplitFieldsTranslator(self._document, errors)
170 self._document.walk(visitor)
171 if len(self._document.children) > 0:
172 return self, visitor.fields
173 else:
174 return None, visitor.fields
175
177 # Inherit docs
178 visitor = _SummaryExtractor(self._document)
179 try: self._document.walk(visitor)
180 except docutils.nodes.NodeFound: pass
181 return visitor.summary, bool(visitor.other_docs)
182
183 # def concatenate(self, other):
184 # result = self._document.copy()
185 # for child in (self._document.get_children() +
186 # other._document.get_children()):
187 # visitor = TreeCopyVisitor(self._document)
188 # child.walkabout(visitor)
189 # result.append(visitor.get_tree_copy())
190 # return ParsedRstDocstring(result)
191
192 - def to_html(self, docstring_linker, directory=None,
193 docindex=None, context=None, **options):
194 # Inherit docs
195 visitor = _EpydocHTMLTranslator(self._document, docstring_linker,
196 directory, docindex, context)
197 self._document.walkabout(visitor)
198 return ''.join(visitor.body)
199
201 # Inherit docs
202 visitor = _EpydocLaTeXTranslator(self._document, docstring_linker)
203 self._document.walkabout(visitor)
204 return ''.join(visitor.body)
205
209
211
213 visitor = _TermsExtractor(self._document)
214 self._document.walkabout(visitor)
215 return visitor.terms
216
218 """
219 A reader that captures all errors that are generated by parsing,
220 and appends them to a list.
221 """
222 # Remove the DocInfo transform, to ensure that :author: fields are
223 # correctly handled. This needs to be handled differently
224 # depending on the version of docutils that's being used, because
225 # the default_transforms attribute was deprecated & replaced by
226 # get_transforms().
227 version = [int(v) for v in docutils.__version__.split('.')]
228 version += [ 0 ] * (3 - len(version))
229 if version < [0,4,0]:
230 default_transforms = list(ApiLinkReader.default_transforms)
231 try: default_transforms.remove(docutils.transforms.frontmatter.DocInfo)
232 except ValueError: pass
233 else:
235 return [t for t in ApiLinkReader.get_transforms(self)
236 if t != docutils.transforms.frontmatter.DocInfo]
237 del version
238
242
244 document = new_document(self.source.source_path, self.settings)
245 # Capture all warning messages.
246 document.reporter.attach_observer(self.report)
247 # These are used so we know how to encode warning messages:
248 self._encoding = document.reporter.encoding
249 self._error_handler = document.reporter.error_handler
250 # Return the new document.
251 return document
252
263
265 """
266 A pseudo-writer for the docutils framework, that can be used to
267 access the document itself. The output of C{_DocumentPseudoWriter}
268 is just an empty string; but after it has been used, the most
269 recently processed document is available as the instance variable
270 C{document}
271
272 @type document: C{docutils.nodes.document}
273 @ivar document: The most recently processed document.
274 """
278
281
283 """
284 A docutils node visitor that extracts the first sentence from
285 the first paragraph in a document.
286 """
291
293 self.summary = None
294
295 _SUMMARY_RE = re.compile(r'(\s*[\w\W]*?\.)(\s|$)')
297 if self.summary is not None:
298 # found a paragraph after the first one
299 self.other_docs = True
300 raise docutils.nodes.NodeFound('Found summary')
301
302 summary_pieces = []
303
304 # Extract the first sentence.
305 for child in node:
306 if isinstance(child, docutils.nodes.Text):
307 m = self._SUMMARY_RE.match(child.data)
308 if m:
309 summary_pieces.append(docutils.nodes.Text(m.group(1)))
310 other = child.data[m.end():]
311 if other and not other.isspace():
312 self.other_docs = True
313 break
314 summary_pieces.append(child)
315
316 summary_doc = self.document.copy() # shallow copy
317 summary_para = node.copy() # shallow copy
318 summary_doc[:] = [summary_para]
319 summary_para[:] = summary_pieces
320 self.summary = ParsedRstDocstring(summary_doc)
321
324
327
329 """
330 A docutils node visitor that extracts the terms from documentation.
331
332 Terms are created using the C{:term:} interpreted text role.
333 """
335 NodeVisitor.__init__(self, document)
336
337 self.terms = None
338 """
339 The terms currently found.
340 @type: C{list}
341 """
342
346
350
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):
def depart_emphasis(self, node):