diff -r 092aa8fafa4e -r f6ccc31d6e72 eric5-doc.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric5-doc.py Sat Jan 02 17:09:08 2010 +0000 @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright (c) 2003 - 2010 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Eric4 Documentation Generator + +This is the main Python script of the documentation generator. It is +this script that gets called via the source documentation interface. +This script can be used via the commandline as well. +""" + +import glob +import os +import sys +import shutil +import fnmatch + +import Utilities.ModuleParser +from DocumentationTools.ModuleDocumentor import ModuleDocument +from DocumentationTools.IndexGenerator import IndexGenerator +from DocumentationTools.QtHelpGenerator import QtHelpGenerator +from DocumentationTools.Config import eric5docDefaultColors +from UI.Info import Version +import Utilities +import Preferences + +# list of supported filename extensions +supportedExtensions = [".py", ".pyw", ".ptl", ".rb"] + +def usage(): + """ + Function to print some usage information. + + It prints a reference of all commandline parameters that may + be used and ends the application. + """ + print("eric5-doc") + print() + print("Copyright (c) 2003 - 2010 Detlev Offenbach <detlev@die-offenbachs.de>.") + print() + print("Usage:") + print() + print(" eric5-doc [options] files...") + print() + print("where files can be either python modules, package") + print("directories or ordinary directories.") + print() + print("Options:") + print() + print(" -c filename or --style-sheet=filename") + print(" Specify a CSS style sheet file to be used.") + print(" -e or --noempty") + print(" Don't include empty modules.") + print(" -h or --help") + print(" Show this help and exit.") + print(" -i or --noindex") + print(" Don't generate index files.") + print(" -o directory or --outdir=directory") + print(" Generate files in the named directory.") + print(" -R, -r or --recursive") + print(" Perform a recursive search for Python files.") + print(" -t ext or --extension=ext") + print(" Add the given extension to the list of file extensions.") + print(" This option may be given multiple times.") + print(" -V or --version") + print(" Show version information and exit.") + print(" -x directory or --exclude=directory") + print(" Specify a directory basename to be excluded.") + print(" This option may be repeated multiple times.") + print(" --exclude-file=pattern") + print(" Specify a filename pattern of files to be excluded.") + print(" This option may be repeated multiple times.") + print() + print(" --body-color=color") + print(" Specify the text color.") + print(" --body-background-color=color") + print(" Specify the text background color.") + print(" --l1header-color=color") + print(" Specify the text color of level 1 headers.") + print(" --l1header-background-color=color") + print(" Specify the text background color of level 1 headers.") + print(" --l2header-color=color") + print(" Specify the text color of level 2 headers.") + print(" --l2header-background-color=color") + print(" Specify the text background color of level 2 headers.") + print(" --cfheader-color=color") + print(" Specify the text color of class and function headers.") + print(" --cfheader-background-color=color") + print(" Specify the text background color of class and function headers.") + print(" --link-color=color") + print(" Specify the text color of hyperlinks.") + print() + print(" --create-qhp") + print(" Enable generation of QtHelp files.") + print(" --qhp-outdir=directory") + print(" Generate QtHelp files in the named directory.") + print(" --qhp-namespace=namespace") + print(" Use the given namespace (mandatory).") + print(" --qhp-virtualfolder=folder") + print(" Use the given virtual folder (mandatory).") + print(" The virtual folder must not contain '/'.") + print(" --qhp-filtername=name") + print(" Use the given name for the custom filter.") + print(" --qhp-filterattribs=attributes") + print(" Add the given attributes to the filter list.") + print(" Attributes must be separated by ':'.") + print(" --qhp-title=title") + print(" Use this as the title for the generated help (mandatory).") + print(" --create-qhc") + print(" Enable generation of QtHelp Collection files.") + sys.exit(1) + +def version(): + """ + Function to show the version information. + """ + print("""eric5-doc %s + +Eric4 API documentation generator. + +Copyright (c) 2003-2010 Detlev Offenbach <detlev@die-offenbachs.de> +This is free software; see the LICENSE.GPL3 for copying conditions. +There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE.""" % Version) + sys.exit(1) + +def main(): + """ + Main entry point into the application. + """ + + import getopt + + try: + opts, args = getopt.getopt(sys.argv[1:], "c:ehio:Rrt:Vx:", + ["exclude=", "extension=", "help", "noindex", "noempty", "outdir=", + "recursive", "style-sheet=", "version", + "exclude-file=", + "body-color=", "body-background-color=", + "l1header-color=", "l1header-background-color=", + "l2header-color=", "l2header-background-color=", + "cfheader-color=", "cfheader-background-color=", + "link-color=", + "create-qhp", "qhp-outdir=", "qhp-namespace=", + "qhp-virtualfolder=", "qhp-filtername=", "qhp-filterattribs=", + "qhp-title=", "create-qhc", + ]) + except getopt.error as e: + usage() + + excludeDirs = ["CVS", ".svn", "_svn", ".ropeproject", "_ropeproject", + ".eric5project", "_eric5project", "dist", "build", "doc", "docs"] + excludePatterns = [] + outputDir = "doc" + recursive = False + doIndex = True + noempty = False + stylesheetFile = "" + colors = eric5docDefaultColors.copy() + + qtHelpCreation = False + qtHelpOutputDir = "help" + qtHelpNamespace = "" + qtHelpFolder = "source" + qtHelpFilterName = "unknown" + qtHelpFilterAttribs = "" + qtHelpTitle = "" + qtHelpCreateCollection = False + + # Set the applications string encoding + try: + sys.setappdefaultencoding(str(Preferences.getSystem("StringEncoding"))) + except AttributeError: + pass + + for k, v in opts: + if k in ["-o", "--outdir"]: + outputDir = v + elif k in ["-R", "-r", "--recursive"]: + recursive = True + elif k in ["-x", "--exclude"]: + excludeDirs.append(v) + elif k == "--exclude-file": + excludePatterns.append(v) + elif k in ["-i", "--noindex"]: + doIndex = False + elif k in ["-e", "--noempty"]: + noempty = True + elif k in ["-h", "--help"]: + usage() + elif k in ["-V", "--version"]: + version() + elif k in ["-c", "--style-sheet"]: + stylesheetFile = v + elif k in ["-t", "--extension"]: + if not v.startswith("."): + v = ".%s" % v + supportedExtensions.append(v) + + elif k == "--body-color": + colors['BodyColor'] = v + elif k == "--body-background-color": + colors['BodyBgColor'] = v + elif k == "--l1header-color": + colors['Level1HeaderColor'] = v + elif k == "--l1header-background-color": + colors['Level1HeaderBgColor'] = v + elif k == "--l2header-color": + colors['Level2HeaderColor'] = v + elif k == "--l2header-background-color": + colors['Level2HeaderBgColor'] = v + elif k == "--cfheader-color": + colors['CFColor'] = v + elif k == "--cfheader-background-color": + colors['CFBgColor'] = v + elif k == "--link-color": + colors['LinkColor'] = v + + elif k == "--create-qhp": + qtHelpCreation = True + elif k == "--qhp-outdir": + qtHelpOutputDir = v + elif k == "--qhp-namespace": + qtHelpNamespace = v + elif k == "--qhp-virtualfolder": + qtHelpFolder = v + elif k == "--qhp-filtername": + qtHelpFilterName = v + elif k == "--qhp-filterattribs": + qtHelpFilterAttribs = v + elif k == "--qhp-title": + qtHelpTitle = v + elif k == "--create-qhc": + qtHelpCreateCollection = True + + if not args: + usage() + + if qtHelpCreation and \ + (qtHelpNamespace == "" or \ + qtHelpFolder == "" or '/' in qtHelpFolder or \ + qtHelpTitle == ""): + usage() + + input = output = 0 + basename = "" + + if outputDir: + if not os.path.isdir(outputDir): + try: + os.makedirs(outputDir) + except EnvironmentError: + sys.stderr.write("Could not create output directory %s." % outputDir) + sys.exit(2) + else: + outputDir = os.getcwd() + outputDir = os.path.abspath(outputDir) + + if stylesheetFile: + try: + sf = open(stylesheetFile, "rb") + stylesheet = sf.read() + sf.close() + except IOError: + sys.stderr.write("The CSS stylesheet '%s' does not exist\n" % stylesheetFile) + sys.stderr.write("Disabling CSS usage.\n") + stylesheet = None + else: + stylesheet = None + + indexGenerator = IndexGenerator(outputDir, colors, stylesheet) + + if qtHelpCreation: + if qtHelpOutputDir: + if not os.path.isdir(qtHelpOutputDir): + try: + os.makedirs(qtHelpOutputDir) + except EnvironmentError: + sys.stderr.write("Could not create QtHelp output directory %s." % \ + qtHelpOutputDir) + sys.exit(2) + else: + qtHelpOutputDir = os.getcwd() + qtHelpOutputDir = os.path.abspath(qtHelpOutputDir) + + qtHelpGenerator = QtHelpGenerator(outputDir, + qtHelpOutputDir, qtHelpNamespace, qtHelpFolder, + qtHelpFilterName, qtHelpFilterAttribs, + qtHelpTitle, qtHelpCreateCollection) + + for arg in args: + if os.path.isdir(arg): + if os.path.exists(os.path.join(arg, Utilities.joinext("__init__", ".py"))): + basename = os.path.dirname(arg) + if arg == '.': + sys.stderr.write("The directory '.' is a package.\n") + sys.stderr.write("Please repeat the call giving its real name.\n") + sys.stderr.write("Ignoring the directory.\n") + continue + else: + basename = arg + if basename: + basename = "%s%s" % (basename, os.sep) + + if recursive and not os.path.islink(arg): + names = [arg] + Utilities.getDirs(arg, excludeDirs) + else: + names = [arg] + else: + basename = "" + names = [arg] + + for filename in names: + inpackage = False + if os.path.isdir(filename): + files = [] + for ext in supportedExtensions: + files.extend(glob.glob(os.path.join(filename, + Utilities.joinext("*", ext)))) + initFile = os.path.join(filename, Utilities.joinext("__init__", ext)) + if initFile in files: + inpackage = True + files.remove(initFile) + files.insert(0, initFile) + else: + if Utilities.isWindowsPlatform() and glob.has_magic(filename): + files = glob.glob(filename) + else: + files = [filename] + + for file in files: + skipIt = False + for pattern in excludePatterns: + if fnmatch.fnmatch(os.path.basename(file), pattern): + skipIt = True + break + if skipIt: + continue + + try: + module = Utilities.ModuleParser.readModule(file, basename = basename, + inpackage = inpackage, extensions = supportedExtensions) + moduleDocument = ModuleDocument(module, colors, stylesheet) + doc = moduleDocument.genDocument() + except IOError as v: + sys.stderr.write("%s error: %s\n" % (file, v[1])) + continue + except ImportError as v: + sys.stderr.write("%s error: %s\n" % (file, v)) + continue + + input = input + 1 + + f = Utilities.joinext(os.path.join(outputDir, moduleDocument.name()), + ".html") + + # remember for index file generation + indexGenerator.remember(file, moduleDocument, basename) + + # remember for QtHelp generation + if qtHelpCreation: + qtHelpGenerator.remember(file, moduleDocument, basename) + + if (noempty or file.endswith('__init__.py')) \ + and moduleDocument.isEmpty(): + continue + + # generate output + try: + out = open(f, "w") + out.write(doc) + out.close() + except IOError as v: + sys.stderr.write("%s error: %s\n" % (file, v[1])) + else: + sys.stdout.write("%s ok\n" % f) + + output = output + 1 + sys.stdout.flush() + sys.stderr.flush() + + # write index files + if doIndex: + indexGenerator.writeIndices(basename) + + # generate the QtHelp files + if qtHelpCreation: + qtHelpGenerator.generateFiles() + + sys.exit(0) + +if __name__ == '__main__': + main() \ No newline at end of file