root/livinglogic.python.www/site/Python_xmlns.py @ 501:bb20b2b6ab90

Revision 501:bb20b2b6ab90, 46.5 KB (checked in by Walter Doerwald <walter@…>, 12 years ago)

Don't use add() with a generator.

Line 
1# -*- coding: iso-8859-1 -*-
2
3
4from __future__ import with_statement
5
6import sys, types, inspect
7
8from ll import misc, url
9from ll.xist import xsc, sims, parsers
10from ll.xist.ns import html, chars, htmlspecials, specials, abbr, meta, doc, code, xml
11
12
13xmlns = "http://xmlns.livinglogic.de/Python"
14
15
16class Page(object):
17    """
18    A webpage in the sitemap tree.
19    This is an abstract class, that provides common
20    functionality for derived classes.
21    """
22
23    class keywords(misc.propclass):
24        def __get__(self):
25            keywords = list(self.localkeywords)
26            page = self
27            while page is not None:
28                for keyword in page.inheritablekeywords:
29                    if keyword not in keywords:
30                        keywords.append(keyword)
31                page = page.parent
32            return keywords
33
34    @misc.notimplemented
35    def getChildByIndex(self, index):
36        pass
37
38    @misc.notimplemented
39    def getChildByName(self, index):
40        pass
41
42    def getFirstSibling(self):
43        parent = self.parent
44        if parent is None:
45            return None
46        else:
47            return parent.getChildByIndex(0)
48
49    def getPrevSibling(self):
50        parent = self.parent
51        if parent is None:
52            return None
53        else:
54            sibling = None
55            for child in parent.getChildren():
56                if child is self:
57                    break
58                sibling = child
59            return sibling
60
61    def getNextSibling(self):
62        parent = self.parent
63        if parent is None:
64            return None
65        else:
66            sibling = None
67            for child in parent.getChildren():
68                if child is self:
69                    sibling = self
70                elif sibling is not None:
71                    return child
72                else:
73                    sibling = None
74            return None
75
76    def getLastSibling(self):
77        parent = self.parent
78        if parent is None:
79            return None
80        else:
81            return parent.getChildByIndex(-1)
82
83    @misc.notimplemented
84    def __len__(self):
85        pass
86
87    def getChildren(self):
88        children = []
89        index = 0
90        while True:
91            try:
92                children.append(self.getChildByIndex(index))
93            except IndexError:
94                break
95            index + 1
96        return children
97
98    def walk(self):
99        yield self
100        for child in self.getChildren():
101            for page in child.walk():
102                yield page
103
104    def __getitem__(self, index):
105        if isinstance(index, (int, long)):
106            return self.getChildByIndex(index)
107        elif isinstance(index, basestring):
108            if index=="":
109                index = []
110            else:
111                index = index.split("/")
112        if isinstance(index, (list, tuple)):
113            result = self
114            for i in index:
115                if isinstance(i, (int, long)):
116                    result = result.getChildByIndex(i)
117                elif isinstance(i, basestring):
118                    result = result.getChildByName(i)
119                else:
120                    raise TypeError("illegal index type %r" % type(i))
121            return result
122        else:
123            raise TypeError("wrong type %s for index (must be int, long, string, unicode or tuple)" % type(index))
124
125    def getPath(self):
126        path = []
127        page = self
128        while page is not None:
129            path.insert(0, page)
130            page = page.parent
131        return path
132
133    def getPathString(self):
134        return "/".join([ page.name for page in self.getPath() if page.parent])
135
136    def getRoot(self):
137        """
138        return the root page (i.e. the one without a parent)
139        """
140        parent = self
141        while 1:
142            testparent = parent.parent
143            if testparent is None:
144                return parent
145            parent = testparent
146
147    def __repr__(self):
148        return '<%s object path="%s" at 0x%x>' % (self.__class__.__name__, self.getPathString(), id(self))
149
150    def alternates(self):
151        return []
152
153
154class StaticPage(Page):
155    """
156    A webpage in the sitemap tree
157    """
158    def __init__(self, name, *children, **attrs):
159        self.parent = None
160        self.name = name
161        self.title = None
162        self.crumb = None
163        self.url = None
164        self.header = None
165        self.subheader = None
166        self.localkeywords = []
167        self.inheritablekeywords = []
168        self.linktitle = None
169        self.description = None
170        for (k, v) in attrs.items():
171            if k=="crumb":
172                self.crumb = v
173            elif k=="url":
174                self.url = v
175            elif k=="title":
176                self.title = v
177            elif k=="header":
178                self.header = v
179            elif k=="subheader":
180                self.subheader = v
181            elif k=="localkeywords":
182                self.localkeywords = v
183            elif k=="inheritablekeywords":
184                self.inheritablekeywords = v
185            elif k=="linktitle":
186                self.linktitle = u" ".join(v.strip().split())
187            elif k=="description":
188                self.description = u" ".join(v.strip().split())
189            else:
190                raise ValueError("unknown keyword %s" % k)
191        for child in children:
192            child.parent = self # this creates a cycle
193        self.__children = list(children)
194
195    def getChildByIndex(self, index):
196        return self.__children[index]
197
198    def getChildByName(self, index):
199        for child in self.__children:
200            if child.name == index:
201                return child
202        raise KeyError("unknown child %r in page %r" % (index, self.getPathString()))
203
204    def getChildren(self):
205        return self.__children
206
207    def __len__(self):
208        return len(self.__children)
209
210    def alternates(self):
211        alternates = super(StaticPage, self).alternates()
212
213        url = self.url
214        pos = url.rfind(".")
215        if pos>=0:
216            fourl = url[:pos+1] + "fo"
217            pdfurl = url[:pos+1] + "pdf"
218        else:
219            fourl = url + ".fo"
220            pdfurl = url + ".pdf"
221
222        return alternates + [
223            html.a(u"FO", href=fourl, rel="alternate", type="text/xml", title="An XSL-FO version of this page"),
224            html.a(u"PDF", href=pdfurl, rel="alternate", type="application/pdf", title="A PDF version of this page"),
225        ]
226
227
228class XISTPage(StaticPage):
229    def alternates(self):
230        alternates = super(XISTPage, self).alternates()
231
232        url = self.url
233        pos = url.rfind(".")
234        if pos>=0:
235            txturl = url[:pos+1] + "txt"
236            xmlurl = url[:pos+1] + "htmlxsc"
237        else:
238            txturl = url + ".txt"
239            xmlurl = url + ".htmlxsc"
240
241        return [
242            html.a("Text", href=txturl, rel="alternate", type="text/plain", title="A plain text version of this page"),
243            html.a("XIST", href=xmlurl, rel="alternate", type="text/xml", title=("The ", abbr.xist(), " source of this page"))
244        ] + alternates
245
246
247class PythonSourcePage(XISTPage):
248    def alternates(self):
249        alternates = super(PythonSourcePage, self).alternates()
250        url = self.url
251        if url.endswith(".html"):
252            url = url[:-5] + "_module.py"
253        else:
254            url = url + "_module.py"
255        return alternates + [html.a("Python", href=url, rel="alternate", type="text/x-python", title="The Python module described in this page")]
256
257
258pages = XISTPage(u"python",
259    PythonSourcePage(u"core",
260        PythonSourcePage(u"color",
261            crumb=u"ll.color",
262            title=u"ll.color · Python software · LivingLogic AG",
263            header=u"ll.color",
264            subheader=u"RGB color values and color model conversion",
265            url=u"root:color/index.html",
266            localkeywords=[u"RGB", u"red", u"green", u"blue", u"HSV", u"HSB", u"HSL", u"HLS", u"hue", u"saturation", u"value", u"brightness", u"luminance"],
267            linktitle=u"Module ll.color: RGB color values and color model conversion",
268            description=u"""
269            ll.color is a Python module that provides classes and functions for handling
270            RGB color values. This includes the ability to convert between different
271            color models (RGB, HSV, HLS) as well as to and from CSS format, and several
272            functions for modifying and mixing colors.
273            """,
274        ),
275        PythonSourcePage(u"make",
276            crumb=u"ll.make",
277            title=u"ll.make · Python software · LivingLogic AG",
278            header=u"ll.make",
279            subheader=u"Object oriented make replacement",
280            url=u"root:make/index.html",
281            localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
282            linktitle=u"Module ll.make: Object oriented make replacement",
283            description=u"""
284            ll.make is a Python module that provides an object oriented make replacement.
285            Like make it allows you to specify dependencies between files and actions
286            to be executed when files don't exist or are out of date with respect to
287            one of their sources. But unlike make you can do this in a object oriented
288            way and targets are not only limited to files, but you can implement
289            e.g. dependencies on database records.
290            """,
291        ),
292        PythonSourcePage(u"misc",
293            crumb=u"ll.misc",
294            title=u"ll.misc · Python software · LivingLogic AG",
295            header=u"ll.misc",
296            subheader=u"Miscellaneous utility functions and classes",
297            url=u"root:misc/index.html",
298            localkeywords=[u"utilities", u"decorator", u"property", u"module", u"namespace"],
299            linktitle=u"Module ll.misc: Misc utility functions and classes",
300            description=u"""
301            ll.misc provides serveral utility classes and functions.
302            """,
303        ),
304        PythonSourcePage(u"sisyphus",
305            crumb=u"ll.sisyphus",
306            title=u"ll.sisyphus · Python software · LivingLogic AG",
307            header=u"ll.sisyphus",
308            subheader=u"Writing cron jobs with Python",
309            url=u"root:sisyphus/index.html",
310            inheritablekeywords=[u"packages", u"Sisyphus", u"cron", u"job"],
311            linktitle=u"Module ll.sisyphus: Writing cron jobs with Python",
312            description=u"""
313            ll.sisyphus is a Python module that simplifies writing Python scripts
314            that run as cron jobs.
315            """,
316        ),
317        PythonSourcePage(u"daemon",
318            crumb=u"ll.daemon",
319            title=u"ll.daemon · Python software · LivingLogic AG",
320            header=u"ll.daemon",
321            subheader=u"Forking daemon processes with Python",
322            url=u"root:daemon/index.html",
323            inheritablekeywords=[u"daemon", u"fork", u"process"],
324            linktitle=u"Module ll.daemon: Forking daemon processes",
325            description=u"""
326            ll.daemon is a Python module that can be used on UNIX to fork a daemon process.
327            """,
328        ),
329        PythonSourcePage(u"url",
330            XISTPage(u"howto",
331                crumb=u"Howto",
332                title=u"ll.url howto · Python software · LivingLogic AG",
333                header=u"ll.url documentation",
334                subheader=u"Special features of URL",
335                url=u"root:url/Howto.html",
336                localkeywords=[],
337                linktitle=u"Special features of URL",
338            ),
339            crumb=u"ll.url",
340            title=u"ll.url · Python software · LivingLogic AG",
341            header=u"ll.url",
342            subheader=(u"Module implementing ", abbr.url(), u"s"),
343            url=u"root:url/index.html",
344            linktitle=u"Module ll.url: RFC 2396 compliant URLs",
345            description=u"""
346            ll.url is a Python module that provides classes for parsing and
347            constructing RFC 2396 compliant URLs.
348            """,
349        ),
350        PythonSourcePage(u"xpit",
351            crumb=u"ll.xpit",
352            title=u"ll.xpit · Python software · LivingLogic AG",
353            header=u"ll.xpit",
354            subheader=u"Embed Python expressions in text",
355            url=u"root:xpit/index.html",
356            localkeywords=[u"template", u"embed", u"processing instruction", u"PI", u"Python expression"],
357            linktitle=u"Module ll.xpit: Embed Python expressions in text",
358            description=u"""
359            ll.xpit is a Python module that allows you to embed Python expressions
360            in text files.
361            """,
362        ),
363        XISTPage(u"download",
364            XISTPage(u"old",
365                crumb=u"Old download",
366                title=u"Old core download · Python software · LivingLogic AG",
367                header=u"Old core download",
368                subheader=u"Download old modules as separate distributions",
369                url=u"root:core/OldDownload.html",
370                localkeywords=[u"download", u"file", u"archive"],
371                linktitle=u"Links to older distributions",
372            ),
373            crumb=u"Download",
374            title=u"Core download · Python software · LivingLogic AG",
375            header=u"Core download",
376            subheader=u"All versions for download",
377            url=u"root:core/Download.html",
378            localkeywords=[u"download", u"file", u"archive"],
379            linktitle=u"Links to Windows and Linux, source and binary distributions",
380        ),
381        XISTPage(u"history",
382            XISTPage(u"old",
383                crumb=u"Old history",
384                title=u"Old core history · Python software · LivingLogic AG",
385                header=u"Old core history",
386                subheader=u"The history before distribution restructuring",
387                url=u"root:core/OldHistory.html",
388                localkeywords=[u"history", u"changes", u"version"],
389                linktitle=u"Old ChangeLog for ll-core modules",
390            ),
391            crumb=u"History",
392            title=u"Core history · Python software · LivingLogic AG",
393            header=u"Core history",
394            subheader=u"The development history",
395            url=u"root:core/History.html",
396            localkeywords=[u"history", u"changes", u"version"],
397            linktitle=u"ChangeLog for ll-core",
398        ),
399        XISTPage(u"installation",
400            crumb=u"Installation",
401            title=u"Core requirements and installation · Python software · LivingLogic AG",
402            header=u"Core installation",
403            subheader=u"Requirements and installation",
404            url=u"root:core/Installation.html",
405            localkeywords=[u"installation", u"distutils"],
406            linktitle=u"How to install ll-core",
407        ),
408        XISTPage(u"migration",
409            XISTPage(u"old",
410                crumb=u"Old migration info",
411                title=u"Old core migration info · Python software · LivingLogic AG",
412                header=u"Old core migration info",
413                subheader=u"Migration infomation for old versions before distribution restructuring",
414                url=u"root:core/OldMigration.html",
415                localkeywords=[u"history", u"changes", u"version"],
416                linktitle=u"Old migration info",
417            ),
418            crumb=u"Migration",
419            title=(u"Core migration guide · Python software · LivingLogic AG"),
420            header=(u"Core migration"),
421            subheader=u"How to update your code to new versions",
422            url=u"root:core/Migration.html",
423            localkeywords=[],
424            linktitle=u"How to update your code to new versions of ll-core",
425        ),
426        crumb=u"Core",
427        title=u"Core · Python software · LivingLogic AG",
428        header=u"Core",
429        subheader=u"Core distribution containing color, make, misc, sisyphus, daemon, url and xpit",
430        url=u"root:core/index.html",
431        inheritablekeywords=[u"Python", u"package"],
432        linktitle=u"Package ll: Core modules",
433    ),
434    PythonSourcePage(u"xist",
435        XISTPage(u"examples",
436            crumb=u"Examples",
437            title=(abbr.xist(), u" examples · Python software · LivingLogic AG"),
438            header=(abbr.xist(), u" examples"),
439            subheader=(u"An introduction to ", abbr.xist(), u" by examples"),
440            url=u"root:xist/Examples.html",
441            localkeywords=[],
442            linktitle=u"XIST examples: Parsing/creating/modifying XML; Traversing XML trees"
443        ),
444        XISTPage(u"howto",
445            crumb=u"Howto",
446            title=(abbr.xist(), u" howto · Python software · LivingLogic AG"),
447            header=(abbr.xist(), u" howto"),
448            subheader=(u"A quick tour of ", abbr.xist()),
449            url=u"root:xist/Howto.html",
450            localkeywords=[],
451            linktitle=u"""
452            A quick tour of XIST: Explains parsing/generating XML files,
453            XML transformations via XIST classes and other basic concepts.
454            """
455        ),
456        XISTPage(u"searching",
457            crumb=u"Searching",
458            title=("Searching ", abbr.xist(), u" trees · Python software · LivingLogic AG"),
459            header=("Searching ", abbr.xist(), u" trees"),
460            subheader=("Searching, tree traversal, xfind and ", abbr.css(), " selectors"),
461            url=u"root:xist/Searching.html",
462            localkeywords=["searching", "traversal", "xfind", "css"],
463            linktitle=u"""
464            How to iterate through XIST trees
465            """
466        ),
467        XISTPage(u"transformation",
468            crumb=u"Transformation",
469            title=("Transforming ", abbr.xist(), u" trees · Python software · LivingLogic AG"),
470            header=("Transforming ", abbr.xist(), u" trees"),
471            subheader=("The ", doc.function("mapped"), " function, sorting, etc."),
472            url=u"root:xist/Transformation.html",
473            localkeywords=[],
474            linktitle=u"""
475            How to transform XIST trees
476            """
477        ),
478        XISTPage(u"advanced",
479            crumb=u"Advanced topics",
480            title=("Advanced ", abbr.xist(), u" · Python software · LivingLogic AG"),
481            header=("Advanced ", abbr.xist()),
482            subheader="Converter contexts, pool chaining, namespace extensions, conversion targets, validation",
483            url=u"root:xist/Advanced.html",
484            localkeywords=[],
485            linktitle=u"""
486            Advanced XIST features: pool chaining, converter contexts, validation
487            """
488        ),
489        XISTPage(u"misc",
490            crumb=u"Miscellaneous",
491            title=(abbr.xist(), u" miscellaneous · Python software · LivingLogic AG"),
492            header=(abbr.xist(), u" miscellaneous"),
493            subheader=(abbr.url(), u"s, pretty printing, image size, embedding Python code"),
494            url=u"root:xist/Misc.html",
495            localkeywords=[],
496            linktitle=u"""
497            Explains various odds and ends of XIST
498            """
499        ),
500        PythonSourcePage(u"xsc",
501            crumb=u"xsc",
502            title=(abbr.xist(), u".xsc · Python software · LivingLogic AG"),
503            header=(abbr.xist(), u".xsc"),
504            subheader=(abbr.xist(), u" core classes"),
505            url=u"root:xist/xsc/index.html",
506            linktitle=u"Module ll.xist.xsc: XIST core classes"
507        ),
508        PythonSourcePage(u"ns",
509            PythonSourcePage(u"html",
510                crumb=u"html",
511                title=(abbr.xist(), u".ns.html · Python software · LivingLogic AG"),
512                header=(abbr.xist(), u".ns.html"),
513                subheader=(u"Module implementing ", abbr.html(), u" 4.01 (with additions)"),
514                url=u"root:xist/ns/html/index.html",
515                linktitle=u"Module ll.xist.ns.html: HTML namespace",
516            ),
517            PythonSourcePage(u"xml",
518                crumb=u"xml",
519                title=(abbr.xist(), u".ns.xml · Python software · LivingLogic AG"),
520                header=(abbr.xist(), u".ns.xml"),
521                subheader=(u"Module for global attributes from the ", abbr.xml(), u" namespace"),
522                url=u"root:xist/ns/xml/index.html",
523                linktitle=u"Module ll.xist.ns.xml: Namespace implementing global XML attributes",
524            ),
525            PythonSourcePage(u"wml",
526                crumb=u"wml",
527                title=(abbr.xist(), u".ns.wml · Python software · LivingLogic AG"),
528                header=(abbr.xist(), u".ns.wml"),
529                subheader=(u"Module implementing ", abbr.wml(), u" 1.3"),
530                url=u"root:xist/ns/wml/index.html",
531                linktitle=u"Module ll.xist.ns.wml: WML 1.3 namespace",
532            ),
533            PythonSourcePage(u"ihtml",
534                crumb=u"ihtml",
535                title=(abbr.xist(), u".ns.ihtml · Python software · LivingLogic AG"),
536                header=(abbr.xist(), u".ns.ihtml"),
537                subheader=(u"Module module implementing i-mode compatible ", abbr.html()),
538                url=u"root:xist/ns/ihtml/index.html",
539                linktitle=u"Module ll.xist.ns.ihtml: Namespace implementing i-mode compatible HTML",
540            ),
541            PythonSourcePage(u"docbook",
542                crumb=u"docbook",
543                title=(abbr.xist(), u".ns.docbook · Python software · LivingLogic AG"),
544                header=(abbr.xist(), u".ns.docbook"),
545                subheader=u"Namespace module implementing DocBook 4.3",
546                url=u"root:xist/ns/docbook/index.html",
547                linktitle=u"Module ll.xist.ns.docbook: Namespace implementing DocBook 4.3",
548            ),
549            PythonSourcePage(u"svg",
550                crumb=u"svg",
551                title=(abbr.xist(), u".ns.svg · Python software · LivingLogic AG"),
552                header=(abbr.xist(), u".ns.svg"),
553                subheader=(u"Namespace module implementing ", abbr.svg(), u" 1.0"),
554                url=u"root:xist/ns/svg/index.html",
555                linktitle=u"Module ll.xist.ns.svg: Namespace implementing SVG 1.0",
556            ),
557            PythonSourcePage(u"abbr",
558                crumb=u"abbr",
559                title=(abbr.xist(), u".ns.abbr · Python software · LivingLogic AG"),
560                header=(abbr.xist(), u".ns.abbr"),
561                subheader=u"Namespace module containing many abbreviation entities",
562                url=u"root:xist/ns/abbr/index.html",
563                linktitle=u"Module ll.xist.ns.abbr: Namespace containing abbreviation entities",
564            ),
565            PythonSourcePage(u"code",
566                crumb=u"code",
567                title=(abbr.xist(), u".ns.code · Python software · LivingLogic AG"),
568                header=(abbr.xist(), u".ns.code"),
569                subheader=(u"Namespace module for embedding Python code in ", abbr.xml()),
570                url=u"root:xist/ns/code/index.html",
571                linktitle=u"Module ll.xist.ns.code: Namespace for embedding Python code in XML",
572            ),
573            PythonSourcePage(u"form",
574                crumb=u"form",
575                title=(abbr.xist(), u".ns.form · Python software · LivingLogic AG"),
576                header=(abbr.xist(), u".ns.form"),
577                subheader=u"Namespace module implementing form related elements",
578                url=u"root:xist/ns/form/index.html",
579                linktitle=u"Module ll.xist.ns.form: Namespace implementing form related elements",
580            ),
581            PythonSourcePage(u"php",
582                crumb=u"php",
583                title=(abbr.xist(), u".ns.php · Python software · LivingLogic AG"),
584                header=(abbr.xist(), u".ns.php"),
585                subheader=(u"Namespace module for PHP processing instructions"),
586                url=u"root:xist/ns/php/index.html",
587                linktitle=u"Module ll.xist.ns.php: Namespace for PHP processing instructions",
588            ),
589            PythonSourcePage(u"jsp",
590                crumb=u"jsp",
591                title=(abbr.xist(), u".ns.jsp · Python software · LivingLogic AG"),
592                header=(abbr.xist(), u".ns.jsp"),
593                subheader=(u"Namespace module for embedding ", abbr.jsp(), u" code as processing instructions"),
594                url=u"root:xist/ns/jsp/index.html",
595                linktitle=u"Module ll.xist.ns.jsp: Namespace for JSP code as processing instructions",
596            ),
597            PythonSourcePage(u"meta",
598                crumb=u"meta",
599                title=(abbr.xist(), u".ns.meta · Python software · LivingLogic AG"),
600                header=(abbr.xist(), u".ns.meta"),
601                subheader=u"Namespace module containing meta information elements",
602                url=u"root:xist/ns/meta/index.html",
603                linktitle=u"Module ll.xist.ns.meta: Namespace containing meta information elements",
604            ),
605            PythonSourcePage(u"ruby",
606                crumb=u"ruby",
607                title=(abbr.xist(), u".ns.ruby · Python software · LivingLogic AG"),
608                header=(abbr.xist(), u".ns.ruby"),
609                subheader=u"Namespace implementing the W3C ruby draft",
610                url=u"root:xist/ns/ruby/index.html",
611                linktitle=u"Module ll.xist.ns.ruby: Namespace implementing the W3C ruby draft",
612            ),
613            PythonSourcePage(u"specials",
614                crumb=u"specials",
615                title=(abbr.xist(), u".ns.specials · Python software · LivingLogic AG"),
616                header=(abbr.xist(), u".ns.specials"),
617                subheader=u"Common useful elements",
618                url=u"root:xist/ns/specials/index.html",
619                linktitle=u"Module ll.xist.ns.specials: Common useful elements",
620            ),
621            PythonSourcePage(u"htmlspecials",
622                crumb=u"htmlspecials",
623                title=(abbr.xist(), u".ns.htmlspecials · Python software · LivingLogic AG"),
624                header=(abbr.xist(), u".ns.htmlspecials"),
625                subheader=(u"Common useful elements for ", abbr.html(), u" generation"),
626                url=u"root:xist/ns/htmlspecials/index.html",
627                linktitle=u"Module ll.xist.ns.htmlspecials: Common useful elements for HTML generation",
628            ),
629            PythonSourcePage(u"doc",
630                crumb=u"doc",
631                title=(abbr.xist(), u".ns.doc · Python software · LivingLogic AG"),
632                header=(abbr.xist(), u".ns.doc"),
633                subheader=u"Namespace module for automated documentation generation",
634                url=u"root:xist/ns/doc/index.html",
635                linktitle=u"Module ll.xist.ns.doc: Namespace for automated documentation generation",
636            ),
637            PythonSourcePage(u"kid",
638                crumb=u"kid",
639                title=(abbr.xist(), u".ns.kid · Python software · LivingLogic AG"),
640                header=(abbr.xist(), u".ns.kid"),
641                subheader=u"Namespace module for Kid templates",
642                url=u"root:xist/ns/kid/index.html",
643                linktitle=u"Module ll.xist.ns.kid: Namespace for Kid templates",
644            ),
645            PythonSourcePage(u"detox",
646                crumb=u"detox",
647                title=(abbr.xist(), u".ns.detox · Python software · LivingLogic AG"),
648                header=(abbr.xist(), u".ns.detox"),
649                subheader=(abbr.xist(), u" based Python templating language"),
650                url=u"root:xist/ns/detox/index.html",
651                linktitle=u"Module ll.xist.ns.detox: Namespace for detox templates",
652            ),
653            PythonSourcePage(u"rng",
654                crumb=u"rng",
655                title=(abbr.xist(), u".ns.rng · Python software · LivingLogic AG"),
656                header=(abbr.xist(), u".ns.rng"),
657                subheader=u"Namespace module for Relax NG",
658                url=u"root:xist/ns/rng/index.html",
659                linktitle=u"Module ll.xist.ns.rng: Namespace for Relax NG",
660            ),
661            PythonSourcePage(u"rss091",
662                crumb=u"rss091",
663                title=(abbr.xist(), u".ns.rss091 · Python software · LivingLogic AG"),
664                header=(abbr.xist(), u".ns.rss091"),
665                subheader=u"Namespace module for RSS 0.91",
666                url=u"root:xist/ns/rss091/index.html",
667                linktitle=u"Module ll.xist.ns.rss091: Namespace for RSS 0.91",
668            ),
669            PythonSourcePage(u"rss20",
670                crumb=u"rss20",
671                title=(abbr.xist(), u".ns.rss20 · Python software · LivingLogic AG"),
672                header=(abbr.xist(), u".ns.rss20"),
673                subheader=u"Namespace module for RSS 2.0",
674                url=u"root:xist/ns/rss20/index.html",
675                linktitle=u"Module ll.xist.ns.rss20: Namespace for RSS 2.0",
676            ),
677            PythonSourcePage(u"atom",
678                crumb=u"atom",
679                title=(abbr.xist(), u".ns.atom · Python software · LivingLogic AG"),
680                header=(abbr.xist(), u".ns.atom"),
681                subheader=u"Namespace module for Atom 1.0",
682                url=u"root:xist/ns/atom/index.html",
683                linktitle=u"Module ll.xist.ns.atom: Namespace for Atom 1.0",
684            ),
685            PythonSourcePage(u"struts_html",
686                crumb=u"struts_html",
687                title=(abbr.xist(), u"ns.struts_html · Python software · LivingLogic AG"),
688                header=(abbr.xist(), u".ns.struts_html"),
689                subheader=(u"Mamespace module implementing the the Struts ", abbr.html(), u" tags"),
690                url=u"root:xist/ns/struts_html/index.html",
691                linktitle=u"Module ll.xist.ns.struts_html: Namespace for Jakarta Struts HTML tags",
692            ),
693            PythonSourcePage(u"struts_config",
694                crumb=u"struts_config",
695                title=(abbr.xist(), u".ns.struts_config · Python software · LivingLogic AG"),
696                header=(abbr.xist(), u".ns.struts_config"),
697                subheader=(u"Namespace module for Struts configuration files"),
698                url=u"root:xist/ns/struts_config/index.html",
699                linktitle=u"Module ll.xist.ns.struts_html: Namespace for Jakarta Struts configuration file tags",
700            ),
701            crumb=u"ns",
702            title=(abbr.xist(), u".ns"),
703            header=(abbr.xist(), u".ns"),
704            subheader=u"Subpackage containing namespace modules",
705            url=u"root:xist/ns/index.html",
706            linktitle=u"Package ll.xist.ns: Contains namespace modules",
707        ),
708        PythonSourcePage(u"parsers",
709            crumb=u"parsers",
710            title=(abbr.xist(), u".parsers · Python software · LivingLogic AG"),
711            header=(abbr.xist(), u".parsers"),
712            subheader=u"Module with classes for parsing files",
713            url=u"root:xist/parsers/index.html",
714            linktitle=u"Module ll.xist.parsers: Parsing XML",
715        ),
716        PythonSourcePage(u"converters",
717            crumb=u"converters",
718            title=(abbr.xist(), u".converters · Python software · LivingLogic AG"),
719            header=(abbr.xist(), u".converters"),
720            subheader=u"Module with the converter class",
721            url=u"root:xist/converters/index.html",
722            linktitle=u"Module ll.xist.converters: Configuring the XML transformation",
723        ),
724        PythonSourcePage(u"presenters",
725            crumb=u"presenters",
726            title=(abbr.xist(), u".presenters · Python software · LivingLogic AG"),
727            header=(abbr.xist(), u".presenters"),
728            subheader=u"Module with classes for printing trees",
729            url=u"root:xist/presenters/index.html",
730            linktitle=u"Module ll.xist.presenters: Screen output of XML trees",
731        ),
732        PythonSourcePage(u"publishers",
733            crumb=u"publishers",
734            title=(abbr.xist(), u".publishers · Python software · LivingLogic AG"),
735            header=(abbr.xist(), u".publishers"),
736            subheader=u"Module with classes for publishing trees",
737            url=u"root:xist/publishers/index.html",
738            linktitle=u"Module ll.xist.publishers: XML output",
739        ),
740        PythonSourcePage(u"sims",
741            crumb=u"sims",
742            title=(abbr.xist(), u".sims · Python software · LivingLogic AG"),
743            header=(abbr.xist(), u".sims"),
744            subheader=u"Simple schema validation",
745            url=u"root:xist/sims/index.html",
746            linktitle=u"Module ll.xist.sims: Simple schema validation",
747        ),
748        PythonSourcePage(u"xfind",
749            crumb=u"xfind",
750            title=(abbr.xist(), u".xfind · Python software · LivingLogic AG"),
751            header=(abbr.xist(), u".xfind"),
752            subheader=u"Tree iteration and filtering",
753            url=u"root:xist/xfind/index.html",
754            linktitle=u"Module ll.xist.xfind: Tree iteration and filtering",
755        ),
756        PythonSourcePage(u"css",
757            crumb=u"css",
758            title=(abbr.xist(), u".css · Python software · LivingLogic AG"),
759            header=(abbr.xist(), u".css"),
760            subheader=(abbr.css(), " related funtions"),
761            url=u"root:xist/css/index.html",
762            linktitle=u"Module ll.xist.css: CSS related functions",
763        ),
764        XISTPage(u"download",
765            crumb=u"Download",
766            title=(abbr.xist(), u" download · Python software · LivingLogic AG"),
767            header=(abbr.xist(), u" download"),
768            subheader=u"All versions for download",
769            url=u"root:xist/Download.html",
770            localkeywords=[u"download", u"file", u"archive"],
771            linktitle=u"Links to Windows and Linux, source and binary distributions",
772        ),
773        XISTPage(u"history",
774            crumb=u"History",
775            title=(abbr.xist(), u" history · Python software · LivingLogic AG"),
776            header=(abbr.xist(), u" history"),
777            subheader=u"The development history",
778            url=u"root:xist/History.html",
779            localkeywords=[u"history", u"changes", u"version"],
780            linktitle=u"ChangeLog for XIST",
781        ),
782        XISTPage(u"installation",
783            crumb=u"Installation",
784            title=(abbr.xist(), u" requirements and installation · Python software · LivingLogic AG"),
785            header=(abbr.xist(), u" installation"),
786            subheader=u"Requirements, installation and configuration",
787            url=u"root:xist/Installation.html",
788            localkeywords=[u"installation", u"distutils"],
789            linktitle=u"How to install and configure XIST",
790        ),
791        XISTPage(u"migration",
792            crumb=u"Migration",
793            title=(abbr.xist(), u" migration guide · Python software · LivingLogic AG"),
794            header=(abbr.xist(), u" migration"),
795            subheader=(u"How to update your code to new versions of ", abbr.xist()),
796            url=u"root:xist/Migration.html",
797            localkeywords=[],
798            linktitle=u"How to update your code to new versions of XIST",
799        ),
800        XISTPage(u"mailinglists",
801            crumb=u"Mailing lists",
802            title=(abbr.xist(), u" mailing lists · Python software · LivingLogic AG"),
803            header=(abbr.xist(), u" mailing lists"),
804            subheader=u"How to subscribe to the mailing lists",
805            url=u"root:xist/Mailinglists.html",
806            localkeywords=[u"mailing list", u"list", u"posting", u"discussion", u"announcement"],
807            linktitle=u"How to subscribe to the XIST mailing lists",
808        ),
809        crumb=abbr.xist(),
810        title=(abbr.xist(), u" · Python software · LivingLogic AG"),
811        header=abbr.xist(),
812        subheader=(u"An extensible ", abbr.html(), u"/", abbr.xml(), u" generator"),
813        url=u"root:xist/index.html",
814        inheritablekeywords=[abbr.xist(), abbr.xml(), u"transformation", abbr.xsl(), u"hsc"],
815        linktitle=u"Package ll.xist: An extensible XML/HTML generator",
816        description=u"""
817        XIST is an extensible HTML/XML generator written in Python. XIST is also a
818        DOM parser (built on top of SAX2) with a very simple and pythonesque tree
819        API. Every XML element type corresponds to a Python class and these Python
820        classes provide a conversion method to transform the XML tree (e.g. into
821        HTML). XIST can be considered 'object oriented XSL'.
822        """,
823    ),
824    PythonSourcePage(u"toxic",
825        XISTPage(u"download",
826            crumb=u"Download",
827            title=u"ll.toxic download · Python software · LivingLogic AG",
828            header=u"ll.toxic download",
829            subheader=u"All versions for download",
830            url=u"root:toxic/Download.html",
831            localkeywords=[u"packages", u"download", u"file", u"archive"],
832            linktitle=u"Links to Windows and Linux, source and binary distributions",
833        ),
834        XISTPage(u"history",
835            crumb=u"History",
836            title=u"ll.toxic history · Python software · LivingLogic AG",
837            header=u"ll.toxic history",
838            subheader=u"The development history",
839            url=u"root:toxic/History.html",
840            localkeywords=[u"packages", u"history", u"changes", u"version"],
841            linktitle=u"ChangeLog for ll-toxic",
842        ),
843        XISTPage(u"installation",
844            crumb=u"Installation",
845            title=u"ll.toxic requirements and installation · Python software · LivingLogic AG",
846            header=u"ll.toxic installation",
847            subheader=u"Requirements and installation",
848            url=u"root:toxic/Installation.html",
849            localkeywords=[u"installation", u"distutils"],
850            linktitle=u"How to install ll-toxic",
851        ),
852        crumb=u"ll.toxic",
853        title=u"ll.toxic · Python software · LivingLogic AG",
854        header=u"ll.toxic",
855        subheader=(u"Generate Oracle functions from PL/SQL embedded in ", abbr.xml()),
856        url=u"root:toxic/index.html",
857        localkeywords=[u"Oracle", u"user defined function", u"PL/SQL", u"XML", u"HTML", u"processing instruction", u"PI", u"embed"],
858        linktitle=u"Module ll.toxic: Embed PL/SQL in XIST XML",
859        description=u"""
860        ll.toxic is a Python module that provides an XIST namespace that can be
861        used for generating Oracle database functions that return XML strings.
862        This is done by embedding processing instructions containing PL/SQL code
863        into XML files and transforming those files with XIST.
864        """,
865    ),
866    PythonSourcePage(u"orasql",
867        XISTPage(u"download",
868            crumb=u"Download",
869            title=u"ll.orasql download · Python software · LivingLogic AG",
870            header=u"ll.orasql download",
871            subheader=u"All versions for download",
872            url=u"root:orasql/Download.html",
873            localkeywords=[u"packages", u"download", u"file", u"archive"],
874            linktitle=u"Links to Windows and Linux, source and binary distributions",
875        ),
876        XISTPage(u"history",
877            crumb=u"History",
878            title=u"ll.orasql history · Python software · LivingLogic AG",
879            header=u"ll.orasql history",
880            subheader=u"The development history",
881            url=u"root:orasql/History.html",
882            localkeywords=[u"packages", u"history", u"changes", u"version"],
883            linktitle=u"ChangeLog for ll-orasql",
884        ),
885        XISTPage(u"installation",
886            crumb=u"Installation",
887            title=u"ll.orasql installation · Python software · LivingLogic AG",
888            header=u"ll.orasql installation",
889            subheader=u"Requirements and installation",
890            url=u"root:orasql/Installation.html",
891            localkeywords=[u"installation", u"distutils"],
892            linktitle=u"How to install ll-orasql",
893        ),
894        crumb=u"ll.orasql",
895        title=u"ll.orasql · Python software · LivingLogic AG",
896        header=u"ll.orasql",
897        subheader=u"Utilities for working with cx_Oracle",
898        url=u"root:orasql/index.html",
899        localkeywords=[u"Oracle", u"cx_Oracle"],
900        linktitle=u"Module ll.orasql: Utilities for cx_Oracle",
901        description=u"""
902        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
903        It allows calling Oracle procedures via keyword arguments and it wraps the
904        result of fetch calls in a custom dictionary.
905        """,
906    ),
907    PythonSourcePage(u"nightshade",
908        XISTPage(u"download",
909            crumb=u"Download",
910            title=u"ll.nightshade download · Python software · LivingLogic AG",
911            header=u"ll.nightshade download",
912            subheader=u"All versions for download",
913            url=u"root:nightshade/Download.html",
914            localkeywords=[u"packages", u"download", u"file", u"archive"],
915            linktitle=u"Links to Windows and Linux, source and binary distributions",
916        ),
917        XISTPage(u"history",
918            crumb=u"History",
919            title=u"ll.nightshade history · Python software · LivingLogic AG",
920            header=u"ll.nightshade history",
921            subheader=u"The development history",
922            url=u"root:nightshade/History.html",
923            localkeywords=[u"packages", u"history", u"changes", u"version"],
924            linktitle=u"ChangeLog for ll-nightshade",
925        ),
926        XISTPage(u"installation",
927            crumb=u"Installation",
928            title=u"ll.nightshade installation · Python software · LivingLogic AG",
929            header=u"ll.nightshade installation",
930            subheader=u"Requirements and installation",
931            url=u"root:nightshade/Installation.html",
932            localkeywords=[u"installation", u"distutils"],
933            linktitle=u"How to install ll-nightshade",
934        ),
935        XISTPage(u"migration",
936            crumb=u"Migration",
937            title=(u"nightshade migration guide · Python software · LivingLogic AG"),
938            header=(u"nightshade migration"),
939            subheader=(u"How to update your code to new versions of nightshade"),
940            url=u"root:nightshade/Migration.html",
941            localkeywords=[],
942            linktitle=u"How to update your code to new versions of nightshade",
943        ),
944        crumb=u"ll.nightshade",
945        title=u"ll.nightshade · Python software · LivingLogic AG",
946        header=u"ll.nightshade",
947        subheader=u"Serving the output of Oracle functions/procedures with CherryPy",
948        url=u"root:nightshade/index.html",
949        localkeywords=[u"Oracle", u"cx_Oracle"],
950        linktitle=u"Module ll.nightshade: Serve the output of Oracle functions/procedures with CherryPy",
951        description=u"""
952        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
953        It allows calling Oracle procedures via keyword arguments and it wraps the
954        result of fetch calls in a custom dictionary.
955        """,
956    ),
957    PythonSourcePage(u"aplora",
958        XISTPage(u"download",
959            crumb=u"Download",
960            title=u"Aplora download · Python software · LivingLogic AG",
961            header=u"Aplora download",
962            subheader=u"All versions for download",
963            url=u"root:aplora/Download.html",
964            localkeywords=[u"packages", u"download", u"file", u"archive"],
965            linktitle=u"Links to source distribution",
966        ),
967        XISTPage(u"history",
968            crumb=u"History",
969            title=u"Aplora history · Python software · LivingLogic AG",
970            header=u"Aplora history",
971            subheader=u"The development history",
972            url=u"root:aplora/History.html",
973            localkeywords=[u"packages", u"history", u"changes", u"version"],
974            linktitle=u"ChangeLog for ll-aplora",
975        ),
976        XISTPage(u"installation",
977            crumb=u"Installation",
978            title=u"Aplora requirements, installation and configuration · Python software · LivingLogic AG",
979            header=u"Aplora installation",
980            subheader=u"Requirements, installation and configuration",
981            url=u"root:aplora/Installation.html",
982            localkeywords=[u"installation", u"distutils"],
983            linktitle=u"How to install ll-aplora",
984        ),
985        crumb=u"Aplora",
986        title=u"Aplora · Python software · LivingLogic AG",
987        header=u"Aplora",
988        subheader=(u"Logging Apache ", abbr.http(), u" requests to an Oracle database"),
989        url=u"root:aplora/index.html",
990        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
991        linktitle=u"Script ll.aplora: Logging Apache HTTP requests to an Oracle database",
992        description=u"""
993        ll-aplora is a script that can be used with Apaches piped logging facility
994        to log HTTP request to an Oracle database.
995        """,
996    ),
997    PythonSourcePage(u"pycoco",
998        XISTPage(u"download",
999            crumb=u"Download",
1000            title=u"Pycoco download · Python software · LivingLogic AG",
1001            header=u"Pycoco download",
1002            subheader=u"All versions for download",
1003            url=u"root:pycoco/Download.html",
1004            localkeywords=[u"packages", u"download", u"file", u"archive"],
1005            linktitle=u"Links to source distribution",
1006        ),
1007        XISTPage(u"history",
1008            crumb=u"History",
1009            title=u"Pycoco history · Python software · LivingLogic AG",
1010            header=u"Pycoco history",
1011            subheader=u"The development history",
1012            url=u"root:pycoco/History.html",
1013            localkeywords=[u"packages", u"history", u"changes", u"version"],
1014            linktitle=u"ChangeLog for pycoco",
1015        ),
1016        XISTPage(u"installation",
1017            crumb=u"Installation",
1018            title=u"Pycoco requirements, installation and configuration · Python software · LivingLogic AG",
1019            header=u"Pycoco installation",
1020            subheader=u"Requirements, installation and configuration",
1021            url=u"root:pycoco/Installation.html",
1022            localkeywords=[u"installation", u"distutils"],
1023            linktitle=u"How to install pycoco",
1024        ),
1025        crumb=u"Pycoco",
1026        title=u"Pycoco · Python software · LivingLogic AG",
1027        header=u"Pycoco",
1028        subheader=(u"Python code coverage report"),
1029        url=u"root:pycoco/index.html",
1030        localkeywords=[u"test", u"Python", "code coverage"],
1031        linktitle=u"Script pycoco: Python code coverage",
1032        description=u"""
1033        A script that can be used to generate code coverage info
1034        for the Python source code.
1035        """,
1036    ),
1037    XISTPage(u"source",
1038        crumb=u"Source code",
1039        title=u"Source code · Python software · LivingLogic AG",
1040        header=u"Source code",
1041        subheader=(u"Access to the Mercurial repositories"),
1042        url=u"root:Source.html",
1043        localkeywords=[u"Mercurial", u"development", u"repository"],
1044        linktitle=u"Access to the Mercurial repositories",
1045        description=u"""
1046        Provides a link to the Mercurial repositories for all
1047        Open Source Python projects by LivingLogic.
1048        """
1049    ),
1050    crumb=u"Python software",
1051    title=u"Python software · LivingLogic AG",
1052    header=u"Python packages",
1053    subheader=u"Python packages and modules by LivingLogic",
1054    url=u"root:index.html",
1055    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
1056    localkeywords=[u"packages", abbr.xist(), u"sisyphus", u"toxic", u"orasql"],
1057    linktitle=u"Startpage with project list",
1058    description=u"""
1059    LivingLogic provides several Open Source Python packages:
1060    XIST, ll-url, ll-make, ll-color, ll-sisyphus, ll-toxic, ll-xpit, ll-orasql
1061    """
1062)
1063
1064
1065class pageref(xsc.Element):
1066    xmlns = xmlns
1067    model = sims.NoElements()
1068    class Attrs(xsc.Element.Attrs):
1069        class ref(xsc.TextAttr): pass
1070
1071    def convert(self, converter):
1072        if "ref" in self.attrs:
1073            page = pages[unicode(self.attrs.ref.convert(converter))]
1074        else:
1075            page = pages
1076        e = html.a(self.content, href=page.url, title=page.linktitle)
1077        return e.convert(converter)
1078
1079
1080class download(xsc.Element):
1081    xmlns = xmlns
1082    model = sims.Empty()
1083    class Attrs(xsc.Element.Attrs):
1084        class version(xsc.TextAttr): pass
1085        class date(xsc.TextAttr): pass
1086
1087    base = "ssh://root@ftp.livinglogic.de/~ftp/pub/livinglogic/"
1088
1089    def file(self, converter, u):
1090        target = converter.target
1091        name = u.file
1092        if name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
1093            type = "Source"
1094        elif name.endswith(".egg"):
1095            if "win32" in name:
1096                type = "Windows egg"
1097            elif "linux" in name:
1098                type = "Linux egg"
1099            else:
1100                type = "Egg"
1101            pos = name.rfind("py")
1102            if pos >= 0:
1103                version = name[pos+2:pos+5]
1104                type += " (Python %s)" % version
1105        elif name.endswith(".exe"):
1106            type = "Windows installer"
1107            pos = name.rfind("py")
1108            if pos >= 0:
1109                version = name[pos+2:-4]
1110                type += " (Python %s)" % version
1111        elif name.endswith(".src.rpm"):
1112            type = "Source RPM"
1113        elif name.endswith(".rpm"):
1114            type = "Binary RPM"
1115        else:
1116            type = chars.nbsp()
1117
1118        href = ("http://ftp.livinglogic.de/", u.relative(self.base))
1119        if target.xmlns == doc.xmlns:
1120            e = target.item(target.link(unicode(name), href=href), " (", type,")")
1121        else:
1122            e = html.tr(
1123                html.td(html.a(unicode(name), href=href, title=("Download ", href)), class_="file"),
1124                html.td(type, class_="type"),
1125                html.td(u.size(), class_="size"),
1126                class_="download"
1127            )
1128        return e
1129
1130    def convert(self, converter):
1131        version = str(self.attrs.version.convert(converter))
1132        name = converter[downloads].name
1133        u = url.URL("%s/%s/" % (self.base, name))
1134        files = u/u.files("*-%s[-.][twpz]*" % version)
1135        files = (self.file(converter, f) for f in files)
1136        target = converter.target
1137        if target.xmlns == doc.xmlns:
1138            e = target.section(
1139                target.title("Version ", self.attrs.version, " (released ", self.attrs.date, ")"),
1140                target.ulist(files),
1141            )
1142        else:
1143            with xsc.Frag() as e:
1144                with html.tr():
1145                    with html.th(self.attrs.version, class_="version"):
1146                        if "date" in self.attrs:
1147                            xsc.add(" ", html.span("(released ", self.attrs.date, ")", class_="note"))
1148                    +html.th("Type", class_="type")
1149                    +html.th("Bytes", class_="size")
1150                xsc.add(files)
1151        return e.convert(converter)
1152
1153
1154class downloads(xsc.Element):
1155    xmlns = xmlns
1156    model = sims.Elements(download)
1157    class Attrs(xsc.Element.Attrs):
1158        class name(xsc.TextAttr): pass
1159    class Context(xsc.Element.Context):
1160        pass
1161
1162    def convert(self, converter):
1163        converter[self].name = str(self.attrs.name.convert(converter))
1164        target = converter.target
1165        if target.xmlns == doc.xmlns:
1166            e = self.content
1167        else:
1168            e = html.div(
1169                htmlspecials.plaintable(
1170                    self.content,
1171                    class_="downloads"
1172                ),
1173                align="center"
1174            )
1175        return e.convert(converter)
1176
1177
1178class page(xsc.Element):
1179    xmlns = xmlns
1180    model = sims.Elements(downloads, doc.block)
1181    class Attrs(xsc.Element.Attrs):
1182        class refresh(xsc.TextAttr): pass
1183        class path(xsc.TextAttr): pass
1184
1185    def _nodetype(self, path, activepath):
1186        if path[-1] is activepath[-1]:
1187            return "here"
1188        elif path[-1] in activepath:
1189            return "path"
1190        else:
1191            return "other"
1192
1193    def _node(self, path, activepath):
1194        type = self._nodetype(path, activepath)
1195        page = path[-1]
1196        if type == "here":
1197            e = html.div(page.crumb)
1198            children = True
1199        else:
1200            e = html.a(
1201                html.span(u"\u2713", class_=u"visited", title=u"You have already visited that page"),
1202                page.crumb,
1203                href=page.url,
1204                title=page.linktitle,
1205                class_=type,
1206            )
1207            children = (type == "path")
1208        if len(path) > 1:
1209            e = html.li(e, class_=type)
1210        else:
1211            e = xsc.Frag(e)
1212        if children:
1213            e.append(self._children(path, activepath))
1214        return e
1215
1216    def _children(self, path, activepath):
1217        return html.ul(self._node(path + [child], activepath) for child in path[-1].getChildren())
1218
1219    def _links(self, context):
1220        return self._node([pages], context.page.getPath())
1221
1222    def _crumbs(self, context):
1223        e = xsc.Frag()
1224        page = context.page
1225        while page is not None:
1226            if page is context.page:
1227                e.insert(0, html.span(page.crumb, class_=u"here"))
1228            else:
1229                e.insert(0, pageref(page.crumb, ref=page.getPathString()))
1230            e.insert(0, u"\xa0\u203a\xa0")
1231            page = page.parent
1232        e.insert(0, html.a(u"Home", href=u"http://www.livinglogic.de/", hreflang=u"de", title=u"The company homepage (in german)"))
1233        return e
1234
1235    def convert(self, converter):
1236        converter[doc.pyref].base = "root:"
1237        target = converter.target
1238        context = converter[self]
1239        context.path = unicode(self["path"].convert(converter))
1240        context.page = pages[context.path]
1241        if target.xmlns == doc.xmlns:
1242            return self.content.convert(converter)
1243        elif not target.xmlns == html.xmlns:
1244            raise ValueError("unknown conversion target %r" % target)
1245        else:
1246            with xsc.Frag(xml.XML(), u"\n", target.DocTypeXHTML10transitional(), u"\n") as e:
1247                with target.html(xml.Attrs(lang=u"en"), lang=u"en"):
1248                    with target.head():
1249                        +meta.contenttype()
1250                        +target.title(context.page.title)
1251                        if context.page.keywords:
1252                            +meta.keywords(xsc.Frag(*context.page.keywords).withsep(", "))
1253                        if context.page.description is not None:
1254                            +meta.description(context.page.description)
1255                        +meta.stylesheet(href="root:main_screen.css", media=u"screen, projection, tv")
1256                        +meta.stylesheet(href="root:main_print.css", media=u"print")
1257                        +meta.author(name=u"Walter Dörwald", email=u"walter.doerwald@livinglogic.de")
1258                        icbm = u"49.9550; 11.5909"
1259                        +html.meta(name=u"icbm", content=icbm)
1260                        +html.meta(name=u"geo.position", content=icbm)
1261                        +html.meta(name=u"geo.placename", content=u"Bayreuth, Germany, Europe")
1262                        +html.meta(name=u"geo.region", content=u"DE-BY")
1263                        +html.meta(name=u"DC.title", content=context.page.title)
1264                        +html.link(rel=u"icon", href=u"root:images/favicon.gif", type=u"image/gif")
1265                        top = context.page.getRoot()
1266                        if top is not None and top != context.page:
1267                            +html.link(rel="top", href=top.url)
1268                        parent = context.page.parent
1269                        if parent is not None:
1270                            +html.link(rel="up", href=parent.url)
1271                        firstsibling = context.page.getFirstSibling()
1272                        if firstsibling is not None and firstsibling != context.page:
1273                            +html.link(rel="first", title="First page in set", href=firstsibling.url)
1274                        prevsibling = context.page.getPrevSibling()
1275                        if prevsibling is not None and prevsibling != context.page:
1276                            +html.link(rel="prev", title="Previous page", href=prevsibling.url)
1277                        nextsibling = context.page.getNextSibling()
1278                        if nextsibling is not None and nextsibling != context.page:
1279                            +html.link(rel="next", title="Next page", href=nextsibling.url)
1280                        lastsibling = context.page.getLastSibling()
1281                        if lastsibling is not None and lastsibling != context.page:
1282                            +html.link(rel="last", title="Last page in set", href=lastsibling.url)
1283                        for link in context.page.alternates():
1284                            +html.link(link.attrs)
1285                        if "refresh" in self.attrs:
1286                            +html.meta(http_equiv="refresh", content=self.attrs.refresh)
1287
1288                    with target.body():
1289                        with htmlspecials.plaintable(width="100%", class_="body"):
1290                            with html.tr(valign="bottom", class_="header"):
1291                                +html.td(htmlspecials.pixel(height=50), class_="header1", width="20%")
1292                                with html.td(class_="header2", width="79%"):
1293                                    if context.page.header:
1294                                        +html.h1(context.page.header)
1295                                    if context.page.subheader:
1296                                        +html.h2(context.page.subheader)
1297                                +html.td(htmlspecials.pixel(height=120, width=30), class_="header3", width="1%")
1298                            with html.tr(class_="crumbs"):
1299                                +html.td(htmlspecials.pixel(), class_="crumbs1")
1300                                with html.td(class_="crumbs2"):
1301                                    with htmlspecials.plaintable(width="100%"):
1302                                        with html.tr(valign="middle"):
1303                                            +html.td(self._crumbs(context), class_="crumbs")
1304                                            +html.td(xsc.Frag(context.page.alternates()).withsep(u"\xa0\xb7\xa0"), align="right", class_="alternate")
1305                            with html.tr(valign="top", class_="content"):
1306                                +html.td(htmlspecials.pixel(width=200), self._links(context), rowspan=2, class_="links"),
1307                                +html.td(self.content, class_="content")
1308        return e.convert(converter)
Note: See TracBrowser for help on using the browser.