\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