eric6/DocumentationTools/IndexGenerator.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/DocumentationTools/IndexGenerator.py	Sun Apr 14 15:09:21 2019 +0200
@@ -0,0 +1,219 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2003 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the index generator for the builtin documentation
+generator.
+"""
+
+from __future__ import unicode_literals
+
+import sys
+import os
+
+from Utilities import joinext
+
+
+class IndexGenerator(object):
+    """
+    Class implementing the index generator for the builtin documentation
+    generator.
+    """
+    def __init__(self, outputDir, colors, stylesheet=None):
+        """
+        Constructor
+        
+        @param outputDir The output directory for the files. (string)
+        @param colors Dictionary specifying the various colors for the output.
+            (dictionary of strings)
+        @param stylesheet the style to be used for the generated pages (string)
+        """
+        self.outputDir = outputDir
+        self.packages = {
+            "00index": {
+                "description": "",
+                "subpackages": {},
+                "modules": {}
+            }
+        }
+        self.remembered = False
+        
+        self.stylesheet = stylesheet
+        
+        if self.stylesheet:
+            from . import TemplatesListsStyleCSS
+            self.headerTemplate = TemplatesListsStyleCSS.headerTemplate
+            self.footerTemplate = TemplatesListsStyleCSS.footerTemplate
+            self.indexBodyTemplate = TemplatesListsStyleCSS.indexBodyTemplate
+            self.indexListPackagesTemplate = \
+                TemplatesListsStyleCSS.indexListPackagesTemplate
+            self.indexListModulesTemplate = \
+                TemplatesListsStyleCSS.indexListModulesTemplate
+            self.indexListEntryTemplate = \
+                TemplatesListsStyleCSS.indexListEntryTemplate
+        else:
+            from . import TemplatesListsStyle
+            self.headerTemplate = \
+                TemplatesListsStyle.headerTemplate.format(**colors)
+            self.footerTemplate = \
+                TemplatesListsStyle.footerTemplate.format(**colors)
+            self.indexBodyTemplate = \
+                TemplatesListsStyle.indexBodyTemplate.format(**colors)
+            self.indexListPackagesTemplate = \
+                TemplatesListsStyle.indexListPackagesTemplate.format(**colors)
+            self.indexListModulesTemplate = \
+                TemplatesListsStyle.indexListModulesTemplate.format(**colors)
+            self.indexListEntryTemplate = \
+                TemplatesListsStyle.indexListEntryTemplate.format(**colors)
+        
+    def remember(self, file, moduleDocument, basename=""):
+        """
+        Public method to remember a documentation file.
+        
+        @param file The filename to be remembered. (string)
+        @param moduleDocument The ModuleDocument object containing the
+            information for the file.
+        @param basename The basename of the file hierarchy to be documented.
+            The basename is stripped off the filename if it starts with
+            the basename.
+        """
+        self.remembered = True
+        if basename:
+            file = file.replace(basename, "")
+            
+        if "__init__" in file:
+            dirName = os.path.dirname(file)
+            udir = os.path.dirname(dirName)
+            if udir:
+                upackage = udir.replace(os.sep, ".")
+                try:
+                    elt = self.packages[upackage]
+                except KeyError:
+                    elt = self.packages["00index"]
+            else:
+                elt = self.packages["00index"]
+            package = dirName.replace(os.sep, ".")
+            elt["subpackages"][package] = moduleDocument.shortDescription()
+                
+            self.packages[package] = {
+                "description": moduleDocument.description(),
+                "subpackages": {},
+                "modules": {}
+            }
+            
+            if moduleDocument.isEmpty():
+                return
+        
+        package = os.path.dirname(file).replace(os.sep, ".")
+        try:
+            elt = self.packages[package]
+        except KeyError:
+            elt = self.packages["00index"]
+        elt["modules"][moduleDocument.name()] = \
+            moduleDocument.shortDescription()
+    
+    def __writeIndex(self, packagename, package, newline=None):
+        """
+        Private method to generate an index file for a package.
+        
+        @param packagename The name of the package. (string)
+        @param package A dictionary with information about the package.
+        @param newline newline character to be used (string)
+        @return The name of the generated index file.
+        """
+        if packagename == "00index":
+            f = os.path.join(self.outputDir, "index")
+            title = "Table of contents"
+        else:
+            f = os.path.join(self.outputDir, "index-{0}".format(packagename))
+            title = packagename
+        
+        filename = joinext(f, ".html")
+        
+        subpackages = ""
+        modules = ""
+        
+        # 1) subpackages
+        if package["subpackages"]:
+            subpacks = package["subpackages"]
+            names = sorted(list(subpacks.keys()))
+            lst = []
+            for name in names:
+                link = joinext("index-{0}".format(name), ".html")
+                lst.append(self.indexListEntryTemplate.format(**{
+                    "Description": subpacks[name],
+                    "Name": name.split(".")[-1],
+                    "Link": link,
+                }))
+            subpackages = self.indexListPackagesTemplate.format(**{
+                "Entries": "".join(lst),
+            })
+            
+        # 2) modules
+        if package["modules"]:
+            mods = package["modules"]
+            names = sorted(list(mods.keys()))
+            lst = []
+            for name in names:
+                link = joinext(name, ".html")
+                nam = name.split(".")[-1]
+                if nam == "__init__":
+                    nam = name.split(".")[-2]
+                lst.append(self.indexListEntryTemplate.format(**{
+                    "Description": mods[name],
+                    "Name": nam,
+                    "Link": link,
+                }))
+            modules = self.indexListModulesTemplate.format(**{
+                "Entries": "".join(lst),
+            })
+            
+        doc = self.headerTemplate.format(
+            **{"Title": title,
+               "Style": self.stylesheet}) + \
+            self.indexBodyTemplate.format(
+                **{"Title": title,
+                   "Description": package["description"],
+                   "Subpackages": subpackages,
+                   "Modules": modules}) + \
+            self.footerTemplate
+    
+        f = open(filename, "w", encoding="utf-8", newline=newline)
+        f.write(doc)
+        f.close()
+    
+        return filename
+    
+    def writeIndices(self, basename="", newline=None):
+        """
+        Public method to generate all index files.
+        
+        @param basename The basename of the file hierarchy to be documented.
+            The basename is stripped off the filename if it starts with
+            the basename.
+        @param newline newline character to be used (string)
+        """
+        if not self.remembered:
+            sys.stderr.write("No index to generate.\n")
+            return
+            
+        if basename:
+            basename = basename.replace(os.sep, ".")
+            if not basename.endswith("."):
+                basename = "{0}.".format(basename)
+        for package, element in list(self.packages.items()):
+            try:
+                if basename:
+                    package = package.replace(basename, "")
+                out = self.__writeIndex(package, element, newline)
+            except IOError as v:
+                sys.stderr.write("{0} error: {1}\n".format(package, v[1]))
+            else:
+                if out:
+                    sys.stdout.write("{0} ok\n".format(out))
+    
+        sys.stdout.write("Indices written.\n")
+        sys.stdout.flush()
+        sys.stderr.flush()

eric ide

mercurial