Thread: [Epydoc-commits] SF.net SVN: epydoc: [1758] trunk/epydoc/src/epydoc/docwriter/dotgraph.py (Page 2)
Brought to you by:
edloper
From: <ed...@us...> - 2008-02-23 19:06:45
|
Revision: 1758 http://epydoc.svn.sourceforge.net/epydoc/?rev=1758&view=rev Author: edloper Date: 2008-02-23 11:06:41 -0800 (Sat, 23 Feb 2008) Log Message: ----------- - Added some preliminary code for using dot2tex. This feature is not yet working (and therefore disabled). Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 18:31:10 UTC (rev 1757) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 19:06:41 UTC (rev 1758) @@ -28,6 +28,11 @@ from epydoc.util import * from epydoc.compat import * # Backwards compatibility +#: Should the dot2tex module be used to render dot graphs to latex +#: (if it's available)? This is experimental, and not yet working, +#: so it should be left False for now. +USE_DOT2TEX = False + # colors for graphs of APIDocs MODULE_BG = '#d8e8ff' CLASS_BG = '#d8ffe8' @@ -136,6 +141,15 @@ graph. Two image files will be written: image_file+'.eps' and image_file+'.pdf'. """ + # Use dot2tex if requested (and if it's available). + # Otherwise, render it to an image file & use \includgraphics. + if USE_DOT2TEX and dot2tex is not None: + try: return self._to_dot2tex(center) + except KeyboardInterrupt: raise + except: + raise + log.warning('dot2tex failed; using dot instead') + # Render the graph in postscript. ps = self._run_dot('-Tps') # Write the postscript output. @@ -157,6 +171,25 @@ if center: s = '\\begin{center}\n%s\\end{center}\n' % s return s + def _to_dot2tex(self, center=True): + # requires: pgf, latex-xcolor. + from dot2tex import dot2tex + if 0: # DEBUG + import logging + log = logging.getLogger("dot2tex") + log.setLevel(logging.DEBUG) + console = logging.StreamHandler() + formatter = logging.Formatter('%(levelname)-8s %(message)s') + console.setFormatter(formatter) + log.addHandler(console) + options = dict(crop=True, autosize=True, figonly=True, debug=True) + conv = dot2tex.Dot2PGFConv(options) + s = conv.convert(self.to_dotfile()) + conv.dopreproc = False + s = conv.convert(s) + if center: s = '\\begin{center}\n%s\\end{center}\n' % s + return s + def to_html(self, image_file, image_url, center=True): """ Return the HTML code that should be uesd to display this graph This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-23 20:11:30
|
Revision: 1765 http://epydoc.svn.sourceforge.net/epydoc/?rev=1765&view=rev Author: edloper Date: 2008-02-23 12:11:27 -0800 (Sat, 23 Feb 2008) Log Message: ----------- - DocstringLinker.url_for() is now an optional method Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 20:11:01 UTC (rev 1764) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 20:11:27 UTC (rev 1765) @@ -274,7 +274,8 @@ # Link xrefs in body def subfunc(m): - url = docstring_linker.url_for(m.group(1)) + try: url = docstring_linker.url_for(m.group(1)) + except NotImplementedError: url = '' if url: return 'href="%s"%s' % (url, m.group(2)) else: return '' self.body = re.sub("href\s*=\s*['\"]?<([\w\.]+)>['\"]?\s*(,?)", @@ -285,7 +286,8 @@ if 'href' in attribs: m = re.match(r'^<([\w\.]+)>$', attribs['href']) if m: - url = docstring_linker.url_for(m.group(1)) + try: url = docstring_linker.url_for(m.group(1)) + except NotImplementedError: url = '' if url: attribs['href'] = url else: del attribs['href'] @@ -579,9 +581,10 @@ tooltip = " ".join(tooltip.split()) else: tooltip = class_doc.canonical_name - DotGraphNode.__init__(self, tooltip=tooltip, - width=0, height=0, shape='plaintext', - href=linker.url_for(class_doc) or NOOP_URL) + try: url = linker.url_for(class_doc) or NOOP_URL + except NotImplementedError: url = NOOP_URL + DotGraphNode.__init__(self, tooltip=tooltip, width=0, height=0, + shape='plaintext', href=url) #///////////////////////////////////////////////////////////////// #{ Attribute Linking @@ -726,7 +729,8 @@ # [xx] should I set constraint=false here? attribs.setdefault('headport', 'body') attribs.setdefault('tailport', 'body') - url = self.linker.url_for(var) or NOOP_URL + try: url = self.linker.url_for(var) or NOOP_URL + except NotImplementedError: url = NOOP_URL self.edges.append(DotGraphEdge(self, type_node, label=var.name, arrowtail='odiamond', arrowhead='none', href=url, tooltip=var.canonical_name, labeldistance=1.5, @@ -769,7 +773,8 @@ self._type_descr(var_doc.value)) if type_descr: label += ': %s' % type_descr # Get the URL - url = self.linker.url_for(var_doc) or NOOP_URL + try: url = self.linker.url_for(var_doc) or NOOP_URL + except NotImplementedError: url = NOOP_URL # Construct & return the pseudo-html code return self._ATTRIBUTE_CELL % (url, self._tooltip(var_doc), label) @@ -792,7 +797,8 @@ if len(label) > self._max_signature_width: label = label[:self._max_signature_width-4]+'...)' # Get the URL - url = self.linker.url_for(var_doc) or NOOP_URL + try: url = self.linker.url_for(var_doc) or NOOP_URL + except NotImplementedError: url = NOOP_URL # Construct & return the pseudo-html code return self._OPERATION_CELL % (url, self._tooltip(var_doc), label) @@ -939,8 +945,9 @@ self.collapsed = collapsed self.options = options self.excluded_submodules = excluded_submodules - DotGraphNode.__init__(self, shape='plaintext', - href=linker.url_for(module_doc) or NOOP_URL, + try: url = linker.url_for(module_doc) or NOOP_URL + except NotImplementedError: url = NOOP_URL + DotGraphNode.__init__(self, shape='plaintext', href=url, tooltip=module_doc.canonical_name) #: Expects: (color, color, url, tooltip, body) @@ -976,7 +983,8 @@ """ MAX_ROW_WIDTH = 80 # unit is roughly characters. pkg_name = package.canonical_name - pkg_url = self.linker.url_for(package) or NOOP_URL + try: pkg_url = self.linker.url_for(package) or NOOP_URL + except NotImplementedError: pkg_url = NOOP_URL if (not package.is_package or len(package.submodules) == 0 or self.collapsed): @@ -1181,11 +1189,12 @@ if base in exclude: break # Don't do the same class twice. if base in cls2node: continue + # Decide if the base is documented. + try: documented = (linker.url_for(base) is not None) + except: documented = True # Make the node. if base in classes: typ = 'selected' - elif (hasattr(linker, 'docindex') and - linker.docindex.find(identifier, self.container) is None): - typ = 'undocumented' + elif not documented: typ = 'undocumented' else: typ = 'superclass' cls2node[base] = mknode(base, typ, linker, context, options) graph.nodes.append(cls2node[base]) @@ -1499,8 +1508,9 @@ # Set the URL. (Do this even if it points to the page we're # currently on; otherwise, the tooltip is ignored.) - url = linker.url_for(val_doc) - node['href'] = url or NOOP_URL + try: url = linker.url_for(val_doc) or NOOP_URL + except NotImplementedError: url = NOOP_URL + node['href'] = url if (url is None and hasattr(linker, 'docindex') and This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-23 20:31:32
|
Revision: 1766 http://epydoc.svn.sourceforge.net/epydoc/?rev=1766&view=rev Author: edloper Date: 2008-02-23 12:31:31 -0800 (Sat, 23 Feb 2008) Log Message: ----------- - Use different minimum graph sizes for latex & html output. These sizes default to the values DotGraph.DEFAULT_LATEX_SIZE and DotGraph.DEFAULT_HTML_SIZE, respectively. (This will make it easier to add a command-line option to change those defaults.) Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 20:11:27 UTC (rev 1765) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-23 20:31:31 UTC (rev 1766) @@ -83,9 +83,16 @@ DEFAULT_NODE_DEFAULTS={'fontsize':10, 'fontname': 'Helvetica'} DEFAULT_EDGE_DEFAULTS={'fontsize':10, 'fontname': 'Helvetica'} + DEFAULT_LATEX_SIZE="6.25,8" + """The default minimum size in inches (width,height) for graphs + when rendering with `to_latex()`""" + + DEFAULT_HTML_SIZE="10,20" + """The default minimum size in inches (width,height) for graphs + when rendering with `to_html()`""" + def __init__(self, title, body='', node_defaults=None, - edge_defaults=None, caption=None, - max_width=6, max_height=8): + edge_defaults=None, caption=None): """ Create a new `DotGraph`. """ @@ -111,12 +118,6 @@ :type: ``str``""" - self.max_width = max_width - """The maximum width of the graph (in inches)""" - - self.max_height = max_height - """The maximum height of the graph (in inches)""" - self.node_defaults = node_defaults or self.DEFAULT_NODE_DEFAULTS """Default attribute values for nodes.""" @@ -142,23 +143,30 @@ self.uid = '%s_%s' % (self.uid, n) self._uids.add(self.uid) - def to_latex(self, image_file, center=True): + def to_latex(self, image_file, center=True, size=None): """ 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'. + + :param size: The maximum size for the generated image, in + inches. In particular, if ``size`` is ``\"w,h\"``, then + this will add a line ``size=\"w,h\"`` to the dot graph. + Defaults to `DEFAULT_LATEX_SIZE`. + :type size: ``str`` """ + size = size or self.DEFAULT_LATEX_SIZE # Use dot2tex if requested (and if it's available). # Otherwise, render it to an image file & use \includgraphics. if USE_DOT2TEX and dot2tex is not None: - try: return self._to_dot2tex(center) + try: return self._to_dot2tex(center, size) except KeyboardInterrupt: raise except: raise log.warning('dot2tex failed; using dot instead') # Render the graph in postscript. - ps = self._run_dot('-Tps') + ps = self._run_dot('-Tps', size=size) # Write the postscript output. psfile = open(image_file+'.eps', 'wb') psfile.write('%!PS-Adobe-2.0 EPSF-1.2\n') @@ -178,7 +186,7 @@ if center: s = '\\begin{center}\n%s\\end{center}\n' % s return s - def _to_dot2tex(self, center=True): + def _to_dot2tex(self, center=True, size=None): # requires: pgf, latex-xcolor. from dot2tex import dot2tex if 0: # DEBUG @@ -191,25 +199,32 @@ log.addHandler(console) options = dict(crop=True, autosize=True, figonly=True, debug=True) conv = dot2tex.Dot2PGFConv(options) - s = conv.convert(self.to_dotfile()) + s = conv.convert(self.to_dotfile(size=size)) conv.dopreproc = False s = conv.convert(s) if center: s = '\\begin{center}\n%s\\end{center}\n' % s return s - def to_html(self, image_file, image_url, center=True): + def to_html(self, image_file, image_url, center=True, size=None): """ Return the HTML code that should be uesd to display this graph (including a client-side image map). :param image_url: The URL of the image file for this graph; this should be generated separately with the `write()` method. + :param size: The maximum size for the generated image, in + inches. In particular, if ``size`` is ``\"w,h\"``, then + this will add a line ``size=\"w,h\"`` to the dot graph. + Defaults to `DEFAULT_HTML_SIZE`. + :type size: ``str`` """ + size = size or self.DEFAULT_HTML_SIZE # If dotversion >1.8.10, then we can generate the image and # the cmapx with a single call to dot. Otherwise, we need to # run dot twice. if get_dot_version() > [1,8,10]: - cmapx = self._run_dot('-Tgif', '-o%s' % image_file, '-Tcmapx') + cmapx = self._run_dot('-Tgif', '-o%s' % image_file, + '-Tcmapx', size=size) if cmapx is None: return '' # failed to render else: if not self.write(image_file): @@ -291,32 +306,44 @@ if url: attribs['href'] = url else: del attribs['href'] - def write(self, filename, language='gif'): + def write(self, filename, language='gif', size=None): """ Render the graph using the output format `language`, and write the result to `filename`. :return: True if rendering was successful. + :param size: The maximum size for the generated image, in + inches. In particular, if ``size`` is ``\"w,h\"``, then + this will add a line ``size=\"w,h\"`` to the dot graph. + If not specified, no size line will be added. + :type size: ``str`` """ result = self._run_dot('-T%s' % language, - '-o%s' % filename) + '-o%s' % filename, + size=size) # Decode into unicode, if necessary. if language == 'cmapx' and result is not None: result = result.decode('utf-8') return (result is not None) - def render(self, language='gif'): + def render(self, language='gif', size=None): """ Use the ``dot`` command to render this graph, using the output format `language`. Return the result as a string, or ``None`` if the rendering failed. + + :param size: The maximum size for the generated image, in + inches. In particular, if ``size`` is ``\"w,h\"``, then + this will add a line ``size=\"w,h\"`` to the dot graph. + If not specified, no size line will be added. + :type size: ``str`` """ - return self._run_dot('-T%s' % language) + return self._run_dot('-T%s' % language, size=size) - def _run_dot(self, *options): + def _run_dot(self, *options, **kwparam): try: result, err = run_subprocess((DOT_COMMAND,)+options, - self.to_dotfile()) + self.to_dotfile(**kwparam)) if err: log.warning("Graphviz dot warning(s):\n%s" % err) except OSError, e: log.warning("Unable to render Graphviz dot graph (%s):\n%s" % @@ -325,24 +352,31 @@ if epydoc.DEBUG: filename = tempfile.mktemp('.dot') out = open(filename, 'wb') - out.write(self.to_dotfile()) + out.write(self.to_dotfile(**kwparam)) out.close() log.debug('Failed dot graph written to %s' % filename) return None return result - def to_dotfile(self): + def to_dotfile(self, size=None): """ Return the string contents of the dot file that should be used to render this graph. + + :param size: The maximum size for the generated image, in + inches. In particular, if ``size`` is ``\"w,h\"``, then + this will add a line ``size=\"w,h\"`` to the dot graph. + If not specified, no size line will be added. + :type size: ``str`` """ lines = ['digraph %s {' % self.uid, - 'size="%d,%d"\n' % (self.max_width, self.max_height), 'node [%s]' % ','.join(['%s="%s"' % (k,v) for (k,v) in self.node_defaults.items()]), 'edge [%s]' % ','.join(['%s="%s"' % (k,v) for (k,v) in self.edge_defaults.items()])] + if size: + lines.append('size="%s"' % size) if self.body: lines.append(self.body) lines.append('/* Nodes */') 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:41:27
|
Revision: 1778 http://epydoc.svn.sourceforge.net/epydoc/?rev=1778&view=rev Author: edloper Date: 2008-02-23 22:41:25 -0800 (Sat, 23 Feb 2008) Log Message: ----------- - Guard against ClassDoc.bases being UNKNOWN Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-24 06:40:56 UTC (rev 1777) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-24 06:41:25 UTC (rev 1778) @@ -1272,6 +1272,7 @@ context, options, cls2node, truncated): # Add inheritance edges. for (cls, node) in cls2node.items(): + if cls.bases is UNKNOWN: continue for base in cls.bases: if base in cls2node: graph.edges.append(mkedge(cls2node[base], node, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-26 17:12:22
|
Revision: 1794 http://epydoc.svn.sourceforge.net/epydoc/?rev=1794&view=rev Author: edloper Date: 2008-02-26 09:12:17 -0800 (Tue, 26 Feb 2008) Log Message: ----------- - Changes to make graph colors user-customizable. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-26 17:11:38 UTC (rev 1793) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-26 17:12:17 UTC (rev 1794) @@ -33,15 +33,17 @@ #: so it should be left False for now. USE_DOT2TEX = False -# colors for graphs of APIDocs -MODULE_BG = '#d8e8ff' -CLASS_BG = '#d8ffe8' -SELECTED_BG = '#ffd0d0' -BASECLASS_BG = '#e0b0a0' -SUBCLASS_BG = '#e0b0a0' -UNDOCUMENTED_BG = '#c0c0c0' -ROUTINE_BG = '#e8d0b0' # maybe? -INH_LINK_COLOR = '#800000' +#: colors for graphs of APIDocs +COLOR = dict( + MODULE_BG = '#d8e8ff', + CLASS_BG = '#d8ffe8', + SELECTED_BG = '#ffd0d0', + BASECLASS_BG = '#e0b0a0', + SUBCLASS_BG = '#e0b0a0', + UNDOCUMENTED_BG = '#c0c0c0', + ROUTINE_BG = '#e8d0b0', # not used + INH_LINK = '#800000', + ) ###################################################################### #{ Dot Graphs @@ -500,7 +502,7 @@ - use qualifiers """ def __init__(self, class_doc, linker, context, collapsed=False, - bgcolor=CLASS_BG, **options): + bgcolor=COLOR['CLASS_BG'], **options): """ Create a new `DotGraphUmlClassNode` based on the class `class_doc`. @@ -1059,11 +1061,11 @@ _COLOR_DIFF = 24 def _color(self, package, depth): - if package == self.context: return SELECTED_BG + if package == self.context: return COLOR['SELECTED_BG'] else: # Parse the base color. - if re.match(MODULE_BG, 'r#[0-9a-fA-F]{6}$'): - base = int(MODULE_BG[1:], 16) + if re.match(COLOR['MODULE_BG'], 'r#[0-9a-fA-F]{6}$'): + base = int(COLOR['MODULE_BG'][1:], 16) else: base = int('d8e8ff', 16) red = (base & 0xff0000) >> 16 @@ -1354,11 +1356,11 @@ if nodetype == 'subclass': return DotGraphUmlClassNode( cls, linker, context, collapsed=True, - bgcolor=SUBCLASS_BG, **options) + bgcolor=COLOR['SUBCLASS_BG'], **options) elif nodetype in ('selected', 'superclass', 'undocumented'): - if nodetype == 'selected': bgcolor = SELECTED_BG - if nodetype == 'superclass': bgcolor = BASECLASS_BG - if nodetype == 'undocumented': bgcolor = UNDOCUMENTED_BG + if nodetype == 'selected': bgcolor = COLOR['SELECTED_BG'] + if nodetype == 'superclass': bgcolor = COLOR['BASECLASS_BG'] + if nodetype == 'undocumented': bgcolor = COLOR['UNDOCUMENTED_BG'] return DotGraphUmlClassNode( cls, linker, context, show_inherited_vars=False, collapsed=False, bgcolor=bgcolor, **options) @@ -1369,12 +1371,12 @@ if edgetype == 'subclass': return DotGraphEdge( start, end, dir='back', arrowtail='empty', - headport='body', tailport='body', color=INH_LINK_COLOR, + headport='body', tailport='body', color=COLOR['INH_LINK'], weight=100, style='bold') if edgetype == 'truncate-subclass': return DotGraphEdge( start, end, dir='back', arrowtail='empty', - tailport='body', color=INH_LINK_COLOR, + tailport='body', color=COLOR['INH_LINK'], weight=100, style='bold') assert 0, 'bad edgetype' @@ -1550,13 +1552,13 @@ if (url is None and hasattr(linker, 'docindex') and linker.docindex.find(identifier, self.container) is None): - node['fillcolor'] = UNDOCUMENTED_BG + node['fillcolor'] = COLOR['UNDOCUMENTED_BG'] node['style'] = 'filled' if isinstance(val_doc, ModuleDoc) and dot_version >= [2]: node['shape'] = 'plaintext' - if val_doc == context: color = SELECTED_BG - else: color = MODULE_BG + if val_doc == context: color = COLOR['SELECTED_BG'] + else: color = COLOR['MODULE_BG'] node['tooltip'] = node['label'] node['html_label'] = MODULE_NODE_HTML % (color, color, url, val_doc.canonical_name, @@ -1572,7 +1574,7 @@ node['label'] = '%s()' % node['label'] node['tooltip'] = node['label'] if val_doc == context: - node['fillcolor'] = SELECTED_BG + node['fillcolor'] = COLOR['SELECTED_BG'] node['style'] = 'filled,rounded,bold' else: @@ -1581,7 +1583,7 @@ node['height'] = 0 node['tooltip'] = node['label'] if val_doc == context: - node['fillcolor'] = SELECTED_BG + node['fillcolor'] = COLOR['SELECTED_BG'] node['style'] = 'filled,bold' def name_list(api_docs, context=None): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-26 23:37:27
|
Revision: 1797 http://epydoc.svn.sourceforge.net/epydoc/?rev=1797&view=rev Author: edloper Date: 2008-02-26 15:37:17 -0800 (Tue, 26 Feb 2008) Log Message: ----------- - DotGraph's write() render() and html() methods now auto-select the output format (gif, png, etc) based on the filename. Default=gif. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-26 17:16:49 UTC (rev 1796) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-26 23:37:17 UTC (rev 1797) @@ -225,7 +225,8 @@ # the cmapx with a single call to dot. Otherwise, we need to # run dot twice. if get_dot_version() > [1,8,10]: - cmapx = self._run_dot('-Tgif', '-o%s' % image_file, + cmapx = self._run_dot('-T%s' % self._pick_language(image_file), + '-o%s' % image_file, '-Tcmapx', size=size) if cmapx is None: return '' # failed to render else: @@ -307,8 +308,8 @@ except NotImplementedError: url = '' if url: attribs['href'] = url else: del attribs['href'] - - def write(self, filename, language='gif', size=None): + + def write(self, filename, language=None, size=None): """ Render the graph using the output format `language`, and write the result to `filename`. @@ -320,6 +321,7 @@ If not specified, no size line will be added. :type size: ``str`` """ + if language is None: language = self._pick_language(filename) result = self._run_dot('-T%s' % language, '-o%s' % filename, size=size) @@ -328,7 +330,14 @@ result = result.decode('utf-8') return (result is not None) - def render(self, language='gif', size=None): + def _pick_language(self, filename): + ext = os.path.splitext(filename)[1] + if ext in ('.gif', '.png', '.jpg', '.jpeg'): + return ext[1:] + else: + return 'gif' + + def render(self, language=None, size=None): """ Use the ``dot`` command to render this graph, using the output format `language`. Return the result as a string, or ``None`` This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-26 23:54:51
|
Revision: 1798 http://epydoc.svn.sourceforge.net/epydoc/?rev=1798&view=rev Author: edloper Date: 2008-02-26 15:54:44 -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/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-26 23:37:17 UTC (rev 1797) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-26 23:54:44 UTC (rev 1798) @@ -93,6 +93,9 @@ """The default minimum size in inches (width,height) for graphs when rendering with `to_html()`""" + DEFAULT_HTML_IMAGE_FORMAT = 'gif' + """The default format used to generate images by `to_html()`""" + def __init__(self, title, body='', node_defaults=None, edge_defaults=None, caption=None): """ @@ -145,7 +148,7 @@ self.uid = '%s_%s' % (self.uid, n) self._uids.add(self.uid) - def to_latex(self, image_file, center=True, size=None): + def to_latex(self, directory, center=True, size=None): """ Return the LaTeX code that should be used to display this graph. Two image files will be written: image_file+'.eps' @@ -157,6 +160,8 @@ Defaults to `DEFAULT_LATEX_SIZE`. :type size: ``str`` """ + eps_file = os.path.join(directory, self.uid+'.eps') + pdf_file = os.path.join(directory, self.uid+'.pdf') size = size or self.DEFAULT_LATEX_SIZE # Use dot2tex if requested (and if it's available). # Otherwise, render it to an image file & use \includgraphics. @@ -170,21 +175,19 @@ # Render the graph in postscript. ps = self._run_dot('-Tps', size=size) # Write the postscript output. - psfile = open(image_file+'.eps', 'wb') + psfile = open(eps_file, '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')) + try: run_subprocess(('ps2pdf', '-dEPSCrop', eps_file, pdf_file)) except RunSubprocessError, e: log.warning("Unable to render Graphviz dot graph (%s):\n" "ps2pdf failed." % self.title) return None # Generate the latex code to display the graph. - name = os.path.splitext(os.path.split(image_file)[-1])[0] - s = ' \\includegraphics{%s}\n' % name + s = ' \\includegraphics{%s}\n' % self.uid if center: s = '\\begin{center}\n%s\\end{center}\n' % s return s @@ -206,8 +209,8 @@ s = conv.convert(s) if center: s = '\\begin{center}\n%s\\end{center}\n' % s return s - - def to_html(self, image_file, image_url, center=True, size=None): + + def to_html(self, directory, center=True, size=None): """ Return the HTML code that should be uesd to display this graph (including a client-side image map). @@ -220,6 +223,8 @@ Defaults to `DEFAULT_HTML_SIZE`. :type size: ``str`` """ + image_url = '%s.%s' % (self.uid, self.DEFAULT_HTML_IMAGE_FORMAT) + image_file = os.path.join(directory, image_url) size = size or self.DEFAULT_HTML_SIZE # If dotversion >1.8.10, then we can generate the image and # the cmapx with a single call to dot. Otherwise, we need to This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-27 20:24:13
|
Revision: 1805 http://epydoc.svn.sourceforge.net/epydoc/?rev=1805&view=rev Author: edloper Date: 2008-02-27 12:24:06 -0800 (Wed, 27 Feb 2008) Log Message: ----------- - If the dot executable is not found, issue an error, and don't try to generate further graphs. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/dotgraph.py Modified: trunk/epydoc/src/epydoc/docwriter/dotgraph.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-27 19:54:39 UTC (rev 1804) +++ trunk/epydoc/src/epydoc/docwriter/dotgraph.py 2008-02-27 20:24:06 UTC (rev 1805) @@ -357,6 +357,7 @@ return self._run_dot('-T%s' % language, size=size) def _run_dot(self, *options, **kwparam): + if get_dot_version() == (0,): return None try: result, err = run_subprocess((DOT_COMMAND,)+options, self.to_dotfile(**kwparam)) @@ -1507,6 +1508,10 @@ else: _dot_version = (0,) except OSError, e: + log.error('dot executable not found; graphs will not be ' + 'generated. Adjust your shell\'s path, or use ' + '--dotpath to specify the path to the dot ' + 'executable.' % DOT_COMMAND) _dot_version = (0,) log.info('Detected dot version %s' % _dot_version) return _dot_version This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |