Update of /cvsroot/happydoc/HappyDoc3/happydoclib/docset
In directory sc8-pr-cvs1:/tmp/cvs-serv29704/happydoclib/docset
Modified Files:
docset_MultiHTMLFile.py
Log Message:
Add breadcrumbs to the file header.
Add special case for calculating HREF values to classes from their
owning module.
Fix handling of base class information so that links always point to
the right place when we know where the base class is defined.
Use the new application/x-class mimetype with
PackageTree.getSubNodes() to find classes, instead of poking around
inside the module_info part of the node.
Document classes to their own file when we walk() to a class node. Do
not generate the files when processing the Python file itself.
Index: docset_MultiHTMLFile.py
===================================================================
RCS file: /cvsroot/happydoc/HappyDoc3/happydoclib/docset/docset_MultiHTMLFile.py,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** docset_MultiHTMLFile.py 29 Dec 2002 17:33:17 -0000 1.13
--- docset_MultiHTMLFile.py 1 Jan 2003 14:05:28 -0000 1.14
***************
*** 76,79 ****
--- 76,81 ----
#
+ TRACE_LEVEL=2
+
def entryPoint():
"Return info about this module to the dynamic loader."
***************
*** 92,96 ****
levelTwoHeadingForegroundColor='#000000'
codeForegroundColor='#000088'
!
def getOutputFilenameForPackageTreeNode(self, packageTreeNode, includePath=1):
"""Returns a filename where documentation for packageTreeNode should be written.
--- 94,98 ----
levelTwoHeadingForegroundColor='#000000'
codeForegroundColor='#000088'
!
def getOutputFilenameForPackageTreeNode(self, packageTreeNode, includePath=1):
"""Returns a filename where documentation for packageTreeNode should be written.
***************
*** 108,112 ****
results in : /foo/output/input/bar.py
"""
! trace.into('MultiHTMLFileDocSet', 'getOutputFilenameForPackageTreeNode')
filename = base.MultiFileDocSet.getOutputFilenameForPackageTreeNode(
self,
--- 110,115 ----
results in : /foo/output/input/bar.py
"""
! trace.into('MultiHTMLFileDocSet', 'getOutputFilenameForPackageTreeNode',
! outputLevel=TRACE_LEVEL)
filename = base.MultiFileDocSet.getOutputFilenameForPackageTreeNode(
self,
***************
*** 122,130 ****
else:
#
! # This is a file.
#
filename_with_extension = '%s.html' % filename
! trace.outof(filename_with_extension)
return filename_with_extension
--- 125,133 ----
else:
#
! # This is not a directory (file, module, class, etc.).
#
filename_with_extension = '%s.html' % filename
! trace.outof(filename_with_extension, outputLevel=TRACE_LEVEL)
return filename_with_extension
***************
*** 144,148 ****
return output_name
! def writeFileHeader(self, output, title='', subtitle=''):
"""Given an open output stream, write a header using the title and subtitle.
"""
--- 147,194 ----
return output_name
! def _writeBreadcrumbs(self, output, sourceNode, breadcrumbNode):
! """Write breadcrumb links from the root down to packageTreeNode.
!
! This method actually handles the recursion.
! """
! if not breadcrumbNode:
! return
!
! #
! # Write the rest of the breadcrumbs
! #
! self._writeBreadcrumbs(output, sourceNode, breadcrumbNode.getParent())
!
! #
! # Write our breadcrumb
! #
! if breadcrumbNode.getName() != '__init__.py':
! if sourceNode == breadcrumbNode:
! ref = breadcrumbNode.getName()
! else:
! ref = self._getAnchorTagForPackageTreeNode(sourceNode,
! breadcrumbNode,
! )
! output.write('/ %s '% ref)
! output.write('\n')
!
! return
!
! def writeBreadcrumbs(self, output, packageTreeNode):
! """Write breadcrumb links from the root down to packageTreeNode.
! """
! #
! # Begin breadcrumbs.
! #
! output.write('<!-- breadcrumbs -->\n')
! output.write('<p>\n')
!
! self._writeBreadcrumbs(output, packageTreeNode, packageTreeNode)
!
! output.write('</p>\n')
! output.write('\n<!-- /breadcrumbs -->\n')
! return
!
! def writeFileHeader(self, output, packageTreeNode, title='', subtitle=''):
"""Given an open output stream, write a header using the title and subtitle.
"""
***************
*** 162,167 ****
<body bgcolor="%(bgcolor)s">
! <p><i><a href="%(root)s">Table of Contents</a></i></p>
<table border="0" cellpadding="5" cellspacing="0" width="100%%">
--- 208,217 ----
<body bgcolor="%(bgcolor)s">
+ ''' % locals())
! if packageTreeNode.getParent() is not None:
! self.writeBreadcrumbs(output, packageTreeNode)
!
! output.write('''
<table border="0" cellpadding="5" cellspacing="0" width="100%%">
***************
*** 186,190 ****
"""Given an open output stream, write a footer using the title and subtitle.
"""
- root = 'Need URL for root'
date_str = time.ctime(time.time())
app_version = happydoclib.cvsProductVersion()
--- 236,239 ----
***************
*** 197,202 ****
<hr>
- <p><i><a href="%(root)s">Table of Contents</a></i></p>
-
<font size="-2"><i>This document was automatically generated
%(date_str)s by <a
--- 246,249 ----
***************
*** 252,258 ****
"""Compute the HREF to point from the output file of source to destination.
"""
relative_path = source.getPathToNode(destination)
if not relative_path:
! return '.'
destination_name = destination.getName()
--- 299,336 ----
"""Compute the HREF to point from the output file of source to destination.
"""
+ trace.into('MultiHTMLFileDocSet', '_computeRelativeHREF',
+ source=source.getName(),
+ destination=destination.getName(),
+ outputLevel=TRACE_LEVEL,
+ )
+
relative_path = source.getPathToNode(destination)
+ trace.writeVar(relative_path=relative_path,
+ outputLevel=TRACE_LEVEL)
if not relative_path:
! output_name = self.getOutputFilenameForPackageTreeNode(
! destination,
! includePath=0,
! )
! trace.outof(output_name, outputLevel=TRACE_LEVEL)
! return output_name
!
! destination_mimetype = destination.getMimeType()[0]
! source_mimetype = source.getMimeType()[0]
!
! #
! # Pointing to a class defined by source module.
! #
! if ( (len(relative_path) == 1)
! and
! (destination_mimetype == 'application/x-class')
! and
! (source_mimetype == 'text/x-python')
! and
! (source.get(destination.getName()) is not None)
! ):
! trace.write('adding source to relative path',
! outputLevel=TRACE_LEVEL)
! relative_path = (source.getName(), relative_path[0])
destination_name = destination.getName()
***************
*** 265,268 ****
--- 343,351 ----
includePath=0,
)
+ trace.write('Replacing %s with %s' % (relative_path[-1],
+ output_name,
+ ),
+ outputLevel=TRACE_LEVEL,
+ )
relative_path = relative_path[:-1] + (output_name,)
***************
*** 277,281 ****
href = '/'.join(relative_path)
! #print href
return href
--- 360,364 ----
href = '/'.join(relative_path)
! trace.outof(href, outputLevel=TRACE_LEVEL)
return href
***************
*** 400,403 ****
--- 483,487 ----
trace.into('MultiHTMLFile', 'writeTOCFile',
packageTreeNode=packageTreeNode,
+ outputLevel=TRACE_LEVEL,
)
***************
*** 405,408 ****
--- 489,493 ----
output = self.openOutput(output_filename,
+ packageTreeNode,
title=self.title,
subtitle=packageTreeNode.getRelativeFilename(),
***************
*** 468,472 ****
self.closeOutput(output)
! trace.outof()
return
--- 553,557 ----
self.closeOutput(output)
! trace.outof(outputLevel=TRACE_LEVEL)
return
***************
*** 827,857 ****
return
! def _getBaseClassTree(self, packageTreeNode, className):
! try:
! class_info = packageTreeNode.module_info.getClassInfo(className)
! except KeyError:
base_class_names = []
else:
! base_class_names = self._filterNames(class_info.getBaseClassNames())
!
base_class_trees = []
for base_class_name in base_class_names:
! base_class_tree = self._getBaseClassTree(packageTreeNode,
! base_class_name,
! )
base_class_trees.append( base_class_tree )
! try:
! symbol_info = packageTreeNode.module_info.getClassInfo(className)
! except KeyError:
! ref = className
! else:
! symbol_output_name = self.getOutputFilenameForSymbol(
! packageTreeNode,
! className,
! includePath=0,
)
! ref = '<a href="%s">%s</a>' % (symbol_output_name, className)
!
return (ref, base_class_trees)
--- 912,966 ----
return
! def _getBaseClassTree(self, linkSource, moduleTreeNode, classTreeNode, className):
! trace.into('MultiHTMLFile', '_getBaseClassTree',
! linkSource=linkSource.getName(),
! moduleTreeNode=moduleTreeNode.getName(),
! classTreeNode=(classTreeNode and classTreeNode.getName()),
! the_className=className,
! outputLevel=TRACE_LEVEL,
! )
!
! #
! # Find the list of base classes of the current class
! #
! if classTreeNode is None:
base_class_names = []
else:
! try:
! class_info = classTreeNode.code_info
! except AttributeError:
! base_class_names = []
! else:
! base_class_names = self._filterNames(class_info.getBaseClassNames())
!
! #
! # Build the subtrees from our base classes
! #
base_class_trees = []
for base_class_name in base_class_names:
! base_class_node = moduleTreeNode.findNodeFromDottedName(
! base_class_name,
! )
! base_class_tree = self._getBaseClassTree(
! linkSource,
! moduleTreeNode,
! base_class_node,
! base_class_name,
! )
base_class_trees.append( base_class_tree )
! #
! # Set up the reference for this node
! #
! if classTreeNode:
! ref = self._getAnchorTagForPackageTreeNode(
! source=linkSource,
! destination=classTreeNode,
! title=className,
)
! else:
! ref = className
!
! trace.outof(outputLevel=TRACE_LEVEL)
return (ref, base_class_trees)
***************
*** 863,867 ****
def writeBaseClassNames(self, output, packageTreeNode, classInfo):
! base_class_tree = self._getBaseClassTree(packageTreeNode, classInfo.getName())
#self.writeList(output, base_class_names)
output.write('<p>\n')
--- 972,981 ----
def writeBaseClassNames(self, output, packageTreeNode, classInfo):
! base_class_tree = self._getBaseClassTree(
! linkSource=packageTreeNode,
! moduleTreeNode=packageTreeNode.getParent(),
! classTreeNode=packageTreeNode,
! className=classInfo.getName(),
! )
#self.writeList(output, base_class_names)
output.write('<p>\n')
***************
*** 870,877 ****
return
! def writeOneClassToOutput(self, output, packageTreeNode, className):
"""Writes information about one class to the output stream.
"""
! class_info = packageTreeNode.module_info.getClassInfo(className)
#
--- 984,991 ----
return
! def writeOneClassToOutput(self, output, packageTreeNode):
"""Writes information about one class to the output stream.
"""
! class_info = packageTreeNode.code_info
#
***************
*** 915,919 ****
"""Write descriptions of all of the classes to the output stream.
"""
! class_names = self._filterNames(packageTreeNode.module_info.getClassNames())
if self.sort_names:
--- 1029,1038 ----
"""Write descriptions of all of the classes to the output stream.
"""
! #class_names = self._filterNames(packageTreeNode.module_info.getClassNames())
! classes = packageTreeNode.getSubNodes('application/x-class')
! class_map = {}
! for c in classes:
! class_map[c.getName()] = c
! class_names = self._filterNames(class_map.keys())
if self.sort_names:
***************
*** 923,932 ****
for class_name in class_names:
! symbol_output_name = self.getOutputFilenameForSymbol(
! packageTreeNode,
! class_name,
! includePath=0,
)
- ref = '<a href="%s">%s</a>' % (symbol_output_name, class_name)
class_info = packageTreeNode.module_info.getClassInfo(class_name)
class_info_summary, class_info_format = class_info.getSummaryAndFormat()
--- 1042,1060 ----
for class_name in class_names:
! #symbol_output_name = self.getOutputFilenameForSymbol(
! # packageTreeNode,
! # class_name,
! # includePath=0,
! # )
! class_node = class_map[class_name]
! #symbol_output_name = self.getOutputFilenameForPackageTreeNode(
! # class_node,
! # )
! #ref = '<a href="%s">%s</a>' % (symbol_output_name, class_name)
! ref = self._getAnchorTagForPackageTreeNode(
! source=packageTreeNode,
! destination=class_node,
! title=class_name,
)
class_info = packageTreeNode.module_info.getClassInfo(class_name)
class_info_summary, class_info_format = class_info.getSummaryAndFormat()
***************
*** 938,947 ****
return
! def writeClassesToOutput(self, output, packageTreeNode):
! """Writes information about classes in this module to the output stream.
"""
! class_names = self._filterNames(packageTreeNode.module_info.getClassNames())
! if not class_names:
! return
#
--- 1066,1075 ----
return
! def writePythonFileInfoToOutput(self, output, packageTreeNode):
! """Writes parts of the Python file information to the output stream.
"""
! self.writePythonFileImportsToOutput(output, packageTreeNode)
! self.writeFunctionsToOutput(output, packageTreeNode)
! #self.writeClassesToOutput(output, packageTreeNode)
#
***************
*** 950,996 ****
self.writeClassListForModule(output, packageTreeNode)
- #
- # Document each class in its own file
- #
-
- for class_name in class_names:
-
- #
- # Open a new output stream for the class.
- #
- class_output_name = self.getOutputFilenameForSymbol(
- packageTreeNode,
- class_name,
- includePath=1,
- )
-
- class_output = self.openOutput(
- class_output_name,
- title=self.title,
- subtitle='Class: %s' % class_name,
- )
-
- #
- # Write class documentation
- #
- self.writeOneClassToOutput(
- class_output,
- packageTreeNode,
- class_name,
- )
-
- #
- # Close the class' output stream
- #
- self.closeOutput(class_output)
-
- return
-
- def writePythonFileInfoToOutput(self, output, packageTreeNode):
- """Writes parts of the Python file information to the output stream.
- """
- self.writePythonFileImportsToOutput(output, packageTreeNode)
- self.writeFunctionsToOutput(output, packageTreeNode)
- self.writeClassesToOutput(output, packageTreeNode)
return
--- 1078,1081 ----
***************
*** 1001,1004 ****
--- 1086,1090 ----
trace.into('MultiHTMLFileDocSet', 'processPythonFile',
packageTreeNode=packageTreeNode,
+ outputLevel=TRACE_LEVEL,
)
***************
*** 1010,1015 ****
# be handled as part of the package.
#
! trace.write('skipping __init__.py')
! trace.outof()
return
--- 1096,1101 ----
# be handled as part of the package.
#
! trace.write('skipping __init__.py', outputLevel=TRACE_LEVEL)
! trace.outof(outputLevel=TRACE_LEVEL)
return
***************
*** 1024,1027 ****
--- 1110,1114 ----
output = self.openOutput(output_filename,
+ packageTreeNode,
title=self.title,
subtitle=packageTreeNode.getRelativeFilename(),
***************
*** 1040,1043 ****
self.closeOutput(output)
! trace.outof()
return
--- 1127,1168 ----
self.closeOutput(output)
! trace.outof(outputLevel=TRACE_LEVEL)
! return
!
! def processPythonClass(self, packageTreeNode):
! """Writes information about classes in this module to the output stream.
! """
! #print 'Processing class: %s' % packageTreeNode.getName()
! #
! # Open a new output stream for the class.
! #
! #class_output_name = self.getOutputFilenameForSymbol(
! # packageTreeNode,
! # class_name,
! # includePath=1,
! # )
! class_output_name = self.getOutputFilenameForPackageTreeNode(
! packageTreeNode,
! )
! #print ' output file:', class_output_name
!
! class_output = self.openOutput(
! class_output_name,
! packageTreeNode,
! title=self.title,
! subtitle='Class: %s' % packageTreeNode.getName(),
! )
!
! #
! # Write class documentation
! #
! self.writeOneClassToOutput(
! class_output,
! packageTreeNode,
! )
!
! #
! # Close the class' output stream
! #
! self.closeOutput(class_output)
return
|