def _find_variables_and_functions(module_list): "find all top-level variables, functions, and traits" obj_list = [ ] for m in module_list: temp = m.divide_children() children = [ (c.name.upper(), c.abs_name.upper(), c) for c in temp[0] + temp[2] + temp[3] ] obj_list.extend(children) # sort alphabetically by local name alpha_sort(obj_list) obj_list = [ r[2] for r in obj_list ] # group by first letter result = { } for obj in obj_list: letter = obj.name[0].upper() display_name = obj.name if isinstance(obj, docobjects.Function): display_name += '()' link = object_link(obj) text = obj.abs_name result[letter] = result.get(letter, [ ]) + [ (display_name, link, text) ] return result
def _find_variables_and_functions(module_list): "find all top-level variables, functions, and traits" obj_list = [] for m in module_list: temp = m.divide_children() children = [(c.name.upper(), c.abs_name.upper(), c) for c in temp[0] + temp[2] + temp[3]] obj_list.extend(children) # sort alphabetically by local name alpha_sort(obj_list) obj_list = [r[2] for r in obj_list] # group by first letter result = {} for obj in obj_list: letter = obj.name[0].upper() display_name = obj.name if isinstance(obj, docobjects.Function): display_name += '()' link = object_link(obj) text = obj.abs_name result[letter] = result.get(letter, []) + [(display_name, link, text)] return result
def add_module_names(filename_list): result = [ ] for package, package_root, filenames in filename_list: fn = [ ] for filename in filenames: module_name = filename_to_module_name(package_root, package, filename) fn.append((module_name, filename)) alpha_sort(fn) result.append((package, package_root, [ (x[0], x[1]) for x in fn ])) return result
def write_class_index(self): """Generate alphabetical index of classes Generates class_index.html in output directory """ output_dir = self.options.docdir customheader = self.options.header customfooter = self.options.footer module_list = self.modules package_name = self.package_namespace.name extrastyle = self.get_extra_style() class_list = self._find_classes(module_list) header_title = "Class Index" title = "%s -- %s" % (package_name, header_title) stylesheet = "default.css" of = open(os.path.join(output_dir, 'class_index.html'), 'wt') # load class index HTML template template = self.template_loader.load('alpha_list') alpha_sort(class_list) # group class objects by first letter of local name classes_grouped = {} for c in class_list: letter = c.name[0].upper() link = class_link(c) display_name = c.name text = "%s" % c.abs_name classes_grouped[letter] = classes_grouped.get( letter, []) + [(display_name, link, text)] # list of available first letters (for links at top of index) letter_list = classes_grouped.keys() letter_list.sort() # sort by class name within letter categories for letter in letter_list: alpha_sort(classes_grouped[letter]) objects = classes_grouped # render template with local variables as arguments and write to disk of.write(template.render(vars())) of.close()
def write_class_index(self): """Generate alphabetical index of classes Generates class_index.html in output directory """ output_dir = self.options.docdir customheader = self.options.header customfooter = self.options.footer module_list = self.modules package_name = self.package_namespace.name extrastyle = self.get_extra_style() class_list = self._find_classes(module_list) header_title = "Class Index" title = "%s -- %s" % (package_name, header_title) stylesheet = "default.css" of = open(os.path.join(output_dir, 'class_index.html'), 'wt') # load class index HTML template template = self.template_loader.load('alpha_list') alpha_sort(class_list) # group class objects by first letter of local name classes_grouped = { } for c in class_list: letter = c.name[0].upper() link = class_link(c) display_name = c.name text = "%s" % c.abs_name classes_grouped[letter] = classes_grouped.get(letter, [ ]) + [ (display_name, link, text) ] # list of available first letters (for links at top of index) letter_list = classes_grouped.keys() letter_list.sort() # sort by class name within letter categories for letter in letter_list: alpha_sort(classes_grouped[letter]) objects = classes_grouped # render template with local variables as arguments and write to disk of.write(template.render(vars())) of.close()
def main(): quit_now = False option_parser = OptionParser(usage = """ %prog [options] [-r [package_name=path/to/package]]* [[module_prefix=]path/to/module.py]*""") #option_parser.add_option("-r", "--recursive", dest="recursive", # help="walk a directory recursively", # action="store_true", default=False) add_endo_options(option_parser) (options, args) = option_parser.parse_args() read_header_footer_files(options) if options.rst and not OutputHTML.HAS_DOCUTILS: option_parser.error("Option --rst specified, but docutils not found in default import path.\n") if len(args) < 1 and len(options.package_list) < 1: option_parser.error("Please specify at least one module or one package (with -r)") filename_list = [ ] # add package files for package_arg in options.package_list: if package_arg.find('=') != -1: package_name, package_dir = package_arg.split('=') else: # obtain package name from directory package_dir = package_arg package_name = os.path.split(os.path.normpath(package_dir))[-1] package_dir_list = [ (package_name, x) for x in glob(package_dir) ] alpha_sort(package_dir_list) new_files = [ (package_name, package_dir, search_tree(package_dir)) for package_name, package_dir in package_dir_list ] [ alpha_sort(entry[2]) for entry in new_files ] filename_list.extend(new_files) # add additional modules for module_arg in args: if module_arg.find('=') != -1: module_prefix, module_file = module_arg.split('=') else: module_prefix = options.package module_file = module_arg module_file_list = [ (module_prefix, x) for x in glob(module_file) ] alpha_sort(module_file_list) new_files = [ (module_prefix, os.path.dirname(f), [ f ]) for module_prefix, f in module_file_list ] alpha_sort(new_files) filename_list.extend(new_files) # create output dir if it doesn't exist create_output_dir(options.docdir) # set package name if it doesn't exist if not(options.package): options.package = ', '.join([ package_name for package_name, package_root, filenames in filename_list ]) filename_list = add_module_names(filename_list) backend = OutputHTML(options) exceptions = [ ] scanned = {} for package, package_root, filenames in filename_list: for mod_name, filename in filenames: try: if str(mod_name) not in scanned: # Avoid duplicates if options.verbose: sys.stdout.write("Scanning %s ... " % filename) sys.stdout.flush() module_obj = scan_file(options, filename, mod_name) scanned[mod_name] = filename if module_obj is not None: backend.add_module(module_obj) if options.verbose: sys.stdout.write("ok.\n") except KeyboardInterrupt: sys.stdout.write("interrupted! Exiting...\n") quit_now = True break except: # save exception info and move on exc_info = sys.exc_info() exceptions.append((filename, exc_info)) if options.verbose: sys.stdout.write("error, moving on.\n") if quit_now: break if (options.silent): warnings.filterwarnings("ignore") # set the docobjects warning var to be the module imported here # so they can share the same warnings filters docobjects.warnings = warnings if options.state_file is not None: write_state(backend, options.state_file) elif not quit_now: # resolve intra-package imports backend.write_output() # print all exceptions that were raised while reading sources if len(exceptions) > 0: sys.stderr.write("The following exceptions were encountered while processing the source files:\n\n") for filename, exc_info in exceptions: exc_type, exc_value, exc_traceback = exc_info sys.stderr.write("%s\n%s\n" % (filename, '-' * len(filename))) print_exception(exc_type, exc_value, exc_traceback, file=sys.stderr) sys.stderr.write("\n")