root/livinglogic.python.www/site/Python_xmlns.py @ 462:9e1630f325bf

Revision 462:9e1630f325bf, 45.6 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

First release of ll-nightshade

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