Changeset 300:618e7ba4da05 in livinglogic.python.www for site/Python_xmlns.py

Show
Ignore:
Timestamp:
12/23/04 18:54:24 (15 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Major update of the webpages: New design, new navigation, move page
attributes from XML into Page classes, etc.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • site/Python_xmlns.py

    r298 r300  
    22import sys, types, inspect 
    33 
     4import ll 
    45from ll import url 
    56from ll.xist import xsc, sims, parsers 
     
    1213    This is an abstract class, that provides common 
    1314    functionality for derived classes. 
    14      
    15     All the methods that raise a NotImplemented error 
    16     must be implemented by derived classes. 
    1715    """ 
    1816 
    19     def getName(self): 
    20         """ 
    21         return the name of the page as a string. 
    22         This name must be unique within the context 
    23         of the siblings of the page. 
    24         """ 
    25         raise NotImplementedError() 
    26  
    27     def getURL(self): 
    28         """ 
    29         return a link to the page 
    30         """ 
    31         raise NotImplementedError() 
    32  
    33     def getTitle(self): 
    34         """ 
    35         return the title for the page 
    36         """ 
    37         raise NotImplementedError() 
    38  
    39     def getLocalKeywords(self): 
    40         """ 
    41         return a sequence of keywords local to this page. 
    42  
    43         A keyword may be anything that can be converted to an &xist; 
    44         node, like a string (8bit or Unicode) or an &xist entity. 
    45         """ 
    46         raise NotImplementedError() 
    47  
    48     def getInheritableKeywords(self): 
    49         raise NotImplementedError() 
    50  
    51     def getKeywords(self): 
    52         keywords = list(self.getLocalKeywords()) 
    53         page = self 
    54         while page is not None: 
    55             keywords[:0] = page.getInheritableKeywords() 
    56             page = page.getParent() 
    57         return keywords 
    58  
    59     def getLinkInfo(self): 
    60         raise NotImplementedError() 
    61  
    62     def getDescription(self): 
    63         raise NotImplementedError() 
    64  
     17    class keywords(ll.propclass): 
     18        def __get__(self): 
     19            keywords = list(self.localkeywords) 
     20            page = self 
     21            while page is not None: 
     22                keywords[:0] = page.inheritablekeywords 
     23                page = page.getParent() 
     24            return keywords 
     25 
     26    @ll.notimplemented 
    6527    def getParent(self): 
    66         raise NotImplementedError() 
    67  
     28        pass 
     29 
     30    @ll.notimplemented 
    6831    def setParent(self): 
    69         raise NotImplementedError() 
    70  
    71     def getName(self): 
    72         raise NotImplementedError() 
    73  
    74     def getCrumb(self): 
    75         raise NotImplementedError() 
    76  
     32        pass 
     33 
     34    @ll.notimplemented 
    7735    def getChildByIndex(self, index): 
    78         raise NotImplementedError() 
    79  
     36        pass 
     37 
     38    @ll.notimplemented 
    8039    def getChildByName(self, index): 
    81         raise NotImplementedError() 
     40        pass 
    8241 
    8342    def getFirstSibling(self): 
     
    12281            return parent.getChildByIndex(-1) 
    12382 
     83    @ll.notimplemented 
    12484    def __len__(self): 
    125         raise NotImplementedError() 
     85        pass 
    12686 
    12787    def getChildren(self): 
     
    166126 
    167127    def getPathString(self): 
    168         return "/".join([ page.getName() for page in self.getPath() if page.getParent()]) 
     128        return "/".join([ page.name for page in self.getPath() if page.getParent()]) 
    169129 
    170130    def getRoot(self): 
     
    192152    def __init__(self, name, *children, **attrs): 
    193153        self.__parent = None 
    194         self.__name = name 
    195         self.__crumb = None 
    196         self.__url = None 
    197         self.__title = None 
    198         self.__localkeywords = [] 
    199         self.__inheritablekeywords = [] 
    200         self.__description = None 
    201         self.__linkinfo = None 
     154        self.name = name 
     155        self.title = None 
     156        self.crumb = None 
     157        self.url = None 
     158        self.header = None 
     159        self.subheader = None 
     160        self.localkeywords = [] 
     161        self.inheritablekeywords = [] 
     162        self.description = None 
    202163        for (k, v) in attrs.items(): 
    203164            if k=="crumb": 
    204                 self.__crumb = v 
     165                self.crumb = v 
    205166            elif k=="url": 
    206                 self.__url = v 
     167                self.url = v 
    207168            elif k=="title": 
    208                 self.__title = v 
     169                self.title = v 
     170            elif k=="header": 
     171                self.header = v 
     172            elif k=="subheader": 
     173                self.subheader = v 
    209174            elif k=="localkeywords": 
    210                 self.__localkeywords = v 
     175                self.localkeywords = v 
    211176            elif k=="inheritablekeywords": 
    212                 self.__inheritablekeywords = v 
     177                self.inheritablekeywords = v 
    213178            elif k=="description": 
    214                 self.__description = v 
    215             elif k=="linkinfo": 
    216                 self.__linkinfo = v 
     179                self.description = v 
    217180            else: 
    218181                raise ValueError("unknown keyword %s" % k) 
     
    221184        self.__children = list(children) 
    222185 
    223     def getName(self): 
    224         return self.__name 
    225  
    226     def getURL(self): 
    227         return self.__url 
    228  
    229     def getTitle(self): 
    230         return self.__title 
    231  
    232     def getLocalKeywords(self): 
    233         return self.__localkeywords 
    234  
    235     def getInheritableKeywords(self): 
    236         return self.__inheritablekeywords 
    237  
    238     def getLinkInfo(self): 
    239         return self.__linkinfo 
    240  
    241     def getDescription(self): 
    242         return self.__description 
    243  
    244     def getCrumb(self): 
    245         return self.__crumb 
    246  
    247186    def getParent(self): 
    248187        return self.__parent 
     
    256195    def getChildByName(self, index): 
    257196        for child in self.__children: 
    258             if child.getName() == index: 
     197            if child.name == index: 
    259198                return child 
    260199        raise KeyError("unknown child %r in page %r" % (index, self.getPathString())) 
     
    269208        links = super(StaticPage, self).getLinks() 
    270209 
    271         url = self.getURL() 
     210        url = self.url 
    272211        pos = url.rfind(".") 
    273212        if pos>=0: 
     
    288227        links = super(XISTPage, self).getLinks() 
    289228 
    290         url = self.getURL() 
     229        url = self.url 
    291230        pos = url.rfind(".") 
    292231        if pos>=0: 
     
    306245    def getLinks(self): 
    307246        links = super(PythonSourcePage, self).getLinks() 
    308         url = self.getURL() 
     247        url = self.url 
    309248        if url.endswith(".html"): 
    310249            url = url[:-5] + "_module.py" 
     
    314253 
    315254 
    316 pages = XISTPage("Python", 
    317     PythonSourcePage("XIST", 
    318         XISTPage("Examples", 
     255pages = XISTPage("python", 
     256    PythonSourcePage("core", 
     257        XISTPage("download", 
     258            crumb="Download", 
     259            title="Core download · Python software · LivingLogic AG", 
     260            header="Core download", 
     261            subheader="All versions for download", 
     262            url="root:core/Download.html", 
     263            localkeywords=["download", "file", "archive"], 
     264        ), 
     265        XISTPage("history", 
     266            crumb="History", 
     267            title="Core history · Python software · LivingLogic AG", 
     268            header="Core history", 
     269            subheader="The development history", 
     270            url="root:core/History.html", 
     271            localkeywords=["history", "changes", "version"], 
     272        ), 
     273        XISTPage("installation", 
     274            crumb="Installation", 
     275            title="Core requirements and installation · Python software · LivingLogic AG", 
     276            header="Core installation", 
     277            subheader="Requirements and installation", 
     278            url="root:core/Installation.html", 
     279            localkeywords=["installation", "distutils"], 
     280        ), 
     281        crumb="Core", 
     282        title="Core · Python software · LivingLogic AG", 
     283        header="Core", 
     284        subheader="Common utilities", 
     285        url="root:core/index.html", 
     286        inheritablekeywords=["Python", "package", "utilities", "decorator", "property", "module", "namespace"], 
     287    ), 
     288    PythonSourcePage("xist", 
     289        XISTPage("examples", 
    319290            crumb="Examples", 
    320             linkinfo=(abbr.xist(), " examples"), 
    321             title="Examples", 
     291            title=(abbr.xist(), " examples · Python software · LivingLogic AG"), 
     292            header=(abbr.xist(), " examples"), 
     293            subheader=("An introduction to ", abbr.xist(), " by examples"), 
    322294            url="root:xist/Examples.html", 
    323             localkeywords=[] 
    324         ), 
    325         XISTPage("Howto", 
     295            localkeywords=[], 
     296        ), 
     297        XISTPage("howto", 
    326298            crumb="Howto", 
    327             linkinfo=("Documentation for ", abbr.xist()), 
    328             title=(abbr.xist(), " documentation"), 
     299            title=(abbr.xist(), " howto · Python software · LivingLogic AG"), 
     300            header=(abbr.xist(), " howto"), 
     301            subheader=("A quick tour of ", abbr.xist()), 
    329302            url="root:xist/Howto.html", 
    330             localkeywords=[] 
     303            localkeywords=[], 
    331304        ), 
    332305        PythonSourcePage("xsc", 
    333306            crumb="xsc", 
    334             title=(abbr.xist(), ".xsc"), 
    335             linkinfo=("Module with the ", abbr.xist(), " core classes"), 
    336             url="root:xist/xsc/index.html" 
     307            title=(abbr.xist(), ".xsc · Python software · LivingLogic AG"), 
     308            header=(abbr.xist(), ".xsc"), 
     309            subheader=(abbr.xist(), " core classes"), 
     310            url="root:xist/xsc/index.html", 
    337311        ), 
    338312        PythonSourcePage("ns", 
    339313            PythonSourcePage("html", 
    340314                crumb="html", 
    341                 title=(abbr.xist(), ".ns.html"), 
    342                 linkinfo=("Module implementing ", abbr.html(), " 4.01 (with additions)"), 
    343                 url="root:xist/ns/html/index.html" 
     315                title=(abbr.xist(), ".ns.html · Python software · LivingLogic AG"), 
     316                header=(abbr.xist(), ".ns.html"), 
     317                subheader=("Module implementing ", abbr.html(), " 4.01 (with additions)"), 
     318                url="root:xist/ns/html/index.html", 
    344319            ), 
    345320            PythonSourcePage("xml", 
    346321                crumb="xml", 
    347                 title=(abbr.xist(), ".ns.xml"), 
    348                 linkinfo=("Module for global attributes from the ", abbr.xml(), " namespace and the ", abbr.xml(), " header"), 
    349                 url="root:xist/ns/xml/index.html" 
     322                title=(abbr.xist(), ".ns.xml · Python software · LivingLogic AG"), 
     323                header=(abbr.xist(), ".ns.xml"), 
     324                subheader=("Module for global attributes from the ", abbr.xml(), " namespace"), 
     325                url="root:xist/ns/xml/index.html", 
    350326            ), 
    351327            PythonSourcePage("wml", 
    352328                crumb="wml", 
    353                 title=(abbr.xist(), ".ns.wml"), 
    354                 linkinfo=("Module implementing ", abbr.wml(), " 1.3"), 
    355                 url="root:xist/ns/wml/index.html" 
     329                title=(abbr.xist(), ".ns.wml · Python software · LivingLogic AG"), 
     330                header=(abbr.xist(), ".ns.wml"), 
     331                subheader=("Module implementing ", abbr.wml(), " 1.3"), 
     332                url="root:xist/ns/wml/index.html", 
    356333            ), 
    357334            PythonSourcePage("ihtml", 
    358335                crumb="ihtml", 
    359                 title=(abbr.xist(), ".ns.ihtml"), 
    360                 linkinfo=("Module implementing iMode compatible ", abbr.html()), 
    361                 url="root:xist/ns/ihtml/index.html" 
     336                title=(abbr.xist(), ".ns.ihtml · Python software · LivingLogic AG"), 
     337                header=(abbr.xist(), ".ns.ihtml"), 
     338                subheader=("Module module implementing iMode compatible ", abbr.html()), 
     339                url="root:xist/ns/ihtml/index.html", 
    362340            ), 
    363341            PythonSourcePage("docbook", 
    364342                crumb="docbook", 
    365                 title=(abbr.xist(), ".ns.docbook"), 
    366                 linkinfo="Module implementing DocBook 4.3", 
    367                 url="root:xist/ns/docbook/index.html" 
     343                title=(abbr.xist(), ".ns.docbook · Python software · LivingLogic AG"), 
     344                header=(abbr.xist(), ".ns.docbook"), 
     345                subheader="Namespace module implementing DocBook 4.3", 
     346                url="root:xist/ns/docbook/index.html", 
    368347            ), 
    369348            PythonSourcePage("svg", 
    370349                crumb="svg", 
    371                 title=(abbr.xist(), ".ns.svg"), 
    372                 linkinfo=("Module implementing ", abbr.svg(), " 1.0"), 
    373                 url="root:xist/ns/svg/index.html" 
     350                title=(abbr.xist(), ".ns.svg · Python software · LivingLogic AG"), 
     351                header=(abbr.xist(), ".ns.svg"), 
     352                subheader=("Namespace module implementing ", abbr.svg(), " 1.0"), 
     353                url="root:xist/ns/svg/index.html", 
    374354            ), 
    375355            PythonSourcePage("abbr", 
    376356                crumb="abbr", 
    377                 title=(abbr.xist(), ".ns.abbr"), 
    378                 linkinfo="Module containing many abbreviation entities", 
    379                 url="root:xist/ns/abbr/index.html" 
     357                title=(abbr.xist(), ".ns.abbr · Python software · LivingLogic AG"), 
     358                header=(abbr.xist(), ".ns.abbr"), 
     359                subheader="Namespace module containing many abbreviation entities", 
     360                url="root:xist/ns/abbr/index.html", 
    380361            ), 
    381362            PythonSourcePage("cond", 
    382363                crumb="cond", 
    383                 title=(abbr.xist(), ".ns.cond"), 
    384                 linkinfo="Module implementing conditional elements (if, else, etc.)", 
    385                 url="root:xist/ns/cond/index.html" 
     364                title=(abbr.xist(), ".ns.cond · Python software · LivingLogic AG"), 
     365                header=(abbr.xist(), ".ns.cond"), 
     366                subheader="Namespace module implementing conditional elements (if, else, etc.)", 
     367                url="root:xist/ns/cond/index.html", 
    386368            ), 
    387369            PythonSourcePage("code", 
    388370                crumb="code", 
    389                 title=(abbr.xist(), ".ns.code"), 
    390                 linkinfo=("Module for embedding Python code in ", abbr.xml()), 
    391                 url="root:xist/ns/code/index.html" 
     371                title=(abbr.xist(), ".ns.code · Python software · LivingLogic AG"), 
     372                header=(abbr.xist(), ".ns.code"), 
     373                subheader=("Namespace module for embedding Python code in ", abbr.xml()), 
     374                url="root:xist/ns/code/index.html", 
    392375            ), 
    393376            PythonSourcePage("form", 
    394377                crumb="form", 
    395                 title=(abbr.xist(), ".ns.form"), 
    396                 linkinfo="Module implementing form related elements", 
    397                 url="root:xist/ns/form/index.html" 
     378                title=(abbr.xist(), ".ns.form · Python software · LivingLogic AG"), 
     379                header=(abbr.xist(), ".ns.form"), 
     380                subheader="Namespace module implementing form related elements", 
     381                url="root:xist/ns/form/index.html", 
    398382            ), 
    399383            PythonSourcePage("php", 
    400384                crumb="php", 
    401                 title=(abbr.xist(), ".ns.ph"), 
    402                 linkinfo=("Module for PHP processing instructions"), 
    403                 url="root:xist/ns/php/index.html" 
     385                title=(abbr.xist(), ".ns.php · Python software · LivingLogic AG"), 
     386                header=(abbr.xist(), ".ns.php"), 
     387                subheader=("Namespace module for PHP processing instructions"), 
     388                url="root:xist/ns/php/index.html", 
    404389            ), 
    405390            PythonSourcePage("jsp", 
    406391                crumb="jsp", 
    407                 title=(abbr.xist(), ".ns.jsp"), 
    408                 linkinfo=("Module for embedding ", abbr.jsp(), " code as processing instructions"), 
    409                 url="root:xist/ns/jsp/index.html" 
     392                title=(abbr.xist(), ".ns.jsp · Python software · LivingLogic AG"), 
     393                header=(abbr.xist(), ".ns.jsp"), 
     394                subheader=("Namespace module for embedding ", abbr.jsp(), " code as processing instructions"), 
     395                url="root:xist/ns/jsp/index.html", 
    410396            ), 
    411397            PythonSourcePage("meta", 
    412398                crumb="meta", 
    413                 title=(abbr.xist(), ".ns.meta"), 
    414                 linkinfo="Module containing meta information elements", 
    415                 url="root:xist/ns/meta/index.html" 
     399                title=(abbr.xist(), ".ns.meta · Python software · LivingLogic AG"), 
     400                header=(abbr.xist(), ".ns.meta"), 
     401                subheader="Namespace module containing meta information elements", 
     402                url="root:xist/ns/meta/index.html", 
    416403            ), 
    417404            PythonSourcePage("ruby", 
    418405                crumb="ruby", 
    419                 title=(abbr.xist(), ".ns.ruby"), 
    420                 linkinfo="Module implementing the W3C ruby draft", 
    421                 url="root:xist/ns/ruby/index.html" 
     406                title=(abbr.xist(), ".ns.ruby · Python software · LivingLogic AG"), 
     407                header=(abbr.xist(), ".ns.ruby"), 
     408                subheader="Namespace implementing the W3C ruby draft", 
     409                url="root:xist/ns/ruby/index.html", 
    422410            ), 
    423411            PythonSourcePage("specials", 
    424412                crumb="specials", 
    425                 title=(abbr.xist(), ".ns.specials"), 
    426                 linkinfo="Module implementing some useful general elements", 
    427                 url="root:xist/ns/specials/index.html" 
     413                title=(abbr.xist(), ".ns.specials · Python software · LivingLogic AG"), 
     414                header=(abbr.xist(), ".ns.specials"), 
     415                subheader="Common useful elements", 
     416                url="root:xist/ns/specials/index.html", 
    428417            ), 
    429418            PythonSourcePage("htmlspecials", 
    430419                crumb="htmlspecials", 
    431                 title=(abbr.xist(), ".ns.htmlspecials"), 
    432                 linkinfo=("Module implementing some common useful elements for ", abbr.html(), " generation"), 
    433                 url="root:xist/ns/htmlspecials/index.html" 
     420                title=(abbr.xist(), ".ns.htmlspecials · Python software · LivingLogic AG"), 
     421                header=(abbr.xist(), ".ns.htmlspecials"), 
     422                subheader=("Common useful elements for ", abbr.html(), " generation"), 
     423                url="root:xist/ns/htmlspecials/index.html", 
    434424            ), 
    435425            PythonSourcePage("doc", 
    436426                crumb="doc", 
    437                 title=(abbr.xist(), ".ns.doc"), 
    438                 linkinfo="Module for automated documentation generation", 
    439                 url="root:xist/ns/doc/index.html" 
     427                title=(abbr.xist(), ".ns.doc · Python software · LivingLogic AG"), 
     428                header=(abbr.xist(), ".ns.doc"), 
     429                subheader="Namespace module for automated documentation generation", 
     430                url="root:xist/ns/doc/index.html", 
    440431            ), 
    441432            PythonSourcePage("css", 
    442433                crumb="css", 
    443                 title=(abbr.xist(), ".ns.css"), 
    444                 linkinfo=("Module implementing ", abbr.css(), " as ", abbr.xml(), " elements"), 
    445                 url="root:xist/ns/css/index.html" 
     434                title=(abbr.xist(), ".ns.css · Python software · LivingLogic AG"), 
     435                header=(abbr.xist(), ".ns.css"), 
     436                subheader=("Namespace module implementing ", abbr.css(), " as ", abbr.xml(), " elements"), 
     437                url="root:xist/ns/css/index.html", 
    446438            ), 
    447439            PythonSourcePage("cssspecials", 
    448440                crumb="cssspecials", 
    449                 title=(abbr.xist(), ".ns.cssspecials"), 
    450                 linkinfo=("Module implementing some useful elements for ", abbr.css()), 
    451                 url="root:xist/ns/cssspecials/index.html" 
     441                title=(abbr.xist(), ".ns.cssspecials · Python software · LivingLogic AG"), 
     442                header=(abbr.xist(), ".ns.cssspecials"), 
     443                subheader=("Module implementing some useful elements for ", abbr.css()), 
     444                url="root:xist/ns/cssspecials/index.html", 
    452445            ), 
    453446            PythonSourcePage("struts_html", 
    454447                crumb="struts_html", 
    455                 title=(abbr.xist(), ".ns.struts_html"), 
    456                 linkinfo=("Module that implements the ", html.a("Struts", href="http://jakarta.apache.org/struts/"), " ", abbr.html(), " tags"), 
    457                 url="root:xist/ns/struts_html/index.html" 
     448                title=(abbr.xist(), "ns.struts_html · Python software · LivingLogic AG"), 
     449                header=(abbr.xist(), ".ns.struts_html"), 
     450                subheader=("Mamespace module implementing the the Struts ", abbr.html(), " tags"), 
     451                url="root:xist/ns/struts_html/index.html", 
    458452            ), 
    459453            PythonSourcePage("struts_config", 
    460454                crumb="struts_config", 
    461                 title=(abbr.xist(), ".ns.struts_config"), 
    462                 linkinfo=("Module that implements the namespace for ", html.a("Struts", href="http://jakarta.apache.org/struts/"), " configuration files"), 
    463                 url="root:xist/ns/struts_config/index.html" 
     455                title=(abbr.xist(), ".ns.struts_config · Python software · LivingLogic AG"), 
     456                header=(abbr.xist(), ".ns.struts_config"), 
     457                subheader=("Namespace module for Struts configuration files"), 
     458                url="root:xist/ns/struts_config/index.html", 
    464459            ), 
    465460            crumb="ns", 
    466461            title=(abbr.xist(), ".ns"), 
    467             linkinfo="Subpackage containing namespace modules", 
    468             url="root:xist/ns/index.html" 
     462            header=(abbr.xist(), ".ns"), 
     463            subheader="Subpackage containing namespace modules", 
     464            url="root:xist/ns/index.html", 
    469465        ), 
    470466        PythonSourcePage("parsers", 
    471467            crumb="parsers", 
    472             title=(abbr.xist(), ".parsers"), 
    473             linkinfo="Module with classes for parsing files", 
    474             url="root:xist/parsers/index.html" 
     468            title=(abbr.xist(), ".parsers · Python software · LivingLogic AG"), 
     469            header=(abbr.xist(), ".parsers"), 
     470            subheader="Module with classes for parsing files", 
     471            url="root:xist/parsers/index.html", 
    475472        ), 
    476473        PythonSourcePage("converters", 
    477474            crumb="converters", 
    478             title=(abbr.xist(), ".converters"), 
    479             linkinfo="Module with the converter class", 
    480             url="root:xist/converters/index.html" 
     475            title=(abbr.xist(), ".converters · Python software · LivingLogic AG"), 
     476            header=(abbr.xist(), ".converters"), 
     477            subheader="Module with the converter class", 
     478            url="root:xist/converters/index.html", 
    481479        ), 
    482480        PythonSourcePage("presenters", 
    483481            crumb="presenters", 
    484             title=(abbr.xist(), ".presenters"), 
    485             linkinfo="Module with classes for printing trees", 
    486             url="root:xist/presenters/index.html" 
     482            title=(abbr.xist(), ".presenters · Python software · LivingLogic AG"), 
     483            header=(abbr.xist(), ".presenters"), 
     484            subheader="Module with classes for printing trees", 
     485            url="root:xist/presenters/index.html", 
    487486        ), 
    488487        PythonSourcePage("publishers", 
    489488            crumb="publishers", 
    490             title=(abbr.xist(), ".publishers"), 
    491             linkinfo="Module with classes for publishing trees", 
    492             url="root:xist/publishers/index.html" 
     489            title=(abbr.xist(), ".publishers · Python software · LivingLogic AG"), 
     490            header=(abbr.xist(), ".publishers"), 
     491            subheader="Module with classes for publishing trees", 
     492            url="root:xist/publishers/index.html", 
    493493        ), 
    494494        PythonSourcePage("sims", 
    495495            crumb="sims", 
    496             title=(abbr.xist(), ".sims"), 
    497             linkinfo="Simple schema validation", 
    498             url="root:xist/sims/index.html" 
     496            title=(abbr.xist(), ".sims · Python software · LivingLogic AG"), 
     497            header=(abbr.xist(), ".sims"), 
     498            subheader="Simple schema validation", 
     499            url="root:xist/sims/index.html", 
    499500        ), 
    500501        PythonSourcePage("xfind", 
    501502            crumb="xfind", 
    502             title=(abbr.xist(), ".xfind"), 
    503             linkinfo="Tree iteration and filtering", 
    504             url="root:xist/xfind/index.html" 
     503            title=(abbr.xist(), ".xfind · Python software · LivingLogic AG"), 
     504            header=(abbr.xist(), ".xfind"), 
     505            subheader="Tree iteration and filtering", 
     506            url="root:xist/xfind/index.html", 
    505507        ), 
    506508        PythonSourcePage("errors", 
    507509            crumb="errors", 
    508             title=(abbr.xist(), ".errors"), 
    509             linkinfo="Module containing exception classes", 
    510             url="root:xist/errors/index.html" 
    511         ), 
    512         XISTPage("Download", 
     510            title=(abbr.xist(), ".errors · Python software · LivingLogic AG"), 
     511            header=(abbr.xist(), ".errors"), 
     512            subheader="Module containing exception classes", 
     513            url="root:xist/errors/index.html", 
     514        ), 
     515        XISTPage("download", 
    513516            crumb="Download", 
    514             title=(abbr.xist(), " download"), 
    515             linkinfo="All versions for download", 
     517            title=(abbr.xist(), " download · Python software · LivingLogic AG"), 
     518            header=(abbr.xist(), " download"), 
     519            subheader="All versions for download", 
    516520            url="root:xist/Download.html", 
    517             localkeywords=["download", "file", "archive"] 
    518         ), 
    519         XISTPage("History", 
     521            localkeywords=["download", "file", "archive"], 
     522        ), 
     523        XISTPage("history", 
    520524            crumb="History", 
    521             title=(abbr.xist(), " history"), 
    522             linkinfo="The development history", 
     525            title=(abbr.xist(), " history · Python software · LivingLogic AG"), 
     526            header=(abbr.xist(), " history"), 
     527            subheader="The development history", 
    523528            url="root:xist/History.html", 
    524             localkeywords=["history", "changes", "version"] 
    525         ), 
    526         XISTPage("Installation", 
     529            localkeywords=["history", "changes", "version"], 
     530        ), 
     531        XISTPage("installation", 
    527532            crumb="Installation", 
    528             title=(abbr.xist(), " installation"), 
    529             linkinfo="Requirements, installation and configuration", 
     533            title=(abbr.xist(), " requirements and installation · Python software · LivingLogic AG"), 
     534            header=(abbr.xist(), " installation"), 
     535            subheader="Requirements, installation and configuration", 
    530536            url="root:xist/Installation.html", 
    531             localkeywords=["installation", "distutils"] 
    532         ), 
    533         XISTPage("Migration", 
     537            localkeywords=["installation", "distutils"], 
     538        ), 
     539        XISTPage("migration", 
    534540            crumb="Migration", 
    535             linkinfo=("How to update your code to new versions of ", abbr.xist()), 
    536             title=(abbr.xist(), " migration and modernization guide"), 
     541            title=(abbr.xist(), " migration guide · Python software · LivingLogic AG"), 
     542            header=(abbr.xist(), " migration"), 
     543            subheader=("How to update your code to new versions of ", abbr.xist()), 
    537544            url="root:xist/Migration.html", 
    538             localkeywords=[] 
    539         ), 
    540         XISTPage("Mailinglists", 
     545            localkeywords=[], 
     546        ), 
     547        XISTPage("mailinglists", 
    541548            crumb="Mailing lists", 
    542             linkinfo="How to subscribe to the mailing lists", 
    543             title=(abbr.xist(), " mailing lists"), 
     549            title=(abbr.xist(), " mailing lists · Python software · LivingLogic AG"), 
     550            header=(abbr.xist(), " mailing lists"), 
     551            subheader="How to subscribe to the mailing lists", 
    544552            url="root:xist/Mailinglists.html", 
    545             localkeywords=["mailing list", "list", "posting", "discussion", "announcement"] 
     553            localkeywords=["mailing list", "list", "posting", "discussion", "announcement"], 
    546554        ), 
    547555        crumb=abbr.xist(), 
    548         title=abbr.xist(), 
    549         linkinfo=("An extensible ", abbr.html(), "/", abbr.xml(), " generator"), 
     556        title=(abbr.xist(), " · Python software · LivingLogic AG"), 
     557        header=abbr.xist(), 
     558        subheader=("An extensible ", abbr.html(), "/", abbr.xml(), " generator"), 
    550559        url="root:xist/index.html", 
    551         inheritablekeywords=[abbr.xist(), abbr.xml(), "transformation", abbr.xsl(), "hsc"] 
     560        inheritablekeywords=[abbr.xist(), abbr.xml(), "transformation", abbr.xsl(), "hsc"], 
    552561    ), 
    553     PythonSourcePage("URL", 
    554         XISTPage("Howto", 
     562    PythonSourcePage("url", 
     563        XISTPage("howto", 
    555564            crumb="Howto", 
    556             linkinfo=("Special features of ", abbr.url()), 
    557             title=(abbr.url(), " documentation"), 
     565            title="URL howto · Python software · LivingLogic AG", 
     566            header="URL documentation", 
     567            subheader="Special features of URL", 
    558568            url="root:url/Howto.html", 
    559             localkeywords=[] 
    560         ), 
    561         XISTPage("Download", 
     569            localkeywords=[], 
     570        ), 
     571        XISTPage("download", 
    562572            crumb="Download", 
    563             title=(abbr.url(), " download"), 
    564             linkinfo="All versions for download", 
     573            title="URL download · Python software · LivingLogic AG", 
     574            header="URL download", 
     575            subheader="All versions for download", 
    565576            url="root:url/Download.html", 
    566             localkeywords=["download", "file", "archive"] 
    567         ), 
    568         XISTPage("History", 
     577            localkeywords=["download", "file", "archive"], 
     578        ), 
     579        XISTPage("history", 
    569580            crumb="History", 
    570             title="URL history", 
    571             linkinfo="The development history", 
     581            title="URL history · Python software · LivingLogic AG", 
     582            header="URL history", 
     583            subheader="The development history", 
    572584            url="root:url/History.html", 
    573             localkeywords=["packages", "history", "changes", "version"] 
    574         ), 
    575         XISTPage("Installation", 
     585            localkeywords=["packages", "history", "changes", "version"], 
     586        ), 
     587        XISTPage("installation", 
    576588            crumb="Installation", 
    577             title="URL installation", 
    578             linkinfo="Requirements and installation", 
     589            title="URL requirements and installation · Python software · LivingLogic AG", 
     590            header="URL installation", 
     591            subheader="Requirements and installation", 
    579592            url="root:url/Installation.html", 
    580             localkeywords=["installation", "distutils"] 
     593            localkeywords=["installation", "distutils"], 
    581594        ), 
    582595        crumb="url", 
    583         title="url", 
    584         linkinfo=("Module implementing ", abbr.url(), "s"), 
    585         url="root:url/index.html" 
     596        title="URL · Python software · LivingLogic AG", 
     597        header="url", 
     598        subheader=("Module implementing ", abbr.url(), "s"), 
     599        url="root:url/index.html", 
    586600    ), 
    587     PythonSourcePage("Make", 
    588         XISTPage("Download", 
     601    PythonSourcePage("make", 
     602        XISTPage("download", 
    589603            crumb="Download", 
    590             title="Make download", 
    591             linkinfo="All versions for download", 
     604            title="Make download · Python software · LivingLogic AG", 
     605            header="Make download", 
     606            subheader="All versions for download", 
    592607            url="root:make/Download.html", 
    593             localkeywords=["packages", "download", "file", "archive"] 
    594         ), 
    595         XISTPage("History", 
     608            localkeywords=["packages", "download", "file", "archive"], 
     609        ), 
     610        XISTPage("history", 
    596611            crumb="History", 
    597             title="Make history", 
    598             linkinfo="The development history", 
     612            title="Make history · Python software · LivingLogic AG", 
     613            header="Make history", 
     614            subheader="The development history", 
    599615            url="root:make/History.html", 
    600             localkeywords=["packages", "history", "changes", "version"] 
    601         ), 
    602         XISTPage("Installation", 
     616            localkeywords=["packages", "history", "changes", "version"], 
     617        ), 
     618        XISTPage("installation", 
    603619            crumb="Installation", 
    604             title="Make installation", 
    605             linkinfo="Requirements and installation", 
     620            title="Make requirements and installation · Python software · LivingLogic AG", 
     621            header="Make installation", 
     622            subheader="Requirements and installation", 
    606623            url="root:make/Installation.html", 
    607             localkeywords=["installation", "distutils"] 
    608         ), 
    609         XISTPage("Migration", 
     624            localkeywords=["installation", "distutils"], 
     625        ), 
     626        XISTPage("migration", 
    610627            crumb="Migration", 
    611             linkinfo="How to update your code to new versions of Make", 
    612             title="Make migration and modernization guide", 
     628            title="Make migration guide · Python software · LivingLogic AG", 
     629            header="Make migration guide", 
     630            subheader="How to update your code to new versions of Make", 
    613631            url="root:make/Migration.html", 
    614             localkeywords=[] 
     632            localkeywords=[], 
    615633        ), 
    616634        crumb="Make", 
    617         title="Make", 
    618         linkinfo="object oriented make replacement", 
     635        title="Make · Python software · LivingLogic AG", 
     636        header="Make", 
     637        subheader="Object oriented make replacement", 
    619638        url="root:make/index.html", 
    620         localkeywords=["make", "build", "dependencies", "development", "target"] 
     639        localkeywords=["make", "build", "dependencies", "development", "target"], 
    621640    ), 
    622     PythonSourcePage("Color", 
    623         XISTPage("Download", 
     641    PythonSourcePage("color", 
     642        XISTPage("download", 
    624643            crumb="Download", 
    625             title="Color download", 
    626             linkinfo="All versions for download", 
     644            title="Color download · Python software · LivingLogic AG", 
     645            header="Color download", 
     646            subheader="All versions for download", 
    627647            url="root:color/Download.html", 
    628             localkeywords=["packages", "download", "file", "archive"] 
    629         ), 
    630         XISTPage("History", 
     648            localkeywords=["packages", "download", "file", "archive"], 
     649        ), 
     650        XISTPage("history", 
    631651            crumb="History", 
    632             title="Color history", 
    633             linkinfo="The development history", 
     652            title="Color history · Python software · LivingLogic AG", 
     653            header="Color history", 
     654            subheader="The development history", 
    634655            url="root:color/History.html", 
    635             localkeywords=["packages", "history", "changes", "version"] 
    636         ), 
    637         XISTPage("Installation", 
     656            localkeywords=["packages", "history", "changes", "version"], 
     657        ), 
     658        XISTPage("installation", 
    638659            crumb="Installation", 
    639             title="Color installation", 
    640             linkinfo="Requirements and installation", 
     660            title="Color requirements and installation · Python software · LivingLogic AG", 
     661            header="Color installation", 
     662            subheader="Requirements and installation", 
    641663            url="root:color/Installation.html", 
    642             localkeywords=["installation", "distutils"] 
     664            localkeywords=["installation", "distutils"], 
    643665        ), 
    644666        crumb="Color", 
    645         title="Color", 
    646         linkinfo="handling RGB and other color models", 
     667        title="Color · Python software · LivingLogic AG", 
     668        header="Color", 
     669        subheader="RGB color values and color model conversion", 
    647670        url="root:color/index.html", 
    648         localkeywords=["RGB", "red", "green", "blue", "HSV", "HSB", "HSL", "HLS", "hue", "saturation", "value", "brightness", "luminance"] 
     671        localkeywords=["RGB", "red", "green", "blue", "HSV", "HSB", "HSL", "HLS", "hue", "saturation", "value", "brightness", "luminance"], 
    649672    ), 
    650     PythonSourcePage("Sisyphus", 
    651         XISTPage("Download", 
     673    PythonSourcePage("sisyphus", 
     674        XISTPage("download", 
    652675            crumb="Download", 
    653             linkinfo="All versions for download", 
    654             title="Sisyphus download", 
     676            title="Sisyphus download · Python software · LivingLogic AG", 
     677            header="Sisyphus download", 
     678            subheader="All versions for download", 
    655679            url="root:sisyphus/Download.html", 
    656             localkeywords=["download", "file", "archive"] 
    657         ), 
    658         XISTPage("History", 
     680            localkeywords=["download", "file", "archive"], 
     681        ), 
     682        XISTPage("history", 
    659683            crumb="History", 
    660             title="Sisyphus history", 
    661             linkinfo="The development history", 
     684            title="Sisyphus history · Python software · LivingLogic AG", 
     685            header="Sisyphus history", 
     686            subheader="The development history", 
    662687            url="root:sisyphus/History.html", 
    663             localkeywords=["history", "changes", "version"] 
     688            localkeywords=["history", "changes", "version"], 
    664689        ), 
    665690        crumb="Sisyphus", 
    666         title="Sisyphus", 
    667         linkinfo="Writing cron jobs with Python", 
     691        title="Sisyphus · Python software · LivingLogic AG", 
     692        header="Sisyphus", 
     693        subheader="Writing cron jobs with Python", 
    668694        url="root:sisyphus/index.html", 
    669         inheritablekeywords=["packages", "Sisyphus", "cron", "job"] 
     695        inheritablekeywords=["packages", "Sisyphus", "cron", "job"], 
    670696    ), 
    671     PythonSourcePage("ANSIStyle", 
    672         XISTPage("Download", 
     697    PythonSourcePage("ansistyle", 
     698        XISTPage("download", 
    673699            crumb="Download", 
    674             title="ANSIStyle download", 
    675             linkinfo="All versions for download", 
     700            title="ANSIStyle download · Python software · LivingLogic AG", 
     701            header="ANSIStyle download", 
     702            subheader="All versions for download", 
    676703            url="root:ansistyle/Download.html", 
    677             localkeywords=["download", "file", "archive"] 
    678         ), 
    679         XISTPage("History", 
     704            localkeywords=["download", "file", "archive"], 
     705        ), 
     706        XISTPage("history", 
    680707            crumb="History", 
    681             title="ANSIStyle history", 
    682             linkinfo="The development history", 
     708            title="ANSIStyle history · Python software · LivingLogic AG", 
     709            header="ANSIStyle history", 
     710            subheader="The development history", 
    683711            url="root:ansistyle/History.html", 
    684             localkeywords=["history", "changes", "version"] 
    685         ), 
    686         XISTPage("Installation", 
     712            localkeywords=["history", "changes", "version"], 
     713        ), 
     714        XISTPage("installation", 
    687715            crumb="Installation", 
    688             title="ANSIStyle installation", 
    689             linkinfo="Requirements and installation", 
     716            title="ANSIStyle requirements and installation · Python software · LivingLogic AG", 
     717            header="ANSIStyle installation", 
     718            subheader="Requirements and installation", 
    690719            url="root:ansistyle/Installation.html", 
    691             localkeywords=["installation", "distutils"] 
     720            localkeywords=["installation", "distutils"], 
    692721        ), 
    693722        crumb="ANSIStyle", 
    694         linkinfo="ANSI colors for output streams and strings", 
     723        title="ANSIStyle · Python software · LivingLogic AG", 
     724        header="ANSIStyle", 
     725        subheader="ANSI colors for output streams and strings", 
    695726        url="root:ansistyle/index.html", 
    696         inheritablekeywords=["packages", "ANSIStyle", abbr.ansi(), "escape", "color", "console"] 
     727        inheritablekeywords=["packages", "ANSIStyle", abbr.ansi(), "escape", "color", "console"], 
    697728    ), 
    698     PythonSourcePage("Toxic", 
    699         XISTPage("Download", 
     729    PythonSourcePage("toxic", 
     730        XISTPage("download", 
    700731            crumb="Download", 
    701             title="Toxic download", 
    702             linkinfo="All versions for download", 
     732            title="Toxic download · Python software · LivingLogic AG", 
     733            header="Toxic download", 
     734            subheader="All versions for download", 
    703735            url="root:toxic/Download.html", 
    704             localkeywords=["packages", "download", "file", "archive"] 
    705         ), 
    706         XISTPage("History", 
     736            localkeywords=["packages", "download", "file", "archive"], 
     737        ), 
     738        XISTPage("history", 
    707739            crumb="History", 
    708             title="Toxic history", 
    709             linkinfo="The development history", 
     740            title="Toxic history · Python software · LivingLogic AG", 
     741            header="Toxic history", 
     742            subheader="The development history", 
    710743            url="root:toxic/History.html", 
    711             localkeywords=["packages", "history", "changes", "version"] 
    712         ), 
    713         XISTPage("Installation", 
     744            localkeywords=["packages", "history", "changes", "version"], 
     745        ), 
     746        XISTPage("installation", 
    714747            crumb="Installation", 
    715             title="Toxic installation", 
    716             linkinfo="Requirements and installation", 
     748            title="Toxic requirements and installation · Python software · LivingLogic AG", 
     749            header="Toxic installation", 
     750            subheader="Requirements and installation", 
    717751            url="root:toxic/Installation.html", 
    718             localkeywords=["installation", "distutils"] 
     752            localkeywords=["installation", "distutils"], 
    719753        ), 
    720754        crumb="Toxic", 
    721         title="Toxic", 
    722         linkinfo=("Generate Oracle functions from PL/SQL embedded in ", abbr.xml()), 
     755        title="Toxic · Python software · LivingLogic AG", 
     756        header="Toxic", 
     757        subheader=("Generate Oracle functions from PL/SQL embedded in ", abbr.xml()), 
    723758        url="root:toxic/index.html", 
    724         localkeywords=["Oracle", "user defined function", "PL/SQL", "XML", "HTML", "processing instruction", "PI", "embed"] 
     759        localkeywords=["Oracle", "user defined function", "PL/SQL", "XML", "HTML", "processing instruction", "PI", "embed"], 
    725760    ), 
    726     PythonSourcePage("OraSQL", 
    727         XISTPage("Download", 
     761    PythonSourcePage("orasql", 
     762        XISTPage("download", 
    728763            crumb="Download", 
    729             title="OraSQL download", 
    730             linkinfo="All versions for download", 
     764            title="OraSQL download · Python software · LivingLogic AG", 
     765            header="OraSQL download", 
     766            subheader="All versions for download", 
    731767            url="root:orasql/Download.html", 
    732             localkeywords=["packages", "download", "file", "archive"] 
    733         ), 
    734         XISTPage("History", 
     768            localkeywords=["packages", "download", "file", "archive"], 
     769        ), 
     770        XISTPage("history", 
    735771            crumb="History", 
    736             title="OraSQL history", 
    737             linkinfo="The development history", 
     772            title="OraSQL history · Python software · LivingLogic AG", 
     773            header="OraSQL history", 
     774            subheader="The development history", 
    738775            url="root:orasql/History.html", 
    739             localkeywords=["packages", "history", "changes", "version"] 
    740         ), 
    741         XISTPage("Installation", 
     776            localkeywords=["packages", "history", "changes", "version"], 
     777        ), 
     778        XISTPage("installation", 
    742779            crumb="Installation", 
    743             title="OraSQL installation", 
    744             linkinfo="Requirements and installation", 
     780            title="OraSQL installation · Python software · LivingLogic AG", 
     781            header="OraSQL installation", 
     782            subheader="Requirements and installation", 
    745783            url="root:orasql/Installation.html", 
    746             localkeywords=["installation", "distutils"] 
     784            localkeywords=["installation", "distutils"], 
    747785        ), 
    748786        crumb="OraSQL", 
    749         title="OraSQL", 
    750         linkinfo=("Utilities for working with cx_Oracle"), 
     787        title="OraSQL · Python software · LivingLogic AG", 
     788        header="OraSQL", 
     789        subheader="Utilities for working with cx_Oracle", 
    751790        url="root:orasql/index.html", 
    752         localkeywords=["Oracle", "cx_Oracle"] 
     791        localkeywords=["Oracle", "cx_Oracle"], 
    753792    ), 
    754     PythonSourcePage("SQL", 
    755         XISTPage("Download", 
     793    PythonSourcePage("sql", 
     794        XISTPage("download", 
    756795            crumb="Download", 
    757             title="SQL download", 
    758             linkinfo="All versions for download", 
     796            title="SQL download · Python software · LivingLogic AG", 
     797            header="SQL download", 
     798            subheader="All versions for download", 
    759799            url="root:sql/Download.html", 
    760800            localkeywords=["packages", "download", "file", "archive"] 
    761801        ), 
    762         XISTPage("History", 
     802        XISTPage("history", 
    763803            crumb="History", 
    764             title="SQL history", 
    765             linkinfo="The development history", 
     804            title="SQL history · Python software · LivingLogic AG", 
     805            header="SQL history", 
     806            subheader="The development history", 
    766807            url="root:sql/History.html", 
    767808            localkeywords=["packages", "history", "changes", "version"] 
    768809        ), 
    769         XISTPage("Installation", 
     810        XISTPage("installation", 
    770811            crumb="Installation", 
    771             title="SQL installation", 
    772             linkinfo="Requirements and installation", 
     812            title="SQL requirements and installation · Python software · LivingLogic AG", 
     813            header="SQL installation", 
     814            subheader="Requirements and installation", 
    773815            url="root:sql/Installation.html", 
    774816            localkeywords=["installation", "distutils"] 
    775817        ), 
    776818        crumb="SQL", 
    777         linkinfo=("Simplifies generating ", abbr.sql(), " queries"), 
     819        title="SQL · Python software · LivingLogic AG", 
     820        header="SQL", 
     821        subheader=("Simplifies generating ", abbr.sql(), " queries"), 
    778822        url="root:sql/index.html", 
    779823        localkeywords=["packages", "SQL", "query"] 
    780824    ), 
    781     XISTPage("CVS", 
     825    XISTPage("cvs", 
    782826        crumb=(abbr.cvs(), " access"), 
    783         title=(abbr.cvs(), " access"), 
    784         linkinfo=("Access to the ", abbr.cvs(), " repository via ViewCVS"), 
     827        title=(abbr.cvs(), " access · Python software · LivingLogic AG"), 
     828        subheader=("Access to the ", abbr.cvs(), " repository via ViewCVS"), 
    785829        url="root:cvs.html", 
    786830        localkeywords=[abbr.cvs(), "development", "repository"] 
    787831    ), 
    788832    crumb="Python software", 
    789     title="Python software", 
    790     linkinfo="Python packages and modules by LivingLogic", 
     833    title="Python software · LivingLogic AG", 
     834    header="Python packages", 
     835    subheader="Python packages and modules by LivingLogic", 
    791836    url="root:index.html", 
    792837    inheritablekeywords=["Living", "Logic", "LivingLogic", "Bayreuth", "Python"], 
    793     localkeywords=["packages", abbr.xist(), "sql", "ansistyle", "sisyphus", "fileutils"] 
     838    localkeywords=["packages", abbr.xist(), "sql", "ansistyle", "sisyphus", "toxic", "orasql"] 
    794839) 
    795840 
     
    817862        else: 
    818863            page = pages 
    819         e = html.a(self.content, href=page.getURL(), title=page.getDescription()) 
     864        e = html.a(self.content, href=page.url, title=page.description) 
    820865        return e.convert(converter) 
    821866 
     
    908953 
    909954 
    910 class content(xsc.Element): 
     955class page(xsc.Element): 
    911956    model = sims.Elements(alldownloads, doc.block) 
    912     def convert(self, converter): 
    913         return self.content.convert(converter) 
    914  
    915  
    916 class page(xsc.Element): 
    917     model = sims.Elements(content) 
    918957    class Attrs(xsc.Element.Attrs): 
    919         class title(xsc.TextAttr): pass 
    920         class keywords(xsc.TextAttr): pass 
    921         class description(xsc.TextAttr): pass 
    922958        class refresh(xsc.TextAttr): pass 
    923         class class_(xsc.TextAttr): xmlname = "class" 
    924959        class path(xsc.TextAttr): pass 
    925960 
    926     def __linkLine(self, page, type, pos, indent): 
    927         e = htmlspecials.plaintable() 
    928  
    929         # empty space to the left 
    930         width = max(0, 15*(indent-1)) 
    931  
    932         e2 = html.tr(valign="top") 
    933         # empty space to the left of title strip 
    934         if width: 
    935             e2.append(html.td(htmlspecials.pixel(width=width), rowspan=2)) 
    936  
    937         # lines 
    938         if indent>0: 
    939             if type=="child" and page is not page.getParent()[-1]: 
    940                 e2.append(html.td(htmlspecials.autoimg(src="root:images/Links/Tree_Cont.gif", alt=""), class_="joiner")) 
    941             else: 
    942                 e2.append(html.td(htmlspecials.autoimg(src="root:images/Links/Tree_End.gif", alt=""))) 
    943  
    944         # title strip 
    945         name = page.getName() 
    946         if type=="here": 
    947             e2.append(html.td(html.div(name, class_="linktitle"), width=130, valign="bottom")) 
    948         else: 
    949             e2.append(html.td(html.a(html.span("(visited)", class_="visited", title="page has been visited"), name, href=page.getURL(), class_="linktitle"), width=130, valign="bottom")) 
    950  
    951         # next line 
    952         e.append(e2) 
    953  
    954         e2 = html.tr() 
    955         # lines 
    956         if indent>0: 
    957             if type=="child" and page is not page.getParent()[-1]: 
    958                 e2.append(html.td(htmlspecials.pixel(width=15), class_="joiner")) 
    959             else: 
    960                 e2.append(html.td(htmlspecials.pixel(width=15))) 
    961         if pos>=6: 
    962             name = "Link_6" 
    963         else: 
    964             name = "Link_%d%s" % (pos, "abcde"[indent]) 
    965         e2.append(html.td(html.div(page.getLinkInfo(), class_="linkinfo"))) 
    966         e.append(e2) 
     961    def _nodetype(self, path, activepath): 
     962        if path[-1] is activepath[-1]: 
     963            return "here" 
     964        elif path[-1] in activepath: 
     965            return "path" 
     966        else: 
     967            return "other" 
     968 
     969    def _node(self, path, activepath): 
     970        type = self._nodetype(path, activepath) 
     971        page = path[-1] 
     972        if type == "here": 
     973            e = html.div(page.crumb) 
     974            children = True 
     975        else: 
     976            e = html.a(html.span(u"\u2713", class_="visited", title="page has been visited"), page.crumb, href=page.url, class_=type) 
     977            children = (type == "path") 
     978        if len(path) > 1: 
     979            e = html.li(e, class_=type) 
     980        else: 
     981            e = xsc.Frag(e) 
     982        if children: 
     983            e.append(self._children(path, activepath)) 
    967984        return e 
    968985 
    969     def __links(self, context): 
    970         e = html.div(class_="links") 
    971         path = context.path.split("/") 
    972         curpage = pages 
    973         indent = 0 
    974         pos = 1 
    975         while curpage is not context.page: 
    976             e.append(self.__linkLine(curpage, "parent", pos, indent)) 
    977             curpage = curpage.getChildByName(path[indent]) 
    978             indent += 1 
    979             pos += 1 
    980         e.append(self.__linkLine(curpage, "here", pos, indent)) 
    981         indent += 1 
    982         pos += 1 
    983         for curpage in curpage: 
    984             e.append(self.__linkLine(curpage, "child", pos, indent)) 
    985             pos += 1 
     986    def _children(self, path, activepath): 
     987        e = html.ul() 
     988        for child in path[-1].getChildren(): 
     989            e.append(self._node(path + [child], activepath)) 
    986990        return e 
     991 
     992    def _links(self, context): 
     993        return self._node([pages], context.page.getPath()) 
    987994 
    988995    def _crumbs(self, context): 
     
    991998        while page is not None: 
    992999            if page is context.page: 
    993                 e.insert(0, html.span(page.getCrumb(), class_="here")) 
     1000                e.insert(0, html.span(page.crumb, class_="here")) 
    9941001            else: 
    995                 e.insert(0, self.xmlns.pageref(page.getCrumb(), ref=page.getPathString())) 
    996             e.insert(0, chars.nbsp(), htmlspecials.autoimg(src="root:images/KruemmelPfeil.gif", alt=" > "), chars.nbsp()) 
     1002                e.insert(0, self.__ns__.pageref(page.crumb, ref=page.getPathString())) 
     1003            e.insert(0, u"\xa0\u203a\xa0") 
    9971004            page = page.getParent() 
    9981005        e.insert(0, html.a("Home", href="http://www.livinglogic.de/", hreflang="de", title="The company homepage (in german)")) 
     
    10051012        context.path = unicode(self["path"].convert(converter)) 
    10061013        context.page = pages[context.path] 
    1007         # if the page does not have a "content" element, the whole page's content is considered as the page content 
    1008         e_content = self.content.find(xsc.FindType(content)) 
    1009         if not len(e_content): 
    1010             e_content = self.content 
    10111014        if issubclass(target, text): 
    10121015            e = target.html( 
    10131016                target.head( 
    10141017                    meta.contenttype(), 
    1015                     target.title(self["title"]), 
     1018                    target.title(context.page.title), 
    10161019                ), 
    10171020                target.body( 
    1018                     e_content 
     1021                    self.content 
    10191022                ) 
    10201023            ) 
    10211024        elif issubclass(target, doc): 
    1022             return e_content.convert(converter) 
     1025            return self.content.convert(converter) 
    10231026        elif not issubclass(target, html): 
    10241027            raise ValueError("unknown conversion target %r" % target) 
    10251028        else: 
     1029            header = xsc.Frag() 
     1030            if context.page.header: 
     1031                header.append(html.h1(context.page.header)) 
     1032            if context.page.subheader: 
     1033                header.append(html.h2(context.page.subheader)) 
     1034 
    10261035            c = htmlspecials.plaintable( 
    10271036                html.tr( 
    1028                     html.td(htmlspecials.pixel(height=50)), # links 
    1029                     html.td( # content 
    1030                         html.a( 
    1031                             htmlspecials.autoimg( 
    1032                                 src="root:images/LivingLogicKlein.gif", 
    1033                                 border=0, 
    1034                                 alt="[LivingLogic]", 
    1035                             ), 
    1036                             href="http://www.livinglogic.de/", 
    1037                             hreflang="de", 
    1038                             title="The company homepage (in german)" 
    1039                         ), 
    1040                         align="left", 
    1041                         valign="middle", 
    1042                         height=50 
    1043                     ), 
    1044                     class_="header" # this covers the background image 
     1037                    html.td(htmlspecials.pixel(height=50), class_="header1"), 
     1038                    html.td(header, class_="header2"), 
     1039                    html.td(htmlspecials.pixel(height=120), class_="header3"), 
     1040                    valign="bottom", 
    10451041                ), 
    10461042                html.tr( 
    1047                     html.td(colspan=2, class_="linie") 
     1043                    html.td(htmlspecials.pixel(), class_="crumbs1"), 
     1044                    html.td(self._crumbs(context), class_="crumbs2"), 
    10481045                ), 
    10491046                html.tr( 
    1050                     html.td(htmlspecials.pixel()), 
    1051                     html.td(html.div(self._crumbs(context), class_="crumbs")), 
    1052                     valign="top" 
     1047                    html.td( 
     1048                        htmlspecials.pixel(width=200), 
     1049                        self._links(context), 
     1050                        rowspan=2, 
     1051                        class_="links", 
     1052                    ), 
     1053                    html.td(self.content, class_="content"), 
     1054                    valign="top", 
    10531055                ), 
    1054                 html.tr( 
    1055                     html.td(self.__links(context)), 
    1056                     html.td(html.div(e_content, class_="content")), 
    1057                     valign="top" 
    1058                 ), 
    1059                 width="100%" 
     1056                width="100%", 
    10601057            ) 
    10611058 
    1062             keywords = context.page.getKeywords() 
    1063             if len(keywords): 
     1059            keywords = context.page.keywords 
     1060            if keywords: 
    10641061                keywords = meta.keywords(xsc.Frag(*keywords).withsep(", ")) 
    10651062            else: 
    10661063                keywords = xsc.Null 
    1067             description = context.page.getDescription() 
     1064            description = context.page.description 
    10681065            if description is not None: 
    10691066                description = meta.description(description) 
     
    10781075            if firstsibling is not None: 
    10791076                if firstsibling != context.page: 
    1080                     firstsibling = html.link(rel="first", title="First page in set", href=firstsibling.getURL()) 
     1077                    firstsibling = html.link(rel="first", title="First page in set", href=firstsibling.url) 
    10811078                else: 
    10821079                    firstsibling = None 
     
    10851082            if prevsibling is not None: 
    10861083                if prevsibling != context.page: 
    1087                     prevsibling = html.link(rel="prev", title="Previous page", href=prevsibling.getURL()) 
     1084                    prevsibling = html.link(rel="prev", title="Previous page", href=prevsibling.url) 
    10881085                else: 
    10891086                    prevsibling = None 
     
    10921089            if nextsibling is not None: 
    10931090                if nextsibling != context.page: 
    1094                     nextsibling = html.link(rel="next", title="Next page", href=nextsibling.getURL()) 
     1091                    nextsibling = html.link(rel="next", title="Next page", href=nextsibling.url) 
    10951092                else: 
    10961093                    nextsibling = None 
     
    10991096            if lastsibling is not None: 
    11001097                if lastsibling != context.page: 
    1101                     lastsibling = html.link(rel="last", title="Last page in set", href=lastsibling.getURL()) 
     1098                    lastsibling = html.link(rel="last", title="Last page in set", href=lastsibling.url) 
    11021099                else: 
    11031100                    lastsibling = None 
     
    11051102            parent = context.page.getParent() 
    11061103            if parent is not None: 
    1107                 parent = html.link(rel="up", href=parent.getURL()) 
     1104                parent = html.link(rel="up", href=parent.url) 
    11081105 
    11091106            top = context.page.getRoot() 
    11101107            if top is not None: 
    11111108                if top != context.page: 
    1112                     top = html.link(rel="top", href=top.getURL()) 
     1109                    top = html.link(rel="top", href=top.url) 
    11131110                else: 
    11141111                    top = None 
     
    11191116                target.head( 
    11201117                    meta.contenttype(), 
    1121                     target.title(self["title"]), 
    1122                     meta.stylesheet(href="root:Main.css", media="screen, projection, tv"), 
    1123                     meta.stylesheet(href="root:Doc.css", media="screen, projection, tv"), 
    1124                     meta.stylesheet(href="root:MainPrint.css", media="print"), 
    1125                     meta.stylesheet(href="root:DocPrint.css", media="print"), 
     1118                    target.title(context.page.title), 
     1119                    meta.stylesheet(href="root:main_screen.css", media="screen, projection, tv"), 
     1120                    meta.stylesheet(href="root:doc_screen.css", media="screen, projection, tv"), 
     1121                    meta.stylesheet(href="root:main_print.css", media="print"), 
     1122                    meta.stylesheet(href="root:doc_print.css", media="print"), 
    11261123                    meta.author(name=u"Walter Dörwald", email="walter.doerwald@livinglogic.de"), 
    11271124                    html.meta(name="icbm", content=icbm), 
     
    11291126                    html.meta(name="geo.placename", content="Bayreuth, Germany, Europe"), 
    11301127                    html.meta(name="geo.region", content="DE-BY"), 
    1131                     html.meta(name="DC.title", content=self["title"]), 
     1128                    html.meta(name="DC.title", content=context.page.title), 
    11321129                    html.link(rel="icon", href="root:images/favicon.gif", type="image/gif"), 
    11331130                    top, 
     
    11421139                    refresh 
    11431140                ), 
    1144                 target.body( 
    1145                     target.div(htmlspecials.autoimg(src=("root:images/Backdrops/Nautilus-", self["class_"], ".jpg"), alt=""), class_="backdrop"), 
    1146                     target.div(c, class_="page"), 
    1147                     class_=self["class_"] 
    1148                 ), 
     1141                target.body(c), 
    11491142                {(xml, "lang"): "en"}, 
    11501143                lang="en",