Thread: [Epydoc-commits] SF.net SVN: epydoc: [1748] trunk/epydoc/src/epydoc (Page 3)
Brought to you by:
edloper
From: <ed...@us...> - 2008-02-23 06:59:21
|
Revision: 1748 http://epydoc.svn.sourceforge.net/epydoc/?rev=1748&view=rev Author: edloper Date: 2008-02-22 22:59:20 -0800 (Fri, 22 Feb 2008) Log Message: ----------- - Added dotgraph support to epytext's latex output - Added dotgraph support to rst's latex output - DotGrah.to_latex() now writes both the .eps and the .pdf file (no language switch) - Fixed bug in dotgraph when context=None - Fixed bug in dotgraph in call to mk_valdoc_node - Fixed bug in epytext in graph raising Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py trunk/epydoc/src/epydoc/docwriter/latex.py trunk/epydoc/src/epydoc/markup/epytext.py trunk/epydoc/src/epydoc/markup/restructuredtext.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 06:01:41 UTC (rev 1747) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 06:59:20 UTC (rev 1748) @@ -130,25 +130,26 @@ self.uid = '%s_%s' % (self.uid, n) self._uids.add(self.uid) - def to_latex(self, image_file, language='ps', center=True): - # Write the image file. - if language == 'ps': - self.write(image_file, language='ps') - elif language == 'pdf': - ps = self._run_dot('-Tps') - psfilename = tempfile.mktemp('.ps') - psfile = open(psfilename, 'wb') - psfile.write('%!PS-Adobe-2.0 EPSF-1.2\n') - psfile.write(ps) - psfile.close() - try: run_subprocess(('ps2pdf', '-dEPSCrop', psfilename, - image_file)) - except RunSubprocessError, e: - log.warning("Unable to render Graphviz dot graph (%s):\n" + def to_latex(self, image_file, center=True): + """ + Return the LaTeX code that should be used to display this + graph. Two image files will be written: image_file+'.eps' + and image_file+'.pdf'. + """ + # Render the graph in postscript. + ps = self._run_dot('-Tps') + # Write the postscript output. + psfile = open(image_file+'.eps', 'wb') + psfile.write('%!PS-Adobe-2.0 EPSF-1.2\n') + psfile.write(ps) + psfile.close() + # Use ps2pdf to generate the pdf output. + try: run_subprocess(('ps2pdf', '-dEPSCrop', image_file+'.eps', + image_file+'.pdf')) + except RunSubprocessError, e: + log.warning("Unable to render Graphviz dot graph (%s):\n" "ps2pdf failed." % self.title) - return None - else: - raise ValueError('Expected language to be "ps" or "pdf"') + return None # Generate the latex code to display the graph. name = os.path.splitext(os.path.split(image_file)[-1])[0] @@ -811,7 +812,8 @@ def _get_html_label(self): # Get the class name & contextualize it. classname = self.class_doc.canonical_name - classname = classname.contextualize(self.context.canonical_name) + if context is not None: + classname = classname.contextualize(self.context.canonical_name) # If we're collapsed, display the node as a single box. if self.collapsed: @@ -1414,12 +1416,14 @@ """ nodes = {} for val_doc in sorted(val_docs, key=lambda d:d.canonical_name): - nodes[val_doc] = mk_valdoc_node(graph, val_doc, linker, context) + nodes[val_doc] = mk_valdoc_node(val_doc, linker, context) graph.nodes.append(nodes[val_doc]) return nodes def mk_valdoc_node(val_doc, linker, context): - label = val_doc.canonical_name.contextualize(context.canonical_name) + label = val_doc.canonical_name + if context is not None: + label = label.contextualize(context.canonical_name) node = DotGraphNode(label) specialize_valdoc_node(node, val_doc, context, linker.url_for(val_doc)) return node @@ -1488,12 +1492,13 @@ node['style'] = 'filled,bold' def name_list(api_docs, context=None): + names = [d.canonical_name for d in api_docs] if context is not None: - context = context.canonical_name - names = [str(d.canonical_name.contextualize(context)) for d in api_docs] + names = [name.contextualize(context.canonical_name) for name in names] if len(names) == 0: return '' if len(names) == 1: return '%s' % names[0] elif len(names) == 2: return '%s and %s' % (names[0], names[1]) else: + names = ['%s' % name for name in names] return '%s, and %s' % (', '.join(names[:-1]), names[-1]) Modified: trunk/epydoc/src/epydoc/docwriter/latex.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/latex.py 2008-02-23 06:01:41 UTC (rev 1747) +++ trunk/epydoc/src/epydoc/docwriter/latex.py 2008-02-23 06:59:20 UTC (rev 1748) @@ -359,14 +359,9 @@ def render_graph(self, graph): if graph is None: return '' graph.caption = graph.title = None - if self._pdflatex: - image_url = '%s.pdf' % graph.uid - image_file = os.path.join(self._directory, image_url) - return graph.to_latex(image_file, 'pdf') or '' - else: - image_url = '%s.eps' % graph.uid - image_file = os.path.join(self._directory, image_url) - return graph.to_latex(image_file, 'ps') or '' + image_url = '%s' % graph.uid + image_file = os.path.join(self._directory, image_url) + return graph.to_latex(image_file) or '' def write_class(self, out, doc): if self._list_classes_separately: @@ -1095,6 +1090,8 @@ def docstring_to_latex(self, docstring, indent=0, breakany=0): if docstring is None: return '' s = docstring.to_latex(self._docstring_linker, indent=indent, + directory=self._directory, + docindex=self.docindex, hyperref=self._hyperref) return (' '*indent + '\\begin{EpydocDescription}%\n' + s.strip() + '%\n' + Modified: trunk/epydoc/src/epydoc/markup/epytext.py =================================================================== --- trunk/epydoc/src/epydoc/markup/epytext.py 2008-02-23 06:01:41 UTC (rev 1747) +++ trunk/epydoc/src/epydoc/markup/epytext.py 2008-02-23 06:59:20 UTC (rev 1748) @@ -345,10 +345,10 @@ block = ('section', 'fieldlist', 'field', 'ulist', 'olist', 'li') if have_graph_child and tree.tag not in block: child_index = 0 + parent_index = parent.children.index(tree) for elt in tree.children: if isinstance(elt, Element) and elt.tag == 'graph': # We found a graph: splice it into the parent. - parent_index = parent.children.index(tree) left = tree.children[:child_index] right = tree.children[child_index+1:] parent.children[parent_index:parent_index+1] = [ @@ -357,6 +357,7 @@ Element(tree.tag, *right, **tree.attribs)] child_index = 0 parent_index += 2 + tree = parent.children[parent_index] else: child_index += 1 @@ -1782,12 +1783,14 @@ docindex, context, indent) return self._html - def to_latex(self, docstring_linker, **options): + def to_latex(self, docstring_linker, directory=None, docindex=None, + context=None, **options): if self._latex is not None: return self._latex if self._tree is None: return '' indent = options.get('indent', 0) self._hyperref = options.get('hyperref', 1) - self._latex = self._to_latex(self._tree, docstring_linker, indent) + self._latex = self._to_latex(self._tree, docstring_linker, directory, + docindex, context, indent) return self._latex def to_plaintext(self, docstring_linker, **options): @@ -1873,6 +1876,7 @@ symbol = tree.children[0] return self.SYMBOL_TO_HTML.get(symbol, '[%s]' % symbol) elif tree.tag == 'graph': + if directory is None: return '' # Generate the graph. graph = self._build_graph(variables[0], variables[1:], linker, docindex, context) @@ -1931,8 +1935,8 @@ else: log.warning("Unknown graph type %s" % graph_type) - - def _to_latex(self, tree, linker, indent=0, seclevel=0, breakany=0): + def _to_latex(self, tree, linker, directory, docindex, context, + indent=0, seclevel=0, breakany=0): if isinstance(tree, basestring): return plaintext_to_latex(tree, breakany=breakany) @@ -1941,7 +1945,8 @@ # Figure out the child indent level. if tree.tag == 'epytext': cindent = indent else: cindent = indent + 2 - variables = [self._to_latex(c, linker, cindent, seclevel, breakany) + variables = [self._to_latex(c, linker, directory, docindex, + context, cindent, seclevel, breakany) for c in tree.children] childstr = ''.join(variables) @@ -2002,8 +2007,14 @@ symbol = tree.children[0] return self.SYMBOL_TO_LATEX.get(symbol, '[%s]' % symbol) elif tree.tag == 'graph': - return '(GRAPH)' - #raise ValueError, 'graph not implemented yet for latex' + if directory is None: return '' + # Generate the graph. + graph = self._build_graph(variables[0], variables[1:], linker, + docindex, context) + if not graph: return '' + # Write the graph. + image_file = os.path.join(directory, graph.uid) + return graph.to_latex(image_file) else: # Assume that anything else can be passed through. return childstr Modified: trunk/epydoc/src/epydoc/markup/restructuredtext.py =================================================================== --- trunk/epydoc/src/epydoc/markup/restructuredtext.py 2008-02-23 06:01:41 UTC (rev 1747) +++ trunk/epydoc/src/epydoc/markup/restructuredtext.py 2008-02-23 06:59:20 UTC (rev 1748) @@ -198,9 +198,11 @@ self._document.walkabout(visitor) return ''.join(visitor.body) - def to_latex(self, docstring_linker, **options): + def to_latex(self, docstring_linker, directory=None, + docindex=None, context=None, **options): # Inherit docs - visitor = _EpydocLaTeXTranslator(self._document, docstring_linker) + visitor = _EpydocLaTeXTranslator(self._document, docstring_linker, + directory, docindex, context) self._document.walkabout(visitor) return ''.join(visitor.body).strip()+'\n' @@ -537,14 +539,15 @@ def latex_head_prefix(): document = new_document('<fake>') - translator = _EpydocLaTeXTranslator(document, None) + translator = _EpydocLaTeXTranslator(document) return translator.head_prefix _TARGET_RE = re.compile(r'^(.*?)\s*<(?:URI:|URL:)?([^<>]+)>$') class _EpydocLaTeXTranslator(LaTeXTranslator): settings = None - def __init__(self, document, docstring_linker): + def __init__(self, document, docstring_linker=None, directory=None, + docindex=None, context=None): # Set the document's settings. if self.settings is None: settings = OptionParser([LaTeXWriter()]).get_default_values() @@ -554,6 +557,9 @@ LaTeXTranslator.__init__(self, document) self._linker = docstring_linker + self._directory = directory + self._docindex = docindex + self._context = context # Start at section level 3. (Unfortunately, we now have to # set a private variable to make this work; perhaps the standard @@ -574,12 +580,18 @@ def visit_document(self, node): pass def depart_document(self, node): pass - # For now, just ignore dotgraphs. [XXX] def visit_dotgraph(self, node): - log.warning("Ignoring dotgraph in latex output (dotgraph " - "rendering for latex not implemented yet).") + if self._directory is None: raise SkipNode() # [xx] warning? + + # Generate the graph. + graph = node.graph(self._docindex, self._context, self._linker) + if graph is None: raise SkipNode() + + # Write the graph. + image_file = os.path.join(self._directory, graph.uid) + self.body.append(graph.to_latex(image_file)) raise SkipNode() - + def visit_doctest_block(self, node): self.body.append(doctest_to_latex(node[0].astext())) raise SkipNode() @@ -672,11 +684,11 @@ **attributes) def visit_dotgraph(self, node): - if self._directory is None: return # [xx] warning? + if self._directory is None: raise SkipNode() # [xx] warning? # Generate the graph. graph = node.graph(self._docindex, self._context, self._linker) - if graph is None: return + if graph is None: raise SkipNode() # Write the graph. image_url = '%s.gif' % graph.uid This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-24 03:42:22
|
Revision: 1770 http://epydoc.svn.sourceforge.net/epydoc/?rev=1770&view=rev Author: edloper Date: 2008-02-23 19:42:20 -0800 (Sat, 23 Feb 2008) Log Message: ----------- - Added --no-submodule-list option Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py trunk/epydoc/src/epydoc/docwriter/html.py trunk/epydoc/src/epydoc/docwriter/latex.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-02-24 03:41:21 UTC (rev 1769) +++ trunk/epydoc/src/epydoc/cli.py 2008-02-24 03:42:20 UTC (rev 1770) @@ -152,7 +152,7 @@ external_api=[], external_api_file=[], external_api_root=[], redundant_details=False, src_code_tab_width=8, verbosity=0, include_timestamp=True, target={}, default_target=None, - pdfdriver='auto') + pdfdriver='auto', show_submodule_list=True) # append_const is not defined in py2.3 or py2.4, so use a callback # instead, with the following function: @@ -314,12 +314,21 @@ action='store_true', dest='include_log', help=("Include a page with the process log (epydoc-log.html)")) - generation_group.add_option( - '--redundant-details', + generation_group.add_option('--redundant-details', action='store_true', dest='redundant_details', help=("Include values in the details lists even if all info " "about them is already provided by the summary table.")) + generation_group.add_option('--show-submodule-list', + action='store_true', dest='show_submodule_list', + help="Include a list of submodules on package documentation " + "pages. (default)") + + generation_group.add_option('--no-submodule-list', + action='store_false', dest='show_submodule_list', + help="Do not nclude a list of submodules on package " + "documentation pages.") + output_group = OptionGroup(optparser, 'Output Options') optparser.add_option_group(output_group) @@ -636,6 +645,8 @@ options.include_log = _str_to_bool(val, optname) elif optname in ('redundant-details', 'redundant_details'): options.redundant_details = _str_to_bool(val, optname) + elif optname in ('submodule-list', 'submodule_list'): + options.show_submodule_list = _str_to_bool(val, optname) # Output options elif optname == 'name': Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2008-02-24 03:41:21 UTC (rev 1769) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2008-02-24 03:42:20 UTC (rev 1770) @@ -376,6 +376,10 @@ """If true, then include objects in the details list even if all info about them is already provided by the summary table.""" + self._show_submodule_list = kwargs.get('show_submodule_list', True) + """If true, the include a list of submodules on the package + documentation page.""" + # For use with select_variables(): if self._show_private: self._public_filter = None @@ -769,7 +773,7 @@ self.write_standard_fields(out, doc) # If it's a package, then list the modules it contains. - if doc.is_package is True: + if doc.is_package is True and self._show_submodule_list: self.write_module_list(out, doc) # Write summary tables describing the variables that the Modified: trunk/epydoc/src/epydoc/docwriter/latex.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/latex.py 2008-02-24 03:41:21 UTC (rev 1769) +++ trunk/epydoc/src/epydoc/docwriter/latex.py 2008-02-24 03:42:20 UTC (rev 1770) @@ -59,6 +59,7 @@ self._top_section = 2 self._index_functions = 1 self._hyperref = 1 + self._show_submodule_list = kwargs.get('show_submodule_list', True) self._graph_types = kwargs.get('graphs', ()) or () """Graphs that we should include in our output.""" @@ -341,8 +342,8 @@ self.write_standard_fields(out, doc) # If it's a package, list the sub-modules. - if (self._list_submodules and doc.submodules != - UNKNOWN and doc.submodules): + if (self._list_submodules and self._show_submodule_list and + doc.submodules != UNKNOWN and doc.submodules): self.write_module_list(out, doc) # Contents. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-24 06:09:56
|
Revision: 1775 http://epydoc.svn.sourceforge.net/epydoc/?rev=1775&view=rev Author: edloper Date: 2008-02-23 22:09:50 -0800 (Sat, 23 Feb 2008) Log Message: ----------- - Added --inherit-from-object. Default is now to not inherit methods & properties from object. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-02-24 05:45:19 UTC (rev 1774) +++ trunk/epydoc/src/epydoc/cli.py 2008-02-24 06:09:50 UTC (rev 1775) @@ -152,7 +152,7 @@ external_api=[], external_api_file=[], external_api_root=[], redundant_details=False, src_code_tab_width=8, verbosity=0, include_timestamp=True, target={}, default_target=None, - pdfdriver='auto', show_submodule_list=True) + pdfdriver='auto', show_submodule_list=True, inherit_from_object=False) # append_const is not defined in py2.3 or py2.4, so use a callback # instead, with the following function: @@ -326,9 +326,19 @@ generation_group.add_option('--no-submodule-list', action='store_false', dest='show_submodule_list', - help="Do not nclude a list of submodules on package " + help="Do not include a list of submodules on package " "documentation pages.") + generation_group.add_option('--inherit-from-object', + action='store_true', dest='inherit_from_object', + help="Include methods & properties that are inherited from " + "\"object\".") + + generation_group.add_option('--no-inherit-from-object', + action='store_false', dest='inherit_from_object', + help="Do not include methods & properties that are inherited " + "from \"object\". (default)") + output_group = OptionGroup(optparser, 'Output Options') optparser.add_option_group(output_group) @@ -647,6 +657,8 @@ options.redundant_details = _str_to_bool(val, optname) elif optname in ('submodule-list', 'submodule_list'): options.show_submodule_list = _str_to_bool(val, optname) + elif optname in ('inherit-from-object', 'inherit_from_object'): + options.inherit_from_object = _str_to_bool(val, optname) # Output options elif optname == 'name': @@ -869,11 +881,13 @@ exclude_parse = '|'.join(options.exclude_parse+options.exclude) exclude_introspect = '|'.join(options.exclude_introspect+ options.exclude) + inherit_from_object = options.inherit_from_object docindex = build_doc_index(options.names, options.introspect, options.parse, add_submodules=(options.actions!=['text']), exclude_introspect=exclude_introspect, - exclude_parse=exclude_parse) + exclude_parse=exclude_parse, + inherit_from_object=inherit_from_object) if docindex is None: for logger in loggers: Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2008-02-24 05:45:19 UTC (rev 1774) +++ trunk/epydoc/src/epydoc/docbuilder.py 2008-02-24 06:09:50 UTC (rev 1775) @@ -147,7 +147,8 @@ def build_doc(item, introspect=True, parse=True, add_submodules=True, - exclude_introspect=None, exclude_parse=None): + exclude_introspect=None, exclude_parse=None, + inherit_from_object=False): """ Build API documentation for a given item, and return it as an L{APIDoc} object. @@ -170,11 +171,13 @@ """ docindex = build_doc_index([item], introspect, parse, add_submodules, exclude_introspect=exclude_introspect, - exclude_parse=exclude_parse) + exclude_parse=exclude_parse, + inherit_from_object=inherit_from_object) return docindex.root[0] def build_doc_index(items, introspect=True, parse=True, add_submodules=True, - exclude_introspect=None, exclude_parse=None): + exclude_introspect=None, exclude_parse=None, + inherit_from_object=False): """ Build API documentation for the given list of items, and return it in the form of a L{DocIndex}. @@ -298,7 +301,7 @@ if isinstance(val_doc, ClassDoc): percent = float(i)/len(valdocs) log.progress(percent, val_doc.canonical_name) - inherit_docs(val_doc) + inherit_docs(val_doc, inherit_from_object) log.end_progress() # Initialize the groups & sortedvars attributes. @@ -1321,9 +1324,10 @@ class_doc.variables[name].overrides = var_doc -def inherit_docs(class_doc): +def inherit_docs(class_doc, inherit_from_object): for base_class in list(class_doc.mro(warn_about_bad_bases=True)): if base_class == class_doc: continue + if base_class.pyval is object and not inherit_from_object: continue # Inherit any groups. Place them *after* this class's groups, # so that any groups that are important to this class come This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-27 00:01:45
|
Revision: 1799 http://epydoc.svn.sourceforge.net/epydoc/?rev=1799&view=rev Author: edloper Date: 2008-02-26 16:01:42 -0800 (Tue, 26 Feb 2008) Log Message: ----------- - Changed the usage for to_html() and to_latex() methods -- they now accept a directory, rather than an image filename (and a url in the case of to_html). This is in preparation for adding an option to specify the image format for graphs in html output. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py trunk/epydoc/src/epydoc/docwriter/latex.py trunk/epydoc/src/epydoc/markup/epytext.py trunk/epydoc/src/epydoc/markup/restructuredtext.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2008-02-26 23:54:44 UTC (rev 1798) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2008-02-27 00:01:42 UTC (rev 1799) @@ -1643,9 +1643,7 @@ def render_graph(self, graph): if graph is None: return '' graph.caption = graph.title = None - image_url = '%s.gif' % graph.uid - image_file = os.path.join(self._directory, image_url) - return graph.to_html(image_file, image_url) + return graph.to_html(self._directory) or '' RE_CALLGRAPH_ID = re.compile(r"""["'](.+-div)['"]""") Modified: trunk/epydoc/src/epydoc/docwriter/latex.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/latex.py 2008-02-26 23:54:44 UTC (rev 1798) +++ trunk/epydoc/src/epydoc/docwriter/latex.py 2008-02-27 00:01:42 UTC (rev 1799) @@ -351,9 +351,7 @@ def render_graph(self, graph): if graph is None: return '' graph.caption = graph.title = None - image_url = '%s' % graph.uid - image_file = os.path.join(self._directory, image_url) - return graph.to_latex(image_file) or '' + return graph.to_latex(self._directory) or '' def write_class(self, out, doc, short_name=None): if short_name is None: short_name = doc.canonical_name[-1] Modified: trunk/epydoc/src/epydoc/markup/epytext.py =================================================================== --- trunk/epydoc/src/epydoc/markup/epytext.py 2008-02-26 23:54:44 UTC (rev 1798) +++ trunk/epydoc/src/epydoc/markup/epytext.py 2008-02-27 00:01:42 UTC (rev 1799) @@ -1882,9 +1882,7 @@ docindex, context) if not graph: return '' # Write the graph. - image_url = '%s.gif' % graph.uid - image_file = os.path.join(directory, image_url) - return graph.to_html(image_file, image_url) + return graph.to_html(directory) else: raise ValueError('Unknown epytext DOM element %r' % tree.tag) @@ -2015,8 +2013,7 @@ docindex, context) if not graph: return '' # Write the graph. - image_file = os.path.join(directory, graph.uid) - return graph.to_latex(image_file) + return graph.to_latex(directory) else: # Assume that anything else can be passed through. return childstr Modified: trunk/epydoc/src/epydoc/markup/restructuredtext.py =================================================================== --- trunk/epydoc/src/epydoc/markup/restructuredtext.py 2008-02-26 23:54:44 UTC (rev 1798) +++ trunk/epydoc/src/epydoc/markup/restructuredtext.py 2008-02-27 00:01:42 UTC (rev 1799) @@ -601,8 +601,7 @@ if graph is None: raise SkipNode() # Write the graph. - image_file = os.path.join(self._directory, graph.uid) - self.body.append(graph.to_latex(image_file)) + self.body.append(graph.to_latex(self._directory) raise SkipNode() def visit_doctest_block(self, node): @@ -708,9 +707,7 @@ if graph is None: raise SkipNode() # Write the graph. - image_url = '%s.gif' % graph.uid - image_file = os.path.join(self._directory, image_url) - self.body.append(graph.to_html(image_file, image_url)) + self.body.append(graph.to_html(self._directory) raise SkipNode() def visit_doctest_block(self, node): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |