\n') self._writeBreadcrumbs(output, packageTreeNode, packageTreeNode) output.write('
\n') output.write('\n\n') return def writeFileHeader(self, output, packageTreeNode, title='', subtitle=''): """Given an open output stream, write a header using the title and subtitle. """ title_bg = self.levelOneHeadingBackgroundColor title_fg = self.levelOneHeadingForegroundColor bgcolor = self.pageBackgroundColor root = 'need root URL' # # HTML header and Body tag. # output.write('''| %(title)s | %(subtitle)s |
|---|---|
| ''' % locals()) # # Breadcrumbs # if packageTreeNode.getParent() is not None: self.writeBreadcrumbs(output, packageTreeNode) return def writeFileFooter(self, output): """Given an open output stream, write a footer using the title and subtitle. """ date_str = time.ctime(time.time()) app_version = happydoclib.cvsProductVersion() output.write(''' |
%(name)s |
''' % locals()) self.writeText(output, text, text_format) output.write(''' |
\n')
for list_element in listElements:
output.write('%s
\n' % list_element)
output.write('
\n') for name, symbols in import_data: ref = None # # Check if the name is a Python system module. # url = getPythonSystemModuleURL(name) if url: self.writeImportForPythonSystemModule(output, packageTreeNode, name, symbols, url, ) continue # # Check to see if the name is another module we know about. # referenced_module = packageTreeNode.findNodeFromDottedName(name) if referenced_module is not None: self.writeImportForKnownModule(output, packageTreeNode, name, referenced_module, symbols, ) continue # # Default to the module name for the reference. # if symbols: self.writeImportWithFrom(output, packageTreeNode, name, symbols, ) else: self.writeImport(output, packageTreeNode, name, ) output.write('
\n') self.popSectionLevel(output) return def writePreformatted(self, output, text): """Write text as a preformatted section. """ output.write('\n')
output.write(text)
if text and text[-1] != '\n':
output.write('\n')
output.write('\n')
return
def writeFunctionParameter(self, output, name, info):
'''Write a function parameter to the output.
No indenting or formatting is performed. The output
looks like::
name
or
name=default
Parameters:
name -- name of the parameter
info -- tuple of (default_specified, default_value,
default_value_type)
concerning the default value of the parameter
output -- destination for written output
'''
output.write(name)
default_specified, default_value, default_value_type = info
if default_specified:
output.write('=')
if default_value_type == token.STRING:
output.write(`default_value`)
elif default_value_type == token.NUMBER:
output.write(str(default_value))
else:
#print 'FUNCTION DEFAULT VALUE (%s, %s): "%s"' % (
# type(default_value),
# default_value_type or 'Unknown',
# default_value)
output.write(str(default_value))
return
def writeFunctionSignature(self,
output,
packageTreeNode,
function,
):
"""Write the function signature for 'function' to 'output'.
Parameters
output -- Where to write.
pacakgeTreeNode -- The part of the input we are processing.
function -- Instance of FunctionInfo from parseinfo module.
"""
function_name = function.getName()
signature_buffer = StringIO()
signature_buffer.write('%s (' % function_name)
parameter_names = function.getParameterNames()
if parameter_names:
if len(parameter_names) <= 2:
for param in parameter_names:
param_info = function.getParameterInfo(param)
signature_buffer.write(' ')
self.writeFunctionParameter(signature_buffer,
param,
param_info,
)
if param != parameter_names[-1]:
signature_buffer.write(',')
signature_buffer.write(' ')
else:
signature_buffer.write('\n')
indent = 8 #len(name) + 3
for param in parameter_names:
signature_buffer.write(' ' * indent)
param_info = function.getParameterInfo(param)
self.writeFunctionParameter(signature_buffer,
param,
param_info,
)
signature_buffer.write(',\n')
signature_buffer.write('%s' % (' ' * indent))
signature_buffer.write(')\n')
self.writePreformatted(output, signature_buffer.getvalue())
return
def writeExceptionListForFunction(self, output, function):
"""Write the list of exceptions raised by a function.
Parameters
output -- Where to write.
function -- FunctionInfo from parseinfo module.
listHeader -- Header for list being generated.
"""
exception_names = function.getExceptionNames()
if not exception_names:
return
if self.sort_names:
exception_names.sort()
exception_list = []
for name in exception_names:
#exception_class = self.getClassInfo(name)
exception_class = None
if exception_class:
# FIXME - Need a way to get a reference to a class in the
# scanned input!
ref = formatter.getReference( exception_class,
#output_reduced_name,
output.name,
)
else:
#ref = formatter.getPythonReference( name )
ref = name
exception_list.append(ref)
self.pushSectionLevel(output, 'Exceptions')
self.writeList(output, exception_list)
self.popSectionLevel(output)
return
def writeOneFunctionToOutput(self,
output,
packageTreeNode,
functionInfo,
):
"""Write all of the information for one function to the output stream.
"""
self.pushSectionLevel(output,
title='',
subtitle=functionInfo.getName(),
anchor=functionInfo.getName(),
)
#
# Signature
#
self.writeFunctionSignature(output, packageTreeNode, functionInfo)
#
# Description
#
docstring_text = functionInfo.getDocString()
docstring_format = functionInfo.getDocStringFormat()
self.writeText(output, docstring_text, docstring_format)
#
# Exceptions
#
self.writeExceptionListForFunction(output, functionInfo)
self.popSectionLevel(output)
return
def writeFunctionsToOutput(self, output, packageTreeNode):
"""Writes information about functions in this module to the output stream.
"""
function_names = self._filterNames(packageTreeNode.module_info.getFunctionNames())
if not function_names:
return
if self.sort_names:
function_names.sort()
#
# Section header
#
self.pushSectionLevel(output, 'Functions')
#
# Functions
#
for function_name in function_names:
self.writeOneFunctionToOutput(
output,
packageTreeNode,
packageTreeNode.module_info.getFunctionInfo(function_name),
)
self.popSectionLevel(output)
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)
def writeTree(self, output, treeRoot, indent=0):
output.write('%s%s\n') self.writeTree(output, base_class_tree) output.write('
\n') return def writeOneClassToOutput(self, output, packageTreeNode): """Writes information about one class to the output stream. """ class_info = packageTreeNode.code_info # # Description # docstring_text = class_info.getDocString() docstring_format = class_info.getDocStringFormat() self.writeText(output, docstring_text, docstring_format) # # Base classes # base_class_names = self._filterNames(class_info.getBaseClassNames()) if base_class_names: self.pushSectionLevel(output, 'Base Classes') self.writeBaseClassNames(output, packageTreeNode, class_info) self.popSectionLevel(output) # # Methods # method_names = self._filterNames(class_info.getMethodNames()) if method_names: if self.sort_names: method_names.sort() self.pushSectionLevel(output, 'Methods') for method_name in method_names: method_info = class_info.getMethodInfo(method_name) self.writeOneFunctionToOutput( output, packageTreeNode, method_info, ) self.popSectionLevel(output) return def writeClassListForModule(self, output, packageTreeNode): """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: class_names.sort() descriptive_list = [] 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 = '%s' % (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() descriptive_list.append( (ref, class_info_summary, class_info_format) ) self.pushSectionLevel(output, 'Classes') self.writeDescriptiveList(output, descriptive_list) self.popSectionLevel(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) # # Write a list of the classes to the current output file # self.writeClassListForModule(output, packageTreeNode) return def processPythonFile(self, packageTreeNode): """Handler for text/x-python nodes. """ trace.into('MultiHTMLFileDocSet', 'processPythonFile', packageTreeNode=packageTreeNode, outputLevel=TRACE_LEVEL, ) node_name = packageTreeNode.getName() if node_name == '__init__.py': # # Skip the __init__.py file, since it will # be handled as part of the package. # trace.write('skipping __init__.py', outputLevel=TRACE_LEVEL) trace.outof(outputLevel=TRACE_LEVEL) return canonical_path = packageTreeNode.getPath(1) canonical_filename = apply(os.path.join, canonical_path) output_filename = self.getOutputFilenameForPackageTreeNode(packageTreeNode) self.statusMessage('Documenting: "%s"\n to: "%s"' % ( canonical_filename, output_filename, )) output = self.openOutput(output_filename, packageTreeNode, title=self.title, subtitle=packageTreeNode.getRelativeFilename(), ) # # Summary/module docstring # readme_text = packageTreeNode.module_info.getDocString() readme_text = self._unquoteString(readme_text) text_format = packageTreeNode.module_info.getDocStringFormat() self.writeText(output, readme_text, text_format) self.writePythonFileInfoToOutput(output, packageTreeNode) 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