Thread: [Epydoc-commits] SF.net SVN: epydoc: [1197] trunk/epydoc/src/epydoc/docwriter/html.py
Brought to you by:
edloper
From: <ed...@us...> - 2006-04-09 18:17:57
|
Revision: 1197 Author: edloper Date: 2006-04-09 11:17:52 -0700 (Sun, 09 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1197&view=rev Log Message: ----------- - Added support for drawing uml class graphs (many thanks to Daniele Varrazzo for the initial code!) - Modified breadcrumbs, so the 'no frames' link works better when viewing source code - Fixed bug in url() for imported variables. - Modified HIDE_PRIVATE_JS so it won't hide private variables if location.href appears to have a private anchor. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-04-09 18:15:55 UTC (rev 1196) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-04-09 18:17:52 UTC (rev 1197) @@ -587,7 +587,7 @@ # Write the page header (incl. navigation bar & breadcrumbs) self.write_header(out, str(longname)) self.write_navbar(out, doc) - self.write_breadcrumbs(out, doc) + self.write_breadcrumbs(out, doc, self.url(doc)) # Write the name of the module we're describing. if doc.is_package is True: typ = 'Package' @@ -645,7 +645,7 @@ # Header self.write_header(out, name) self.write_navbar(out, doc) - self.write_breadcrumbs(out, doc) + self.write_breadcrumbs(out, doc, self.pysrc_url(doc)) # Source code listing out('<h2 class="py-src">Source Code for %s</h2>\n' % @@ -678,7 +678,7 @@ # Write the page header (incl. navigation bar & breadcrumbs) self.write_header(out, str(longname)) self.write_navbar(out, doc) - self.write_breadcrumbs(out, doc) + self.write_breadcrumbs(out, doc, self.url(doc)) # Write the name of the class we're describing. if doc.is_type(): typ = 'Type' @@ -695,8 +695,13 @@ if ((doc.bases not in (UNKNOWN, None) and len(doc.bases) > 0) or (doc.subclasses not in (UNKNOWN,None) and len(doc.subclasses)>0)): # Display bases graphically, if requested. - if 'classtree' in self._graph_types: + if 'umlclasstree' in self._graph_types: linker = _HTMLDocstringLinker(self, doc) + graph = uml_class_tree_graph(doc, linker, doc) + out('<center>\n%s</center>\n' % self.render_graph(graph)) + + elif 'classtree' in self._graph_types: + linker = _HTMLDocstringLinker(self, doc) graph = class_tree_graph([doc], linker, doc) out('<center>\n%s</center>\n' % self.render_graph(graph)) @@ -773,7 +778,7 @@ # Header material. self.write_header(out, 'Trees') self.write_navbar(out, 'trees') - self.write_breadcrumbs(out, 'trees') + self.write_breadcrumbs(out, 'trees', 'trees.html') # Write the module hierarchy out('<!-- ==================== ' @@ -812,7 +817,7 @@ # Header material. self.write_header(out, 'Index') self.write_navbar(out, 'indices') - self.write_breadcrumbs(out, 'indices') + self.write_breadcrumbs(out, 'indices', 'indices.html') out('<br />\n') terms = self._extract_term_index() @@ -957,7 +962,7 @@ # Insert the help contents into a webpage. self.write_header(out, 'Help') self.write_navbar(out, 'help') - self.write_breadcrumbs(out, 'help') + self.write_breadcrumbs(out, 'help', 'help.html') out(help) self.write_navbar(out, 'help') self.write_footer(out) @@ -1303,11 +1308,15 @@ parent.frames[2].location.href = url2; } '''.strip() - + + #: A javascript that is used to hide private variables, unless + #: either: (a) the cookie says not to; or (b) we appear to be + #: linking to a private variable. HIDE_PRIVATE_JS = ''' function checkCookie() { var cmd=getCookie("EpydocPrivate"); - if (cmd!="show private") {toggle_private();} + if (cmd!="show private" && location.href.indexOf("#_") < 0) + toggle_private(); } '''.strip() @@ -1350,7 +1359,7 @@ def callgraph_link(self, callgraph): if callgraph is None: return '' - return ('<br /><span class="codelink"><a href="#" ' + return ('<br /><span class="codelink"><a href="javascript: void(0);" ' 'onclick="toggleCallGraph(\'%s-div\');return false;">' 'call graph</a></span> ' % callgraph.uid) @@ -1510,7 +1519,7 @@ write_breadcrumbs = compile_template( """ - write_breadcrumbs(self, out, context) + write_breadcrumbs(self, out, context, context_url) Generate HTML for the breadcrumbs line, and write it to C{out}. The breadcrumbs line is an invisible table with a @@ -1547,7 +1556,7 @@ >>> #endif <tr><td align="right"><span class="options" >[<a href="frames.html" target="_top">frames</a - >] | <a href="$self.url(context)$" + >] | <a href="$context_url$" target="_top">no frames</a>]</span></td></tr> </table> </td> @@ -2748,7 +2757,13 @@ if isinstance(val_doc, (ModuleDoc, ClassDoc)): return self.url(val_doc) elif obj.container in (None, UNKNOWN): + if val_doc in (None, UNKNOWN): return None return self.url(val_doc) + elif obj.is_imported == True: + if obj.imported_from is not UNKNOWN: + return self.url(obj.imported_from) + else: + return None else: container_url = self.url(obj.container) if container_url is None: return None This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-04-13 07:17:46
|
Revision: 1229 Author: edloper Date: 2006-04-13 00:17:41 -0700 (Thu, 13 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1229&view=rev Log Message: ----------- - s/Index/Indices/ on the navbar Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-04-13 07:14:46 UTC (rev 1228) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-04-13 07:17:41 UTC (rev 1229) @@ -1520,10 +1520,10 @@ <!-- Index link --> >>> if context == "indices": <th bgcolor="#70b0f0" class="navselect" - > Index </th> + > Indices </th> >>> else: <th class="navbar"> <a class="navbar" - href="identifier-index.html">Index</a> </th> + href="identifier-index.html">Indices</a> </th> >>> #endif <!-- Help link --> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 06:45:06
|
Revision: 1250 Author: edloper Date: 2006-08-20 23:44:58 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1250&view=rev Log Message: ----------- - Fixed sf bug #1509415, where epydoc would crash on a "malformed" @raise field Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 05:53:23 UTC (rev 1249) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 06:44:58 UTC (rev 1250) @@ -2028,9 +2028,11 @@ <dl><dt>Raises:</dt></dl> <ul class="nomargin"> >>> for name, descr in func_doc.exception_descrs: + >>> name = self.href(self.docindex.find(name, func_doc), + >>> label=str(name)) $self.labelled_list_item( "<code><strong class=\'fraise\'>" + - self.href(name) + "</strong></code>", + name + "</strong></code>", self.docstring_to_html(descr, func_doc, 8))$ >>> #endfor </ul> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 11:02:17
|
Revision: 1268 Author: edloper Date: 2006-08-21 04:02:13 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1268&view=rev Log Message: ----------- - Display the decorators that have been applied to a function in the function details section. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 11:01:45 UTC (rev 1267) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 11:02:13 UTC (rev 1268) @@ -2023,6 +2023,15 @@ >>> elif rtype: <dl><dt>Returns: <code>$rtype$</code></dt></dl> >>> #endif + >>> # === decorators === + >>> if func_doc.decorators not in (None, UNKNOWN, (), []): + <dl><dt>Decorators:</dt></dl> + <ul class="nomargin"> + >>> for deco in func_doc.decorators: + <li>$deco$</li> + >>> #endfor + </ul> + >>> #endif >>> # === exceptions === >>> if func_doc.exception_descrs not in (None, UNKNOWN, (), []): <dl><dt>Raises:</dt></dl> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 11:24:12
|
Revision: 1269 Author: edloper Date: 2006-08-21 04:24:09 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1269&view=rev Log Message: ----------- - Add a check to make sure we don't have an object that's its own container, which would generate an infinite loop. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 11:02:13 UTC (rev 1268) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 11:24:09 UTC (rev 1269) @@ -1654,6 +1654,7 @@ # Generate the crumbs for uid's ancestors. while True: container = self.docindex.container(doc) + assert doc != container, 'object is its own container?' if container is None: if doc.canonical_name is UNKNOWN: return ['??']+crumbs This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 12:15:29
|
Revision: 1275 Author: edloper Date: 2006-08-21 05:15:25 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1275&view=rev Log Message: ----------- - Fixed bug with printing of exceptions list for function details. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 12:14:48 UTC (rev 1274) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-21 12:15:25 UTC (rev 1275) @@ -2044,7 +2044,7 @@ >>> #endif $self.labelled_list_item( "<code><strong class=\'fraise\'>" + - name + "</strong></code>", + str(name) + "</strong></code>", self.docstring_to_html(descr, func_doc, 8))$ >>> #endfor </ul> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-22 01:32:41
|
Revision: 1283 Author: edloper Date: 2006-08-21 18:32:36 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1283&view=rev Log Message: ----------- Fixed SF bug [ 1501877 ] No indication of decorators in default class view. (Added 'Static Method' or 'Class Method' label right under the function signature in the details section, and removed @staticmethod and @classmethod from the decorators list. Also, put a <code>@...</code> around each decorator in the decorator list. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-22 01:14:31 UTC (rev 1282) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-22 01:32:36 UTC (rev 1283) @@ -1997,6 +1997,12 @@ >>> if var_doc.name in self.SPECIAL_METHODS: <br /><em class="fname">($self.SPECIAL_METHODS[var_doc.name]$)</em> >>> #endif + >>> if isinstance(func_doc, ClassMethodDoc): + <br /><em class="fname">Class Method</em> + >>> #endif + >>> if isinstance(func_doc, StaticMethodDoc): + <br /><em class="fname">Static Method</em> + >>> #endif </h3> </td><td align="right" valign="top" >$self.pysrc_link(func_doc)$ </span @@ -2029,7 +2035,12 @@ <dl><dt>Decorators:</dt></dl> <ul class="nomargin"> >>> for deco in func_doc.decorators: - <li>$deco$</li> + >>> # (staticmethod & classmethod are already shown, above) + >>> if not ((deco=="staticmethod" and + >>> isinstance(func_doc, StaticMethodDoc)) or + >>> (deco=="classmethod" and + >>> isinstance(func_doc, ClassMethodDoc))): + <li><code>@$deco$</code></li> >>> #endfor </ul> >>> #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-22 06:15:39
|
Revision: 1288 Author: edloper Date: 2006-08-21 23:15:35 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1288&view=rev Log Message: ----------- - Added metadata sections for variable & property details sections. - Rearranged the property details section a little. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-22 06:00:44 UTC (rev 1287) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-22 06:15:35 UTC (rev 1288) @@ -2152,18 +2152,19 @@ <h3 class="epydoc">$var_doc.name$</h3> $descr$ <dl><dt></dt><dd> - >>> if prop_doc.type_descr not in (None, UNKNOWN): - <dl><dt>Type:</dt> - <dd>$self.type_descr(var_doc, indent=6)$</dd></dl> - >>> #endif >>> for (name, val, summary) in accessors: - <dt>$name$ Method:</dt> + <dl><dt>$name$ Method:</dt> <dd>$val$ >>> if summary: - $summary$ >>> #endif - </dd> + </dd></dl> >>> #endfor + >>> if prop_doc.type_descr not in (None, UNKNOWN): + <dl><dt>Type:</dt> + <dd>$self.type_descr(var_doc, indent=6)$</dd></dl> + >>> #endif + >>> self.write_standard_fields(out, prop_doc) </dd></dl> </td></tr></table> </div> @@ -2187,6 +2188,7 @@ <dl><dt>Type:</dt> <dd>$self.type_descr(var_doc, indent=6)$</dd></dl> >>> #endif + >>> self.write_standard_fields(out, var_doc) >>> if var_doc.value is not UNKNOWN: <dl><dt>Value:</dt> <dd><table><tr><td><pre class="variable"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-22 07:32:07
|
Revision: 1291 Author: edloper Date: 2006-08-22 00:31:56 -0700 (Tue, 22 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1291&view=rev Log Message: ----------- - Generalized metadata index code. - Added metadata indices for @deprecated and @since. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-22 06:36:54 UTC (rev 1290) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-22 07:31:56 UTC (rev 1291) @@ -412,7 +412,8 @@ for doc in self.module_list: if isinstance(doc, ModuleDoc) and is_src_filename(doc.filename): self.modules_with_sourcecode.add(doc) - self._num_files = len(self.class_list) + 2*len(self.module_list) + 14 + self._num_files = (len(self.class_list) + 2*len(self.module_list) + + 11 + len(self.METADATA_INDICES)) if self._incl_sourcecode: self._num_files += len(self.modules_with_sourcecode) @@ -512,10 +513,9 @@ # Write the term & identifier indices indices = {'ident': self.build_identifier_index(), - 'term': self.build_term_index(), - 'bug': self.build_metadata_index('bug'), - 'todo': self.build_metadata_index('todo'), - 'change': self.build_metadata_index('change')} + 'term': self.build_term_index()} + for (name, label, label2) in self.METADATA_INDICES: + indices[name] = self.build_metadata_index(name) self._write(self.write_link_index, directory, 'identifier-index.html', indices, 'Identifier Index', 'identifier-index.html', 'ident') @@ -525,21 +525,14 @@ 'term-index.html', 'term') else: self._files_written += 1 # (skipped) - if indices['bug']: - self._write(self.write_metadata_index, directory, - 'bug-index.html', indices, 'bug', 'Bug List') - else: - self._files_written += 1 # (skipped) - if indices['todo']: - self._write(self.write_metadata_index, directory, - 'todo-index.html', indices, 'todo', 'To Do List') - else: - self._files_written += 1 # (skipped) - if indices['change']: - self._write(self.write_metadata_index, directory, - 'change-index.html', indices, 'change', 'Change Log') - else: - self._files_written += 1 # (skipped) + for (name, label, label2) in self.METADATA_INDICES: + if indices[name]: + self._write(self.write_metadata_index, directory, + '%s-index.html' % name, indices, name, + label, label2) + else: + self._files_written += 1 # (skipped) + # Write the trees file (package & class hierarchies) if self.module_list: @@ -597,7 +590,10 @@ log.docstring_warning(estr) # [xx] testing: - assert self._num_files == self._files_written + if self._num_files != int(self._files_written): + log.debug("Expected to write %d files, but actually " + "wrote %d files" % + (self._num_files, int(self._files_written))) def _write(self, write_func, directory, filename, *args): # Display our progress. @@ -940,7 +936,7 @@ self.write_navbar(out, 'indices') self.write_footer(out) - def write_metadata_index(self, out, indices, field, title): + def write_metadata_index(self, out, indices, field, title, typ): """ Write an HTML page containing a metadata index. """ @@ -973,7 +969,8 @@ out('<div>\n') out('<table width="100%" class="metadata-index" ' 'bgcolor="#e0e0e0"><tr><td class="metadata-index">') - out('<b>In %s</b>' % self.href(doc, label=doc.canonical_name)) + out('<b>%s in %s</b>' % + (typ, self.href(doc, label=doc.canonical_name))) out(' <ul class="nomargin">\n') for descr in descrs: out(' <li>%s</li>\n' % @@ -996,19 +993,17 @@ self.write_header(out, title) self.write_navbar(out, 'indices') self.write_breadcrumbs(out, 'indices', url) - - if (indices['term'] or indices['bug'] or - indices['todo'] or indices['change']): + + if (indices['term'] or + [1 for (name,l,l2) in self.METADATA_INDICES if indices[name]]): out('<center><b>[\n') - out(' <a href="identifier-index.html">Identifier Index</a>\n') + out(' <a href="identifier-index.html">Identifiers</a>\n') if indices['term']: - out('| <a href="term-index.html">Term Definition Index</a>\n') - if indices['bug']: - out('| <a href="bug-index.html">Bug List</a>\n') - if indices['todo']: - out('| <a href="todo-index.html">To Do List</a>\n') - if indices['change']: - out('| <a href="change-index.html">Change Log</a>\n') + out('| <a href="term-index.html">Term Definitions</a>\n') + for (name, label, label2) in self.METADATA_INDICES: + if indices[name]: + out('| <a href="%s-index.html">%s</a>\n' % + (name, label2)) out(']</b></center><br />\n') def write_index_section(self, out, items, add_blankline=False): @@ -2685,6 +2680,18 @@ #//////////////////////////////////////////////////////////// #{ Index generation #//////////////////////////////////////////////////////////// + + #: A list of metadata indices that should be generated. Each + #: entry in this list is a tuple C{(tag, label, short_label)}, + #: where C{tag} is the cannonical tag of a metadata field; + #: C{label} is a label for the index page; and C{short_label} + #: is a shorter label, used in the index selector. + METADATA_INDICES = [('bug', 'Bug List', 'Bugs'), + ('todo', 'To Do List', 'To Do'), + ('change', 'Change Log', 'Changes'), + ('deprecated', 'Deprecation List', 'Deprecations'), + ('since', 'Introductions List', 'Introductions'), + ] def build_identifier_index(self): items = [] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-23 15:06:30
|
Revision: 1305 Author: edloper Date: 2006-08-23 08:06:25 -0700 (Wed, 23 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1305&view=rev Log Message: ----------- - Docstring fix for HTMLWriter - Check if pyval_repr is available, even if pyval is UNKNOWN. This is used if we're writing html for docs came from a pickle. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-23 15:01:24 UTC (rev 1304) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-23 15:06:25 UTC (rev 1305) @@ -282,8 +282,8 @@ end of their group; if C{inheritance='included'}, then inherited objects are mixed in with non-inherited objects. The default is 'grouped'. - @type include_sourcecode: C{boolean} - @param include_sourcecode: If true, then generate colorized + @type include_source_code: C{boolean} + @param include_sourc_ecode: If true, then generate colorized source code files for each python module. """ self.docindex = docindex @@ -696,6 +696,8 @@ #//////////////////////////////////////////////////////////// def write_sourcecode(self, out, doc, name_to_docs): + t0 = time.time() + filename = doc.filename name = str(doc.canonical_name) @@ -715,6 +717,9 @@ # Footer self.write_navbar(out, doc) self.write_footer(out) + + #log.debug('[%6.2f sec] Wrote pysrc for %s' % + # (time.time()-t0, name)) #//////////////////////////////////////////////////////////// #{ 2.2. Class Pages @@ -2239,6 +2244,8 @@ if val_doc is UNKNOWN: return '' if val_doc.pyval is not UNKNOWN: return self.pprint_pyval(val_doc.pyval) + elif val_doc.pyval_repr() is not UNKNOWN: + s = plaintext_to_html(val_doc.pyval_repr()) elif val_doc.parse_repr is not UNKNOWN: s = plaintext_to_html(val_doc.parse_repr) else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-23 15:39:01
|
Revision: 1307 Author: edloper Date: 2006-08-23 08:38:56 -0700 (Wed, 23 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1307&view=rev Log Message: ----------- - Fixed 'failed identifier crossreference' detection. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-23 15:29:41 UTC (rev 1306) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-23 15:38:56 UTC (rev 1307) @@ -9,6 +9,8 @@ """ The HTML output generator for epydoc. The main interface provided by this module is the L{HTMLWriter} class. + +@todo: Add a cache to L{HTMLWriter.url()}? """ __docformat__ = 'epytext en' @@ -696,7 +698,7 @@ #//////////////////////////////////////////////////////////// def write_sourcecode(self, out, doc, name_to_docs): - t0 = time.time() + #t0 = time.time() filename = doc.filename name = str(doc.canonical_name) @@ -3113,22 +3115,20 @@ # Translate it into HTML. if doc is None: + self._failed_xref(identifier) return '<code class="link">%s</code>' % label else: return self.htmlwriter.href(doc, label, 'link') # [xx] Should this be added to the DocstringLinker interface??? + # Currently, this is *only* used by dotgraph. def url_for(self, identifier): if isinstance(identifier, (basestring, DottedName)): doc = self.docindex.find(identifier, self.container) if doc: return self.htmlwriter.url(doc) else: - # [xx] ignore if it's inside an import?? - # Record that we failed to find it. - failed_xrefs = self.htmlwriter._failed_xrefs - context = self.container.canonical_name - failed_xrefs.setdefault(identifier,{})[context] = 1 + return None elif isinstance(identifier, APIDoc): return self.htmlwriter.url(identifier) @@ -3137,3 +3137,9 @@ else: raise TypeError('Expected string or APIDoc') + def _failed_xref(self, identifier): + """Add an identifier to the htmlwriter's failed crossreference + list.""" + failed_xrefs = self.htmlwriter._failed_xrefs + context = self.container.canonical_name + failed_xrefs.setdefault(identifier,{})[context] = 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-23 16:45:05
|
Revision: 1312 Author: edloper Date: 2006-08-23 09:44:57 -0700 (Wed, 23 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1312&view=rev Log Message: ----------- - fixed minor (inconsequential) spacing typo Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-23 16:18:04 UTC (rev 1311) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-23 16:44:57 UTC (rev 1312) @@ -2692,7 +2692,7 @@ <li> $self.description(descr, doc, 8)$ </li> - >>> # end for + >>> # end for </ul> >>> # end else >>> # end for This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-24 20:22:31
|
Revision: 1325 Author: edloper Date: 2006-08-24 13:22:28 -0700 (Thu, 24 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1325&view=rev Log Message: ----------- - If the identifier index page contains at least 3000 entries, the split it into sub-pages, one for each letter section. - Reduced whitespace in index pages (to make them load a little faster -- they can get to be quite large.) Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-24 18:56:43 UTC (rev 1324) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-08-24 20:22:28 UTC (rev 1325) @@ -289,7 +289,7 @@ source code files for each python module. """ self.docindex = docindex - + # Process keyword arguments. self._show_private = kwargs.get('show_private', 1) """Should private docs be included?""" @@ -407,6 +407,10 @@ # Figure out the url for the top page. self._top_page_url = self._find_top_page(self._top_page) + + # Decide whether or not to split the identifier index. + self._split_ident_index = (len(self.indexed_docs) >= + self.SPLIT_IDENT_INDEX_SIZE) # Figure out how many output files there will be (for progress # reporting). @@ -418,6 +422,8 @@ 11 + len(self.METADATA_INDICES)) if self._incl_sourcecode: self._num_files += len(self.modules_with_sourcecode) + if self._split_ident_index: + self._num_files += len(self.LETTERS) def _find_top_page(self, pagename): """ @@ -513,20 +519,48 @@ # Write images. self.write_images(directory) - # Write the term & identifier indices + # Build the indices. indices = {'ident': self.build_identifier_index(), 'term': self.build_term_index()} for (name, label, label2) in self.METADATA_INDICES: indices[name] = self.build_metadata_index(name) - self._write(self.write_link_index, directory, - 'identifier-index.html', indices, - 'Identifier Index', 'identifier-index.html', 'ident') + + # Write the identifier index. If requested, split it into + # separate pages for each letter. + ident_by_letter = self._group_by_letter(indices['ident']) + if not self._split_ident_index: + self._write(self.write_link_index, directory, + 'identifier-index.html', indices, + 'Identifier Index', 'identifier-index.html', + ident_by_letter) + else: + # Write a page for each section. + for letter in self.LETTERS: + filename = 'identifier-index-%s.html' % letter + self._write(self.write_link_index, directory, filename, + indices, 'Identifier Index', filename, + ident_by_letter, [letter], + 'identifier-index-%s.html') + # Use the first non-empty section as the main index page. + for letter in self.LETTERS: + if letter in ident_by_letter: + filename = 'identifier-index.html' + self._write(self.write_link_index, directory, filename, + indices, 'Identifier Index', filename, + ident_by_letter, [letter], + 'identifier-index-%s.html') + break + + # Write the term index. if indices['term']: + term_by_letter = self._group_by_letter(indices['term']) self._write(self.write_link_index, directory, 'term-index.html', indices, 'Term Definition Index', - 'term-index.html', 'term') + 'term-index.html', term_by_letter) else: self._files_written += 1 # (skipped) + + # Write the metadata indices. for (name, label, label2) in self.METADATA_INDICES: if indices[name]: self._write(self.write_metadata_index, directory, @@ -535,7 +569,6 @@ else: self._files_written += 1 # (skipped) - # Write the trees file (package & class hierarchies) if self.module_list: self._write(self.write_module_tree, directory, 'module-tree.html') @@ -905,57 +938,51 @@ #{ 2.4. Index pages #//////////////////////////////////////////////////////////// - SPLIT_LINK_INDEX_SIZE = 10 - """If a link index has more than this number of entries, then it - will be split into alphabetical sections. Use 0 to always split - link indexes into alphabetical sections.""" + SPLIT_IDENT_INDEX_SIZE = 3000 + """If the identifier index has more than this number of entries, + then it will be split into separate pages, one for each + alphabetical section.""" - def write_link_index(self, out, indices, title, url, index_name): - index = indices[index_name] + LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_' + """The alphabetical sections that are used for link index pages.""" + + def write_link_index(self, out, indices, title, url, index_by_section, + sections=LETTERS, section_url='#%s'): - # Header material. + # Header self.write_indexpage_header(out, indices, title, url) - # If the index is small enough, then don't bother to make - # alphabetical sections; just list it all in one section. - if len(index) < self.SPLIT_LINK_INDEX_SIZE: - out('<h1 class="epydoc">%s</h1><br />\n' % title) - self.write_index_section(out, index) + # Index title & links to alphabetical sections. + out('<table border="0" width="100%">\n' + '<tr valign="bottom"><td>\n') + out('<h1 class="epydoc">%s</h1>\n</td><td>\n[\n' % title) + for sec in self.LETTERS: + if sec in index_by_section: + out(' <a href="%s">%s</a>\n' % (section_url % sec, sec)) + else: + out(' %s\n' % sec) + out(']\n') + out('</td></table>\n') - # Otherwise, group the index by letter, and write one section - # per letter. - else: - index = self._group_by_letter(index) - - # Header & links to alphabetical sections. - out('<table border="0" width="100%">\n' - '<tr valign="bottom"><td>\n') - out('<h1 class="epydoc">%s</h1>\n</td><td>\n[\n' % title) - for letter in 'ABCDEFGHIJKLMNOPQRSTUVWZYZ_': - if letter in index: - out(' <a href="#%s">%s</a>\n' % (letter, letter)) - else: - out(' %s\n' % letter) - out(']\n') - out('</td></table>\n') - - # Alphabetical sections. + # Alphabetical sections. + sections = [s for s in sections if s in index_by_section] + if sections: out('<table border="0" width="100%"><tr valign="top">\n') - for letter in sorted(index.iterkeys()): + for section in sorted(sections): out('<td valign="top" width="1%">') out('<a name="%s"><h2 class="epydoc">%s</h2></a></td>\n' % - (letter, letter)) + (section, section)) out('<td valign="top">\n') - section = index[letter] - self.write_index_section(out, section, True) + self.write_index_section(out, index_by_section[section], True) out('</td></tr>\n') out('</table>\n</br />') - + # Footer material. out('<br />') self.write_navbar(out, 'indices') self.write_footer(out) - + + def write_metadata_index(self, out, indices, field, title, typ): """ Write an HTML page containing a metadata index. @@ -1030,15 +1057,15 @@ out('<table class="link-index" width="100%" border="1">\n') num_rows = (len(items)+2)/3 for row in range(num_rows): - out(' <tr>\n') + out('<tr>\n') for col in range(3): - out(' <td width="33%" class="link-index">') + out('<td width="33%" class="link-index">') i = col*num_rows+row if i < len(items): name, url, container = items[col*num_rows+row] out('<a href="%s">%s</a>' % (url, name)) if container is not None: - out('<br />\n ') + out('<br />\n') if isinstance(container, ModuleDoc): label = container.canonical_name else: @@ -1048,10 +1075,10 @@ else: out(' ') out('</td>\n') - out(' </tr>\n') + out('</tr>\n') if add_blankline and num_rows == 1: blank_cell = '<td class="link-index"> </td>' - out(' <tr>'+3*blank_cell+'</tr>\n') + out('<tr>'+3*blank_cell+'</tr>\n') out('</table>\n') #//////////////////////////////////////////////////////////// This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-09-02 00:54:37
|
Revision: 1342 http://svn.sourceforge.net/epydoc/?rev=1342&view=rev Author: edloper Date: 2006-09-01 17:54:33 -0700 (Fri, 01 Sep 2006) Log Message: ----------- - Added a cache to HTMLWriter.url() Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-02 00:53:39 UTC (rev 1341) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-02 00:54:33 UTC (rev 1342) @@ -886,8 +886,7 @@ the top-level list is a class with no (documented) bases; and under each class is listed all of its subclasses. Note that in the case of multiple inheritance, a class may appear - multiple times. This is used by L{write_trees} to write - the class hierarchy. + multiple times. @todo: For multiple inheritance, don't repeat subclasses the second time a class is mentioned; instead, link to the @@ -2906,11 +2905,23 @@ ''') # \------------------------------------------------------------/ + _url_cache = {} def url(self, obj): """ Return the URL for the given object, which can be a C{VariableDoc}, a C{ValueDoc}, or a C{DottedName}. """ + cached_url = self._url_cache.get(id(obj)) + if cached_url is not None: + return cached_url + else: + url = self._url_cache[id(obj)] = self._url(obj) + return url + + def _url(self, obj): + """ + Internal helper for L{url}. + """ # Module: <canonical_name>-module.html if isinstance(obj, ModuleDoc): if obj not in self.module_set: return None This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-09-06 15:51:19
|
Revision: 1353 http://svn.sourceforge.net/epydoc/?rev=1353&view=rev Author: edloper Date: 2006-09-06 08:51:15 -0700 (Wed, 06 Sep 2006) Log Message: ----------- - Added a couple sanity checks Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-06 15:50:54 UTC (rev 1352) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-06 15:51:15 UTC (rev 1353) @@ -2277,6 +2277,11 @@ s = plaintext_to_html(val_doc.pyval_repr()) elif val_doc.parse_repr is not UNKNOWN: s = plaintext_to_html(val_doc.parse_repr) + elif isinstance(val_doc, GenericValueDoc): + # This *should* never happen -- GenericValueDoc's should always + # have a pyval_repr or a parse_repr. + log.debug('pprint_value() got GenericValueDoc w/ UNKNOWN repr') + return '' else: s = self.href(val_doc) return self._linewrap_html(s, self._variable_linelen, @@ -3031,6 +3036,10 @@ label = target.canonical_name elif isinstance(target, DottedName): label = target + elif isinstance(target, GenericValueDoc): + raise ValueError("href() should not be called with " + "GenericValueDoc objects (perhaps you " + "meant to use the containing variable?)") else: raise ValueError("Unable to find a label for %r" % target) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2006-09-16 13:59:14
|
Revision: 1399 http://svn.sourceforge.net/epydoc/?rev=1399&view=rev Author: dvarrazzo Date: 2006-09-16 06:59:05 -0700 (Sat, 16 Sep 2006) Log Message: ----------- - Dropped unmatched </span> Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-16 13:53:17 UTC (rev 1398) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-16 13:59:05 UTC (rev 1399) @@ -2085,8 +2085,8 @@ >>> #endif </h3> </td><td align="right" valign="top" - >$self.pysrc_link(func_doc)$ </span - >$self.callgraph_link(callgraph)$</td> + >$self.pysrc_link(func_doc)$ + $self.callgraph_link(callgraph)$</td> </table> $self.render_callgraph(callgraph)$ $descr$ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2006-09-17 15:04:47
|
Revision: 1400 http://svn.sourceforge.net/epydoc/?rev=1400&view=rev Author: dvarrazzo Date: 2006-09-17 08:04:40 -0700 (Sun, 17 Sep 2006) Log Message: ----------- - Fixed URLs reported malformed by HTML Tidy Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-16 13:59:05 UTC (rev 1399) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-17 15:04:40 UTC (rev 1400) @@ -1499,7 +1499,7 @@ def callgraph_link(self, callgraph): # Use class=codelink, to match style w/ the source code link. if callgraph is None: return '' - return ('<br /><span class="codelink"><a href="javascript: void(0);" ' + return ('<br /><span class="codelink"><a href="javascript:void(0);" ' 'onclick="toggleCallGraph(\'%s-div\');return false;">' 'call graph</a></span> ' % callgraph.uid) @@ -2882,7 +2882,7 @@ TABLE_FOOTER = '</table>\n' PRIVATE_LINK = ''' - <span class="options">[<a href="javascript: void(0);" class="privatelink" + <span class="options">[<a href="javascript:void(0);" class="privatelink" onclick="toggle_private();">hide private</a>]</span> '''.strip() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2006-09-17 17:54:52
|
Revision: 1401 http://svn.sourceforge.net/epydoc/?rev=1401&view=rev Author: dvarrazzo Date: 2006-09-17 10:54:47 -0700 (Sun, 17 Sep 2006) Log Message: ----------- - An empty "Decorators:" fields group is not shown if ``classmethod`` and ``staticmethod`` are the only decorators of a method. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-17 15:04:40 UTC (rev 1400) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-17 17:54:47 UTC (rev 1401) @@ -2111,11 +2111,21 @@ <dl><dt>Returns: <code>$rtype$</code></dt></dl> >>> #endif >>> # === decorators === - >>> if func_doc.decorators not in (None, UNKNOWN, (), []): + >>> if func_doc.decorators not in (None, UNKNOWN): + >>> # (staticmethod & classmethod are already shown, above) + >>> decos = filter(lambda deco: + >>> not ((deco=="staticmethod" and + >>> isinstance(func_doc, StaticMethodDoc)) or + >>> (deco=="classmethod" and + >>> isinstance(func_doc, ClassMethodDoc))), + >>> func_doc.decorators) + >>> else: + >>> decos = None + >>> #endif + >>> if decos: <dl><dt>Decorators:</dt></dl> <ul class="nomargin"> - >>> for deco in func_doc.decorators: - >>> # (staticmethod & classmethod are already shown, above) + >>> for deco in decos: >>> if not ((deco=="staticmethod" and >>> isinstance(func_doc, StaticMethodDoc)) or >>> (deco=="classmethod" and This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2006-09-17 20:02:39
|
Revision: 1403 http://svn.sourceforge.net/epydoc/?rev=1403&view=rev Author: dvarrazzo Date: 2006-09-17 13:02:33 -0700 (Sun, 17 Sep 2006) Log Message: ----------- - Dropped check not required anymore after r1401 Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-17 18:21:05 UTC (rev 1402) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-09-17 20:02:33 UTC (rev 1403) @@ -2128,10 +2128,6 @@ <dl><dt>Decorators:</dt></dl> <ul class="nomargin"> >>> for deco in decos: - >>> if not ((deco=="staticmethod" and - >>> isinstance(func_doc, StaticMethodDoc)) or - >>> (deco=="classmethod" and - >>> isinstance(func_doc, ClassMethodDoc))): <li><code>@$deco$</code></li> >>> #endfor </ul> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2006-12-02 22:26:12
|
Revision: 1411 http://svn.sourceforge.net/epydoc/?rev=1411&view=rev Author: dvarrazzo Date: 2006-12-02 14:26:09 -0800 (Sat, 02 Dec 2006) Log Message: ----------- - Don't report references to builtins as missing. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2006-10-13 00:35:28 UTC (rev 1410) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2006-12-02 22:26:09 UTC (rev 1411) @@ -16,6 +16,7 @@ import re, os, sys, codecs, sre_constants, pprint, base64 import urllib +import __builtin__ from epydoc.apidoc import * import epydoc.docstringparser import time, epydoc, epydoc.markup @@ -624,6 +625,11 @@ log.progress(self._files_written/self._num_files, 'index.html') self.write_homepage(directory) + # Don't report references to builtins as missing + for k in self._failed_xrefs.keys(): # have a copy of keys + if hasattr(__builtin__, k): + del self._failed_xrefs[k] + # Report any failed crossreferences if self._failed_xrefs: estr = 'Failed identifier crossreference targets:\n' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-01-28 13:40:39
|
Revision: 1419 http://svn.sourceforge.net/epydoc/?rev=1419&view=rev Author: dvarrazzo Date: 2007-01-28 05:40:36 -0800 (Sun, 28 Jan 2007) Log Message: ----------- - Fixed '_find_top_page()' fallback (closes SF bug #1646232) Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2007-01-17 23:45:21 UTC (rev 1418) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2007-01-28 13:40:36 UTC (rev 1419) @@ -457,6 +457,7 @@ # Otherwise, give up. log.warning('Could not find top page %r; using %s ' 'instead' % (pagename, self._trees_url)) + return self._trees_url # If no page name was specified, then try to choose one # automatically. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-01-28 14:19:34
|
Revision: 1420 http://svn.sourceforge.net/epydoc/?rev=1420&view=rev Author: dvarrazzo Date: 2007-01-28 06:19:30 -0800 (Sun, 28 Jan 2007) Log Message: ----------- - Fixed nested list generation - now xhtml well formed. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2007-01-28 13:40:36 UTC (rev 1419) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2007-01-28 14:19:30 UTC (rev 1420) @@ -2650,13 +2650,13 @@ if doc.summary not in (None, UNKNOWN): out(': <em class="summary">'+ self.description(doc.summary, doc, 8)+'</em>') - out('</li>\n') if doc.submodules != UNKNOWN and doc.submodules: - if priv: out(' <ul class="private">\n') - else: out(' <ul>\n') + if priv: out('\n <ul class="private">\n') + else: out('\n <ul>\n') for submodule in doc.submodules: self.write_module_tree_item(out, submodule, package=doc) - out(' </ul>\n </li>\n') + out(' </ul>\n') + out(' </li>\n') #//////////////////////////////////////////////////////////// #{ Class trees This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-14 16:57:36
|
Revision: 1505 http://svn.sourceforge.net/epydoc/?rev=1505&view=rev Author: edloper Date: 2007-02-14 08:57:34 -0800 (Wed, 14 Feb 2007) Log Message: ----------- - Added redirect page <redirect.html> that redirects dotted names to corresponding pages using javascript. When the user visits <redirect.html#dotted.name>, they will automatically get redirected to the page for the object with the given fully-qualified dotted name. E.g., for epydoc, <redirect.html#epydoc.apidoc.UNKNOWN> redirects the user to <epydoc.apidoc-module.html#UNKNOWN>. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2007-02-14 12:00:32 UTC (rev 1504) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2007-02-14 16:57:34 UTC (rev 1505) @@ -430,7 +430,7 @@ if isinstance(doc, ModuleDoc) and is_src_filename(doc.filename): self.modules_with_sourcecode.add(doc) self._num_files = (len(self.class_list) + 2*len(self.module_list) + - 11 + len(self.METADATA_INDICES)) + 12 + len(self.METADATA_INDICES)) if self._incl_sourcecode: self._num_files += len(self.modules_with_sourcecode) if self._split_ident_index: @@ -644,6 +644,9 @@ self._write(self.write_sourcecode, directory, filename, doc, name_to_docs) + # Write the auto-redirect page. + self._write(self.write_redirect_page, directory, 'redirect.html') + # Write the index.html files. # (this must be done last, since it might copy another file) self._files_written += 1 @@ -1402,6 +1405,8 @@ print >> jsfile, self.HIDE_PRIVATE_JS print >> jsfile, self.TOGGLE_CALLGRAPH_JS print >> jsfile, html_colorize.PYSRC_JAVASCRIPTS + print >> jsfile, self.GET_ANCHOR_JS + print >> jsfile, self.REDIRECT_URL_JS jsfile.close() #: A javascript that is used to show or hide the API documentation @@ -1510,6 +1515,48 @@ } '''.strip() + GET_ANCHOR_JS = ''' + function get_anchor() { + var href = location.href; + var start = href.indexOf("#")+1; + if ((start != 0) && (start != href.length)) + return href.substring(start, href.length); + } + '''.strip() + + #: A javascript that is used to implement the auto-redirect page. + #: When the user visits <redirect.html#dotted.name>, they will + #: automatically get redirected to the page for the object with + #: the given fully-qualified dotted name. E.g., for epydoc, + #: <redirect.html#epydoc.apidoc.UNKNOWN> redirects the user to + #: <epydoc.apidoc-module.html#UNKNOWN>. + REDIRECT_URL_JS = ''' + function redirect_url(dottedName) { + // Scan through each element of the "pages" list, and check + // if "name" matches with any of them. + for (var i=0; i<pages.length; i++) { + + // Each page has the form "<pagename>-m" or "<pagename>-c"; + // extract the <pagename> portion & compare it to dottedName. + var pagename = pages[i].substring(0, pages[i].length-2); + if (pagename == dottedName.substring(0,pagename.length)) { + + // We\'ve found a page that matches `dottedName`; + // construct its URL, using leftover `dottedName` + // content to form an anchor. + var pagetype = pages[i].charAt(pages[i].length-1); + var url = pagename + ((pagetype=="m")?"-module.html": + "-class.html"); + if (dottedName.length > pagename.length) + url += "#" + dottedName.substring(pagename.length+1, + dottedName.length); + return url; + } + } + } + '''.strip() + + #//////////////////////////////////////////////////////////// #{ 2.10. Graphs #//////////////////////////////////////////////////////////// @@ -2786,6 +2833,82 @@ return "index-"+re.sub("[^a-zA-Z0-9]", "_", s) #//////////////////////////////////////////////////////////// + #{ Redirect page + #//////////////////////////////////////////////////////////// + + def write_redirect_page(self, out): + """ + Build the auto-redirect page, which translates dotted names to + URLs using javascript. When the user visits + <redirect.html#dotted.name>, they will automatically get + redirected to the page for the object with the given + fully-qualified dotted name. E.g., for epydoc, + <redirect.html#epydoc.apidoc.UNKNOWN> redirects the user to + <epydoc.apidoc-module.html#UNKNOWN>. + """ + # Construct a list of all the module & class pages that we're + # documenting. The redirect_url javascript will scan through + # this list, looking for a page name that matches the + # requested dotted name. + pages = (['%s-m' % val_doc.canonical_name + for val_doc in self.module_list] + + ['%s-c' % val_doc.canonical_name + for val_doc in self.class_list]) + # Sort the pages from longest to shortest. This ensures that + # we find e.g. "x.y.z" in the list before "x.y". + pages = sorted(pages, key=lambda p:-len(p)) + + # Write the redirect page. + self._write_redirect_page(out, pages) + + _write_redirect_page = compile_template( + ''' + _write_redirect_page(self, out, pages) + ''', + # /------------------------- Template -------------------------\ + ''' + <html><head><title>Epydoc Redirect Page</title> + <meta http-equiv="cache-control" content="no-cache" /> + <meta http-equiv="expires" content="0" /> + <meta http-equiv="pragma" content="no-cache" /> + <script type="text/javascript" src="epydoc.js"></script> + </head> + <body> + <script type="text/javascript"> + <!-- + var pages = $"[%s]" % ", ".join(['"%s"' % v for v in pages])$; + var dottedName = get_anchor(); + if (dottedName) { + var target = redirect_url(dottedName); + if (target) window.location.replace(target); + } + // --> + </script> + + <h3>Epydoc Auto-redirect page</h3> + + <p>When javascript is enabled, this page will redirect URLs of + the form <tt>redirect.html#<i>dotted.name</i></tt> to the + documentation for the object with the given fully-qualified + dotted name.</p> + <p><a id="message"> </a></p> + + <script type="text/javascript"> + <!-- + if (dottedName) { + var msg = document.getElementById("message"); + msg.innerHTML = "No documentation found for <tt>"+ + dottedName+"</tt>"; + } + // --> + </script> + + </body> + </html> + ''') + # \------------------------------------------------------------/ + + #//////////////////////////////////////////////////////////// #{ Helper functions #//////////////////////////////////////////////////////////// This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-02-25 14:35:18
|
Revision: 1550 http://svn.sourceforge.net/epydoc/?rev=1550&view=rev Author: dvarrazzo Date: 2007-02-25 06:35:15 -0800 (Sun, 25 Feb 2007) Log Message: ----------- - Fixed --no-frames option: frames and relative links are really not generated. - Don't generate links for toggle_private() when --no-private option is used. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2007-02-24 16:23:49 UTC (rev 1549) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2007-02-25 14:35:15 UTC (rev 1550) @@ -429,8 +429,11 @@ for doc in self.module_list: if isinstance(doc, ModuleDoc) and is_src_filename(doc.filename): self.modules_with_sourcecode.add(doc) - self._num_files = (len(self.class_list) + 2*len(self.module_list) + - 13 + len(self.METADATA_INDICES)) + self._num_files = (len(self.class_list) + len(self.module_list) + + 10 + len(self.METADATA_INDICES)) + if self._frames_index: + self._num_files += len(self.module_list) + 3 + if self._incl_sourcecode: self._num_files += len(self.modules_with_sourcecode) if self._split_ident_index: @@ -610,12 +613,13 @@ self._write(self.write_help, directory,'help.html') # Write the frames-based table of contents. - self._write(self.write_frames_index, directory, 'frames.html') - self._write(self.write_toc, directory, 'toc.html') - self._write(self.write_project_toc, directory, 'toc-everything.html') - for doc in self.module_list: - filename = 'toc-%s' % urllib.unquote(self.url(doc)) - self._write(self.write_module_toc, directory, filename, doc) + if self._frames_index: + self._write(self.write_frames_index, directory, 'frames.html') + self._write(self.write_toc, directory, 'toc.html') + self._write(self.write_project_toc, directory, 'toc-everything.html') + for doc in self.module_list: + filename = 'toc-%s' % urllib.unquote(self.url(doc)) + self._write(self.write_module_toc, directory, filename, doc) # Write the object documentation. for doc in self.module_list: @@ -1426,15 +1430,15 @@ for(var i=0; i<elts.length; i++) { if (elts[i].className == "privatelink") { cmd = elts[i].innerHTML; - elts[i].innerHTML = ((cmd=="show private")?"hide private": - "show private"); + elts[i].innerHTML = ((cmd && cmd.substr(0,4)=="show")? + "hide private":"show private"); } } // Update all DIVs containing private objects. var elts = document.getElementsByTagName("div"); for(var i=0; i<elts.length; i++) { if (elts[i].className == "private") { - elts[i].style.display = ((cmd=="hide private")?"none":"block"); + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block"); } } // Update all table rowss containing private objects. Note, we @@ -1444,21 +1448,22 @@ var elts = document.getElementsByTagName("tr"); for(var i=0; i<elts.length; i++) { if (elts[i].className == "private") { - elts[i].style.display = ((cmd=="hide private")?"none":""); + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":""); } } // Update all list items containing private objects. var elts = document.getElementsByTagName("li"); for(var i=0; i<elts.length; i++) { if (elts[i].className == "private") { - elts[i].style.display = ((cmd=="hide private")?"none":"list-item"); + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")? + "none":"list-item"); } } // Update all list items containing private objects. var elts = document.getElementsByTagName("ul"); for(var i=0; i<elts.length; i++) { if (elts[i].className == "private") { - elts[i].style.display = ((cmd=="hide private")?"none":"block"); + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block"); } } // Set a cookie to remember the current option. @@ -1503,7 +1508,7 @@ HIDE_PRIVATE_JS = ''' function checkCookie() { var cmd=getCookie("EpydocPrivate"); - if (cmd!="show private" && location.href.indexOf("#_") < 0) + if (cmd && cmd.substr(0,4)!="show" && location.href.indexOf("#_") < 0) toggle_private(); } '''.strip() @@ -1860,10 +1865,12 @@ >>> if self._show_private: <tr><td align="right">$self.PRIVATE_LINK$</td></tr> >>> #endif + >>> if self._frames_index: <tr><td align="right"><span class="options" >[<a href="frames.html" target="_top">frames</a >] | <a href="$context_url$" target="_top">no frames</a>]</span></td></tr> + >>> #endif </table> </td> </tr> @@ -3007,7 +3014,7 @@ cellspacing="0" width="100%" bgcolor="white"> >>> if heading is not None: <tr bgcolor="#70b0f0" class="table-header"> - >>> if private_link: + >>> if private_link and self._show_private: <td colspan="$colspan$" class="table-header"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr valign="top"> @@ -3032,7 +3039,7 @@ PRIVATE_LINK = ''' <span class="options">[<a href="javascript:void(0);" class="privatelink" - onclick="toggle_private();">hide private</a>]</span> + onclick="toggle_private();">hide private</a>]</span> '''.strip() write_group_header = compile_template( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-03-11 17:29:05
|
Revision: 1583 http://svn.sourceforge.net/epydoc/?rev=1583&view=rev Author: dvarrazzo Date: 2007-03-11 10:28:59 -0700 (Sun, 11 Mar 2007) Log Message: ----------- - Guard against `RoutineDoc` whose ``override`` is not a `RoutineDoc`: sometimes (probably when a parsed valued is not recognized as a function) a `GenericValueDoc` ends up there, making `href()` barf. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html.py Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2007-03-10 21:13:24 UTC (rev 1582) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2007-03-11 17:28:59 UTC (rev 1583) @@ -2322,7 +2322,13 @@ >>> # === overrides === >>> if var_doc.overrides not in (None, UNKNOWN): <dt>Overrides: - $self.href(var_doc.overrides.value, context=var_doc)$ + >>> # Avoid passing GenericValueDoc to href() + >>> if isinstance(var_doc.overrides.value, RoutineDoc): + $self.href(var_doc.overrides.value, context=var_doc)$ + >>> else: + >>> # In this case, a less interesting label is generated. + $self.href(var_doc.overrides, context=var_doc)$ + >>> #endif >>> if (func_doc.docstring in (None, UNKNOWN) and >>> var_doc.overrides.value.docstring not in (None, UNKNOWN)): <dd><em class="note">(inherited documentation)</em></dd> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |