root/livinglogic.python.www/site/Python_xmlns.py @ 472:f8042115c7e6

Revision 472:f8042115c7e6, 45.4 KB (checked in by Walter Doerwald <walter@…>, 12 years ago)

Use generator expression.

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        PythonSourcePage(u"xsc",
457            crumb=u"xsc",
458            title=(abbr.xist(), u".xsc · Python software · LivingLogic AG"),
459            header=(abbr.xist(), u".xsc"),
460            subheader=(abbr.xist(), u" core classes"),
461            url=u"root:xist/xsc/index.html",
462            linktitle=u"Module ll.xist.xsc: XIST core classes."
463        ),
464        PythonSourcePage(u"ns",
465            PythonSourcePage(u"html",
466                crumb=u"html",
467                title=(abbr.xist(), u".ns.html · Python software · LivingLogic AG"),
468                header=(abbr.xist(), u".ns.html"),
469                subheader=(u"Module implementing ", abbr.html(), u" 4.01 (with additions)"),
470                url=u"root:xist/ns/html/index.html",
471                linktitle=u"Module ll.xist.ns.html: HTML namespace",
472            ),
473            PythonSourcePage(u"xml",
474                crumb=u"xml",
475                title=(abbr.xist(), u".ns.xml · Python software · LivingLogic AG"),
476                header=(abbr.xist(), u".ns.xml"),
477                subheader=(u"Module for global attributes from the ", abbr.xml(), u" namespace"),
478                url=u"root:xist/ns/xml/index.html",
479                linktitle=u"Module ll.xist.ns.xml: Namespace implementing global XML attributes",
480            ),
481            PythonSourcePage(u"wml",
482                crumb=u"wml",
483                title=(abbr.xist(), u".ns.wml · Python software · LivingLogic AG"),
484                header=(abbr.xist(), u".ns.wml"),
485                subheader=(u"Module implementing ", abbr.wml(), u" 1.3"),
486                url=u"root:xist/ns/wml/index.html",
487                linktitle=u"Module ll.xist.ns.wml: WML 1.3 namespace",
488            ),
489            PythonSourcePage(u"ihtml",
490                crumb=u"ihtml",
491                title=(abbr.xist(), u".ns.ihtml · Python software · LivingLogic AG"),
492                header=(abbr.xist(), u".ns.ihtml"),
493                subheader=(u"Module module implementing i-mode compatible ", abbr.html()),
494                url=u"root:xist/ns/ihtml/index.html",
495                linktitle=u"Module ll.xist.ns.ihtml: Namespace implementing i-mode compatible HTML",
496            ),
497            PythonSourcePage(u"docbook",
498                crumb=u"docbook",
499                title=(abbr.xist(), u".ns.docbook · Python software · LivingLogic AG"),
500                header=(abbr.xist(), u".ns.docbook"),
501                subheader=u"Namespace module implementing DocBook 4.3",
502                url=u"root:xist/ns/docbook/index.html",
503                linktitle=u"Module ll.xist.ns.docbook: Namespace implementing DocBook 4.3",
504            ),
505            PythonSourcePage(u"svg",
506                crumb=u"svg",
507                title=(abbr.xist(), u".ns.svg · Python software · LivingLogic AG"),
508                header=(abbr.xist(), u".ns.svg"),
509                subheader=(u"Namespace module implementing ", abbr.svg(), u" 1.0"),
510                url=u"root:xist/ns/svg/index.html",
511                linktitle=u"Module ll.xist.ns.svg: Namespace implementing SVG 1.0",
512            ),
513            PythonSourcePage(u"abbr",
514                crumb=u"abbr",
515                title=(abbr.xist(), u".ns.abbr · Python software · LivingLogic AG"),
516                header=(abbr.xist(), u".ns.abbr"),
517                subheader=u"Namespace module containing many abbreviation entities",
518                url=u"root:xist/ns/abbr/index.html",
519                linktitle=u"Module ll.xist.ns.abbr: Namespace containing abbreviation entities",
520            ),
521            PythonSourcePage(u"code",
522                crumb=u"code",
523                title=(abbr.xist(), u".ns.code · Python software · LivingLogic AG"),
524                header=(abbr.xist(), u".ns.code"),
525                subheader=(u"Namespace module for embedding Python code in ", abbr.xml()),
526                url=u"root:xist/ns/code/index.html",
527                linktitle=u"Module ll.xist.ns.code: Namespace for embedding Python code in XML",
528            ),
529            PythonSourcePage(u"form",
530                crumb=u"form",
531                title=(abbr.xist(), u".ns.form · Python software · LivingLogic AG"),
532                header=(abbr.xist(), u".ns.form"),
533                subheader=u"Namespace module implementing form related elements",
534                url=u"root:xist/ns/form/index.html",
535                linktitle=u"Module ll.xist.ns.form: Namespace implementing form related elements",
536            ),
537            PythonSourcePage(u"php",
538                crumb=u"php",
539                title=(abbr.xist(), u".ns.php · Python software · LivingLogic AG"),
540                header=(abbr.xist(), u".ns.php"),
541                subheader=(u"Namespace module for PHP processing instructions"),
542                url=u"root:xist/ns/php/index.html",
543                linktitle=u"Module ll.xist.ns.php: Namespace for PHP processing instructions",
544            ),
545            PythonSourcePage(u"jsp",
546                crumb=u"jsp",
547                title=(abbr.xist(), u".ns.jsp · Python software · LivingLogic AG"),
548                header=(abbr.xist(), u".ns.jsp"),
549                subheader=(u"Namespace module for embedding ", abbr.jsp(), u" code as processing instructions"),
550                url=u"root:xist/ns/jsp/index.html",
551                linktitle=u"Module ll.xist.ns.jsp: Namespace for JSP code as processing instructions",
552            ),
553            PythonSourcePage(u"meta",
554                crumb=u"meta",
555                title=(abbr.xist(), u".ns.meta · Python software · LivingLogic AG"),
556                header=(abbr.xist(), u".ns.meta"),
557                subheader=u"Namespace module containing meta information elements",
558                url=u"root:xist/ns/meta/index.html",
559                linktitle=u"Module ll.xist.ns.meta: Namespace containing meta information elements",
560            ),
561            PythonSourcePage(u"ruby",
562                crumb=u"ruby",
563                title=(abbr.xist(), u".ns.ruby · Python software · LivingLogic AG"),
564                header=(abbr.xist(), u".ns.ruby"),
565                subheader=u"Namespace implementing the W3C ruby draft",
566                url=u"root:xist/ns/ruby/index.html",
567                linktitle=u"Module ll.xist.ns.ruby: Namespace implementing the W3C ruby draft",
568            ),
569            PythonSourcePage(u"specials",
570                crumb=u"specials",
571                title=(abbr.xist(), u".ns.specials · Python software · LivingLogic AG"),
572                header=(abbr.xist(), u".ns.specials"),
573                subheader=u"Common useful elements",
574                url=u"root:xist/ns/specials/index.html",
575                linktitle=u"Module ll.xist.ns.specials: Common useful elements",
576            ),
577            PythonSourcePage(u"htmlspecials",
578                crumb=u"htmlspecials",
579                title=(abbr.xist(), u".ns.htmlspecials · Python software · LivingLogic AG"),
580                header=(abbr.xist(), u".ns.htmlspecials"),
581                subheader=(u"Common useful elements for ", abbr.html(), u" generation"),
582                url=u"root:xist/ns/htmlspecials/index.html",
583                linktitle=u"Module ll.xist.ns.htmlspecials: Common useful elements for HTML generation",
584            ),
585            PythonSourcePage(u"doc",
586                crumb=u"doc",
587                title=(abbr.xist(), u".ns.doc · Python software · LivingLogic AG"),
588                header=(abbr.xist(), u".ns.doc"),
589                subheader=u"Namespace module for automated documentation generation",
590                url=u"root:xist/ns/doc/index.html",
591                linktitle=u"Module ll.xist.ns.doc: Namespace for automated documentation generation",
592            ),
593            PythonSourcePage(u"kid",
594                crumb=u"kid",
595                title=(abbr.xist(), u".ns.kid · Python software · LivingLogic AG"),
596                header=(abbr.xist(), u".ns.kid"),
597                subheader=u"Namespace module for Kid templates",
598                url=u"root:xist/ns/kid/index.html",
599                linktitle=u"Module ll.xist.ns.kid: Namespace for Kid templates",
600            ),
601            PythonSourcePage(u"detox",
602                crumb=u"detox",
603                title=(abbr.xist(), u".ns.detox · Python software · LivingLogic AG"),
604                header=(abbr.xist(), u".ns.detox"),
605                subheader=(abbr.xist(), u" based Python templating language"),
606                url=u"root:xist/ns/detox/index.html",
607                linktitle=u"Module ll.xist.ns.detox: Namespace for detox templates",
608            ),
609            PythonSourcePage(u"rng",
610                crumb=u"rng",
611                title=(abbr.xist(), u".ns.rng · Python software · LivingLogic AG"),
612                header=(abbr.xist(), u".ns.rng"),
613                subheader=u"Namespace module for Relax NG",
614                url=u"root:xist/ns/rng/index.html",
615                linktitle=u"Module ll.xist.ns.rng: Namespace for Relax NG",
616            ),
617            PythonSourcePage(u"rss091",
618                crumb=u"rss091",
619                title=(abbr.xist(), u".ns.rss091 · Python software · LivingLogic AG"),
620                header=(abbr.xist(), u".ns.rss091"),
621                subheader=u"Namespace module for RSS 0.91",
622                url=u"root:xist/ns/rss091/index.html",
623                linktitle=u"Module ll.xist.ns.rss091: Namespace for RSS 0.91",
624            ),
625            PythonSourcePage(u"rss20",
626                crumb=u"rss20",
627                title=(abbr.xist(), u".ns.rss20 · Python software · LivingLogic AG"),
628                header=(abbr.xist(), u".ns.rss20"),
629                subheader=u"Namespace module for RSS 2.0",
630                url=u"root:xist/ns/rss20/index.html",
631                linktitle=u"Module ll.xist.ns.rss20: Namespace for RSS 2.0",
632            ),
633            PythonSourcePage(u"atom",
634                crumb=u"atom",
635                title=(abbr.xist(), u".ns.atom · Python software · LivingLogic AG"),
636                header=(abbr.xist(), u".ns.atom"),
637                subheader=u"Namespace module for Atom 1.0",
638                url=u"root:xist/ns/atom/index.html",
639                linktitle=u"Module ll.xist.ns.atom: Namespace for Atom 1.0",
640            ),
641            PythonSourcePage(u"struts_html",
642                crumb=u"struts_html",
643                title=(abbr.xist(), u"ns.struts_html · Python software · LivingLogic AG"),
644                header=(abbr.xist(), u".ns.struts_html"),
645                subheader=(u"Mamespace module implementing the the Struts ", abbr.html(), u" tags"),
646                url=u"root:xist/ns/struts_html/index.html",
647                linktitle=u"Module ll.xist.ns.struts_html: Namespace for Jakarta Struts HTML tags",
648            ),
649            PythonSourcePage(u"struts_config",
650                crumb=u"struts_config",
651                title=(abbr.xist(), u".ns.struts_config · Python software · LivingLogic AG"),
652                header=(abbr.xist(), u".ns.struts_config"),
653                subheader=(u"Namespace module for Struts configuration files"),
654                url=u"root:xist/ns/struts_config/index.html",
655                linktitle=u"Module ll.xist.ns.struts_html: Namespace for Jakarta Struts configuration file tags",
656            ),
657            crumb=u"ns",
658            title=(abbr.xist(), u".ns"),
659            header=(abbr.xist(), u".ns"),
660            subheader=u"Subpackage containing namespace modules",
661            url=u"root:xist/ns/index.html",
662            linktitle=u"Package ll.xist.ns: Contains namespace modules",
663        ),
664        PythonSourcePage(u"parsers",
665            crumb=u"parsers",
666            title=(abbr.xist(), u".parsers · Python software · LivingLogic AG"),
667            header=(abbr.xist(), u".parsers"),
668            subheader=u"Module with classes for parsing files",
669            url=u"root:xist/parsers/index.html",
670            linktitle=u"Module ll.xist.parsers: Parsing XML",
671        ),
672        PythonSourcePage(u"converters",
673            crumb=u"converters",
674            title=(abbr.xist(), u".converters · Python software · LivingLogic AG"),
675            header=(abbr.xist(), u".converters"),
676            subheader=u"Module with the converter class",
677            url=u"root:xist/converters/index.html",
678            linktitle=u"Module ll.xist.converters: Configuring the XML transformation",
679        ),
680        PythonSourcePage(u"presenters",
681            crumb=u"presenters",
682            title=(abbr.xist(), u".presenters · Python software · LivingLogic AG"),
683            header=(abbr.xist(), u".presenters"),
684            subheader=u"Module with classes for printing trees",
685            url=u"root:xist/presenters/index.html",
686            linktitle=u"Module ll.xist.presenters: Screen output of XML trees",
687        ),
688        PythonSourcePage(u"publishers",
689            crumb=u"publishers",
690            title=(u"ll.", abbr.xist(), u".publishers · Python software · LivingLogic AG"),
691            header=(u"ll.", abbr.xist(), u".publishers"),
692            subheader=u"Module with classes for publishing trees",
693            url=u"root:xist/publishers/index.html",
694            linktitle=u"Module ll.xist.publishers: XML output",
695        ),
696        PythonSourcePage(u"sims",
697            crumb=u"sims",
698            title=(u"ll.", abbr.xist(), u".sims · Python software · LivingLogic AG"),
699            header=(u"ll.", abbr.xist(), u".sims"),
700            subheader=u"Simple schema validation",
701            url=u"root:xist/sims/index.html",
702            linktitle=u"Module ll.xist.sims: Simple schema validation",
703        ),
704        PythonSourcePage(u"xfind",
705            crumb=u"xfind",
706            title=(u"ll.", abbr.xist(), u".xfind · Python software · LivingLogic AG"),
707            header=(u"ll.", abbr.xist(), u".xfind"),
708            subheader=u"Tree iteration and filtering",
709            url=u"root:xist/xfind/index.html",
710            linktitle=u"Module ll.xist.xfind: Tree iteration and filtering",
711        ),
712        XISTPage(u"download",
713            crumb=u"Download",
714            title=(abbr.xist(), u" download · Python software · LivingLogic AG"),
715            header=(abbr.xist(), u" download"),
716            subheader=u"All versions for download",
717            url=u"root:xist/Download.html",
718            localkeywords=[u"download", u"file", u"archive"],
719            linktitle=u"Links to Windows and Linux, source and binary distributions",
720        ),
721        XISTPage(u"history",
722            crumb=u"History",
723            title=(abbr.xist(), u" history · Python software · LivingLogic AG"),
724            header=(abbr.xist(), u" history"),
725            subheader=u"The development history",
726            url=u"root:xist/History.html",
727            localkeywords=[u"history", u"changes", u"version"],
728            linktitle=u"ChangeLog for XIST",
729        ),
730        XISTPage(u"installation",
731            crumb=u"Installation",
732            title=(abbr.xist(), u" requirements and installation · Python software · LivingLogic AG"),
733            header=(abbr.xist(), u" installation"),
734            subheader=u"Requirements, installation and configuration",
735            url=u"root:xist/Installation.html",
736            localkeywords=[u"installation", u"distutils"],
737            linktitle=u"How to install and configure XIST",
738        ),
739        XISTPage(u"migration",
740            crumb=u"Migration",
741            title=(abbr.xist(), u" migration guide · Python software · LivingLogic AG"),
742            header=(abbr.xist(), u" migration"),
743            subheader=(u"How to update your code to new versions of ", abbr.xist()),
744            url=u"root:xist/Migration.html",
745            localkeywords=[],
746            linktitle=u"How to update your code to new versions of XIST",
747        ),
748        XISTPage(u"mailinglists",
749            crumb=u"Mailing lists",
750            title=(abbr.xist(), u" mailing lists · Python software · LivingLogic AG"),
751            header=(abbr.xist(), u" mailing lists"),
752            subheader=u"How to subscribe to the mailing lists",
753            url=u"root:xist/Mailinglists.html",
754            localkeywords=[u"mailing list", u"list", u"posting", u"discussion", u"announcement"],
755            linktitle=u"How to subscribe to the XIST mailing lists",
756        ),
757        crumb=abbr.xist(),
758        title=(abbr.xist(), u" · Python software · LivingLogic AG"),
759        header=abbr.xist(),
760        subheader=(u"An extensible ", abbr.html(), u"/", abbr.xml(), u" generator"),
761        url=u"root:xist/index.html",
762        inheritablekeywords=[abbr.xist(), abbr.xml(), u"transformation", abbr.xsl(), u"hsc"],
763        linktitle=u"Package ll.xist: An extensible XML/HTML generator",
764        description=u"""
765        XIST is an extensible HTML/XML generator written in Python. XIST is also a
766        DOM parser (built on top of SAX2) with a very simple and pythonesque tree
767        API. Every XML element type corresponds to a Python class and these Python
768        classes provide a conversion method to transform the XML tree (e.g. into
769        HTML). XIST can be considered 'object oriented XSL'.
770        """,
771    ),
772    PythonSourcePage(u"toxic",
773        XISTPage(u"download",
774            crumb=u"Download",
775            title=u"ll.toxic download · Python software · LivingLogic AG",
776            header=u"ll.toxic download",
777            subheader=u"All versions for download",
778            url=u"root:toxic/Download.html",
779            localkeywords=[u"packages", u"download", u"file", u"archive"],
780            linktitle=u"Links to Windows and Linux, source and binary distributions",
781        ),
782        XISTPage(u"history",
783            crumb=u"History",
784            title=u"ll.toxic history · Python software · LivingLogic AG",
785            header=u"ll.toxic history",
786            subheader=u"The development history",
787            url=u"root:toxic/History.html",
788            localkeywords=[u"packages", u"history", u"changes", u"version"],
789            linktitle=u"ChangeLog for ll-toxic",
790        ),
791        XISTPage(u"installation",
792            crumb=u"Installation",
793            title=u"ll.toxic requirements and installation · Python software · LivingLogic AG",
794            header=u"ll.toxic installation",
795            subheader=u"Requirements and installation",
796            url=u"root:toxic/Installation.html",
797            localkeywords=[u"installation", u"distutils"],
798            linktitle=u"How to install ll-toxic",
799        ),
800        crumb=u"ll.toxic",
801        title=u"ll.toxic · Python software · LivingLogic AG",
802        header=u"ll.toxic",
803        subheader=(u"Generate Oracle functions from PL/SQL embedded in ", abbr.xml()),
804        url=u"root:toxic/index.html",
805        localkeywords=[u"Oracle", u"user defined function", u"PL/SQL", u"XML", u"HTML", u"processing instruction", u"PI", u"embed"],
806        linktitle=u"Module ll.toxic: Embed PL/SQL in XIST XML",
807        description=u"""
808        ll.toxic is a Python module that provides an XIST namespace that can be
809        used for generating Oracle database functions that return XML strings.
810        This is done by embedding processing instructions containing PL/SQL code
811        into XML files and transforming those files with XIST.
812        """,
813    ),
814    PythonSourcePage(u"orasql",
815        XISTPage(u"download",
816            crumb=u"Download",
817            title=u"ll.orasql download · Python software · LivingLogic AG",
818            header=u"ll.orasql download",
819            subheader=u"All versions for download",
820            url=u"root:orasql/Download.html",
821            localkeywords=[u"packages", u"download", u"file", u"archive"],
822            linktitle=u"Links to Windows and Linux, source and binary distributions",
823        ),
824        XISTPage(u"history",
825            crumb=u"History",
826            title=u"ll.orasql history · Python software · LivingLogic AG",
827            header=u"ll.orasql history",
828            subheader=u"The development history",
829            url=u"root:orasql/History.html",
830            localkeywords=[u"packages", u"history", u"changes", u"version"],
831            linktitle=u"ChangeLog for ll-orasql",
832        ),
833        XISTPage(u"installation",
834            crumb=u"Installation",
835            title=u"ll.orasql installation · Python software · LivingLogic AG",
836            header=u"ll.orasql installation",
837            subheader=u"Requirements and installation",
838            url=u"root:orasql/Installation.html",
839            localkeywords=[u"installation", u"distutils"],
840            linktitle=u"How to install ll-orasql",
841        ),
842        crumb=u"ll.orasql",
843        title=u"ll.orasql · Python software · LivingLogic AG",
844        header=u"ll.orasql",
845        subheader=u"Utilities for working with cx_Oracle",
846        url=u"root:orasql/index.html",
847        localkeywords=[u"Oracle", u"cx_Oracle"],
848        linktitle=u"Module ll.orasql: Utilities for cx_Oracle",
849        description=u"""
850        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
851        It allows calling Oracle procedures via keyword arguments and it wraps the
852        result of fetch calls in a custom dictionary.
853        """,
854    ),
855    PythonSourcePage(u"nightshade",
856        XISTPage(u"download",
857            crumb=u"Download",
858            title=u"ll.nightshade download · Python software · LivingLogic AG",
859            header=u"ll.nightshade download",
860            subheader=u"All versions for download",
861            url=u"root:nightshade/Download.html",
862            localkeywords=[u"packages", u"download", u"file", u"archive"],
863            linktitle=u"Links to Windows and Linux, source and binary distributions",
864        ),
865        XISTPage(u"history",
866            crumb=u"History",
867            title=u"ll.nightshade history · Python software · LivingLogic AG",
868            header=u"ll.nightshade history",
869            subheader=u"The development history",
870            url=u"root:nightshade/History.html",
871            localkeywords=[u"packages", u"history", u"changes", u"version"],
872            linktitle=u"ChangeLog for ll-nightshade",
873        ),
874        XISTPage(u"installation",
875            crumb=u"Installation",
876            title=u"ll.nightshade installation · Python software · LivingLogic AG",
877            header=u"ll.nightshade installation",
878            subheader=u"Requirements and installation",
879            url=u"root:nightshade/Installation.html",
880            localkeywords=[u"installation", u"distutils"],
881            linktitle=u"How to install ll-nightshade",
882        ),
883        XISTPage(u"migration",
884            crumb=u"Migration",
885            title=(u"nightshade migration guide · Python software · LivingLogic AG"),
886            header=(u"nightshade migration"),
887            subheader=(u"How to update your code to new versions of nightshade"),
888            url=u"root:nightshade/Migration.html",
889            localkeywords=[],
890            linktitle=u"How to update your code to new versions of nightshade",
891        ),
892        crumb=u"ll.nightshade",
893        title=u"ll.nightshade · Python software · LivingLogic AG",
894        header=u"ll.nightshade",
895        subheader=u"Serving the output of Oracle functions/procedures with CherryPy",
896        url=u"root:nightshade/index.html",
897        localkeywords=[u"Oracle", u"cx_Oracle"],
898        linktitle=u"Module ll.nightshade: Serve the output of Oracle functions/procedures with CherryPy",
899        description=u"""
900        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
901        It allows calling Oracle procedures via keyword arguments and it wraps the
902        result of fetch calls in a custom dictionary.
903        """,
904    ),
905    PythonSourcePage(u"aplora",
906        XISTPage(u"download",
907            crumb=u"Download",
908            title=u"Aplora download · Python software · LivingLogic AG",
909            header=u"Aplora download",
910            subheader=u"All versions for download",
911            url=u"root:aplora/Download.html",
912            localkeywords=[u"packages", u"download", u"file", u"archive"],
913            linktitle=u"Links to source distribution",
914        ),
915        XISTPage(u"history",
916            crumb=u"History",
917            title=u"Aplora history · Python software · LivingLogic AG",
918            header=u"Aplora history",
919            subheader=u"The development history",
920            url=u"root:aplora/History.html",
921            localkeywords=[u"packages", u"history", u"changes", u"version"],
922            linktitle=u"ChangeLog for ll-aplora",
923        ),
924        XISTPage(u"installation",
925            crumb=u"Installation",
926            title=u"Aplora requirements, installation and configuration · Python software · LivingLogic AG",
927            header=u"Aplora installation",
928            subheader=u"Requirements, installation and configuration",
929            url=u"root:aplora/Installation.html",
930            localkeywords=[u"installation", u"distutils"],
931            linktitle=u"How to install ll-aplora",
932        ),
933        crumb=u"Aplora",
934        title=u"Aplora · Python software · LivingLogic AG",
935        header=u"Aplora",
936        subheader=(u"Logging Apache ", abbr.http(), u" requests to an Oracle database"),
937        url=u"root:aplora/index.html",
938        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
939        linktitle=u"Script ll.aplora: Logging Apache HTTP requests to an Oracle database",
940        description=u"""
941        ll-aplora is a script that can be used with Apaches piped logging facility
942        to log HTTP request to an Oracle database.
943        """,
944    ),
945    PythonSourcePage(u"pycoco",
946        XISTPage(u"download",
947            crumb=u"Download",
948            title=u"Pycoco download · Python software · LivingLogic AG",
949            header=u"Pycoco download",
950            subheader=u"All versions for download",
951            url=u"root:pycoco/Download.html",
952            localkeywords=[u"packages", u"download", u"file", u"archive"],
953            linktitle=u"Links to source distribution",
954        ),
955        XISTPage(u"history",
956            crumb=u"History",
957            title=u"Pycoco history · Python software · LivingLogic AG",
958            header=u"Pycoco history",
959            subheader=u"The development history",
960            url=u"root:pycoco/History.html",
961            localkeywords=[u"packages", u"history", u"changes", u"version"],
962            linktitle=u"ChangeLog for pycoco",
963        ),
964        XISTPage(u"installation",
965            crumb=u"Installation",
966            title=u"Pycoco requirements, installation and configuration · Python software · LivingLogic AG",
967            header=u"Pycoco installation",
968            subheader=u"Requirements, installation and configuration",
969            url=u"root:pycoco/Installation.html",
970            localkeywords=[u"installation", u"distutils"],
971            linktitle=u"How to install pycoco",
972        ),
973        crumb=u"Pycoco",
974        title=u"Pycoco · Python software · LivingLogic AG",
975        header=u"Pycoco",
976        subheader=(u"Python code coverage report"),
977        url=u"root:pycoco/index.html",
978        localkeywords=[u"test", u"Python", "code coverage"],
979        linktitle=u"Script pycoco: Python code coverage",
980        description=u"""
981        A script that can be used to generate code coverage info
982        for the Python source code.
983        """,
984    ),
985    XISTPage(u"cvs",
986        crumb=(abbr.cvs(), u" access"),
987        title=(abbr.cvs(), u" access · Python software · LivingLogic AG"),
988        header=(abbr.cvs(), u" access"),
989        subheader=(u"Access to the ", abbr.cvs(), u" repository via ViewCVS"),
990        url=u"root:cvs.html",
991        localkeywords=[abbr.cvs(), u"development", u"repository"],
992        linktitle=u"ViewCVS view of the source code",
993        description=u"""
994        Provides a link to the ViewCVS view of the source code for all
995        Open Source Python projects by LivingLogic.
996        """
997    ),
998    crumb=u"Python software",
999    title=u"Python software · LivingLogic AG",
1000    header=u"Python packages",
1001    subheader=u"Python packages and modules by LivingLogic",
1002    url=u"root:index.html",
1003    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
1004    localkeywords=[u"packages", abbr.xist(), u"sisyphus", u"toxic", u"orasql"],
1005    linktitle=u"Startpage with project list",
1006    description=u"""
1007    LivingLogic provides several Open Source Python packages:
1008    XIST, ll-url, ll-make, ll-color, ll-sisyphus, ll-toxic, ll-xpit, ll-orasql
1009    """
1010)
1011
1012
1013class pageref(xsc.Element):
1014    xmlns = xmlns
1015    model = sims.NoElements()
1016    class Attrs(xsc.Element.Attrs):
1017        class ref(xsc.TextAttr): pass
1018
1019    def convert(self, converter):
1020        if "ref" in self.attrs:
1021            page = pages[unicode(self.attrs.ref.convert(converter))]
1022        else:
1023            page = pages
1024        e = html.a(self.content, href=page.url, title=page.linktitle)
1025        return e.convert(converter)
1026
1027
1028class download(xsc.Element):
1029    xmlns = xmlns
1030    model = sims.Empty()
1031    class Attrs(xsc.Element.Attrs):
1032        class version(xsc.TextAttr): pass
1033        class date(xsc.TextAttr): pass
1034
1035    base = "ssh://root@ftp.livinglogic.de/~ftp/pub/livinglogic/"
1036
1037    def file(self, converter, u):
1038        target = converter.target
1039        name = u.file
1040        if name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
1041            type = "Source"
1042        elif name.endswith(".egg"):
1043            if "win32" in name:
1044                type = "Windows egg"
1045            elif "linux" in name:
1046                type = "Linux egg"
1047            else:
1048                type = "Egg"
1049            pos = name.rfind("py")
1050            if pos >= 0:
1051                version = name[pos+2:pos+5]
1052                type += " (Python %s)" % version
1053        elif name.endswith(".exe"):
1054            type = "Windows installer"
1055            pos = name.rfind("py")
1056            if pos >= 0:
1057                version = name[pos+2:-4]
1058                type += " (Python %s)" % version
1059        elif name.endswith(".src.rpm"):
1060            type = "Source RPM"
1061        elif name.endswith(".rpm"):
1062            type = "Binary RPM"
1063        else:
1064            type = chars.nbsp()
1065
1066        href = ("http://ftp.livinglogic.de/", u.relative(self.base))
1067        if target.xmlns == doc.xmlns:
1068            e = target.item(
1069                target.link(unicode(name), href=href),
1070                " (",
1071                type,
1072                ")"
1073            )
1074        else:
1075            e = html.tr(
1076                html.td(html.a(unicode(name), href=href, title=("Download ", href)), class_="file"),
1077                html.td(type, class_="type"),
1078                html.td(u.size(), class_="size"),
1079                class_="download"
1080            )
1081        return e
1082
1083    def convert(self, converter):
1084        version = str(self.attrs.version.convert(converter))
1085        name = converter[downloads].name
1086        u = url.URL("%s/%s/" % (self.base, name))
1087        files = u/u.files("*-%s[-.][twpz]*" % version)
1088        files = (self.file(converter, f) for f in files)
1089        target = converter.target
1090        if target.xmlns == doc.xmlns:
1091            e = target.section(
1092                target.title("Version ", self.attrs.version, " (released ", self.attrs.date, ")"),
1093                target.ulist(files),
1094            )
1095        else:
1096            with xsc.Frag() as e:
1097                with html.tr():
1098                    with html.th(self.attrs.version, class_="version"):
1099                        if "date" in self.attrs:
1100                            xsc.append(" ", html.span("(released ", self.attrs.date, ")", class_="note"))
1101                    +html.th("Type", class_="type")
1102                    +html.th("Bytes", class_="size")
1103                xsc.append(files)
1104        return e.convert(converter)
1105
1106
1107class downloads(xsc.Element):
1108    xmlns = xmlns
1109    model = sims.Elements(download)
1110    class Attrs(xsc.Element.Attrs):
1111        class name(xsc.TextAttr): pass
1112    class Context(xsc.Element.Context):
1113        pass
1114
1115    def convert(self, converter):
1116        converter[self].name = str(self.attrs.name.convert(converter))
1117        target = converter.target
1118        if target.xmlns == doc.xmlns:
1119            e = self.content
1120        else:
1121            e = html.div(
1122                htmlspecials.plaintable(
1123                    self.content,
1124                    class_="downloads"
1125                ),
1126                align="center"
1127            )
1128        return e.convert(converter)
1129
1130
1131class page(xsc.Element):
1132    xmlns = xmlns
1133    model = sims.Elements(downloads, doc.block)
1134    class Attrs(xsc.Element.Attrs):
1135        class refresh(xsc.TextAttr): pass
1136        class path(xsc.TextAttr): pass
1137
1138    def _nodetype(self, path, activepath):
1139        if path[-1] is activepath[-1]:
1140            return "here"
1141        elif path[-1] in activepath:
1142            return "path"
1143        else:
1144            return "other"
1145
1146    def _node(self, path, activepath):
1147        type = self._nodetype(path, activepath)
1148        page = path[-1]
1149        if type == "here":
1150            e = html.div(page.crumb)
1151            children = True
1152        else:
1153            e = html.a(
1154                html.span(u"\u2713", class_=u"visited", title=u"You have already visited that page"),
1155                page.crumb,
1156                href=page.url,
1157                title=page.linktitle,
1158                class_=type,
1159            )
1160            children = (type == "path")
1161        if len(path) > 1:
1162            e = html.li(e, class_=type)
1163        else:
1164            e = xsc.Frag(e)
1165        if children:
1166            e.append(self._children(path, activepath))
1167        return e
1168
1169    def _children(self, path, activepath):
1170        return html.ul(self._node(path + [child], activepath) for child in path[-1].getChildren())
1171
1172    def _links(self, context):
1173        return self._node([pages], context.page.getPath())
1174
1175    def _crumbs(self, context):
1176        e = xsc.Frag()
1177        page = context.page
1178        while page is not None:
1179            if page is context.page:
1180                e.insert(0, html.span(page.crumb, class_=u"here"))
1181            else:
1182                e.insert(0, pageref(page.crumb, ref=page.getPathString()))
1183            e.insert(0, u"\xa0\u203a\xa0")
1184            page = page.parent
1185        e.insert(0, html.a(u"Home", href=u"http://www.livinglogic.de/", hreflang=u"de", title=u"The company homepage (in german)"))
1186        return e
1187
1188    def convert(self, converter):
1189        converter[doc.pyref].base = "root:"
1190        target = converter.target
1191        context = converter[self]
1192        context.path = unicode(self["path"].convert(converter))
1193        context.page = pages[context.path]
1194        if target.xmlns == doc.xmlns:
1195            return self.content.convert(converter)
1196        elif not target.xmlns == html.xmlns:
1197            raise ValueError("unknown conversion target %r" % target)
1198        else:
1199            header = xsc.Frag()
1200            if context.page.header:
1201                header.append(html.h1(context.page.header))
1202            if context.page.subheader:
1203                header.append(html.h2(context.page.subheader))
1204
1205            c = htmlspecials.plaintable(
1206                html.tr(
1207                    html.td(htmlspecials.pixel(height=50), class_="header1", width="20%"),
1208                    html.td(header, class_="header2", width="79%"),
1209                    html.td(htmlspecials.pixel(height=120, width=30), class_="header3", width="1%"),
1210                    valign="bottom",
1211                    class_="header",
1212                ),
1213                html.tr(
1214                    html.td(htmlspecials.pixel(), class_="crumbs1"),
1215                    html.td(
1216                        htmlspecials.plaintable(
1217                            html.tr(
1218                                html.td(
1219                                    self._crumbs(context),
1220                                    class_="crumbs",
1221                                ),
1222                                html.td(
1223                                    xsc.Frag(context.page.alternates()).withsep(u"\xa0\xb7\xa0"),
1224                                    align="right",
1225                                    class_="alternate",
1226                                ),
1227                                valign="middle",
1228                            ),
1229                            width="100%",
1230                        ),
1231                        class_="crumbs2",
1232                    ),
1233                    class_="crumbs",
1234                ),
1235                html.tr(
1236                    html.td(
1237                        htmlspecials.pixel(width=200),
1238                        self._links(context),
1239                        rowspan=2,
1240                        class_="links",
1241                    ),
1242                    html.td(
1243                        self.content,
1244                        class_="content",
1245                    ),
1246                    valign="top",
1247                    class_="content",
1248                ),
1249                width="100%",
1250                class_="body",
1251            )
1252
1253            keywords = context.page.keywords
1254            if keywords:
1255                keywords = meta.keywords(xsc.Frag(*keywords).withsep(", "))
1256            else:
1257                keywords = xsc.Null
1258            description = context.page.description
1259            if description is not None:
1260                description = meta.description(description)
1261            else:
1262                description = xsc.Null
1263            if "refresh" in self.attrs:
1264                refresh = html.meta(http_equiv="refresh", content=self["refresh"])
1265            else:
1266                refresh = xsc.Null
1267
1268            firstsibling = context.page.getFirstSibling()
1269            if firstsibling is not None:
1270                if firstsibling != context.page:
1271                    firstsibling = html.link(rel="first", title="First page in set", href=firstsibling.url)
1272                else:
1273                    firstsibling = None
1274
1275            prevsibling = context.page.getPrevSibling()
1276            if prevsibling is not None:
1277                if prevsibling != context.page:
1278                    prevsibling = html.link(rel="prev", title="Previous page", href=prevsibling.url)
1279                else:
1280                    prevsibling = None
1281
1282            nextsibling = context.page.getNextSibling()
1283            if nextsibling is not None:
1284                if nextsibling != context.page:
1285                    nextsibling = html.link(rel="next", title="Next page", href=nextsibling.url)
1286                else:
1287                    nextsibling = None
1288
1289            lastsibling = context.page.getLastSibling()
1290            if lastsibling is not None:
1291                if lastsibling != context.page:
1292                    lastsibling = html.link(rel="last", title="Last page in set", href=lastsibling.url)
1293                else:
1294                    lastsibling = None
1295
1296            parent = context.page.parent
1297            if parent is not None:
1298                parent = html.link(rel="up", href=parent.url)
1299
1300            top = context.page.getRoot()
1301            if top is not None:
1302                if top != context.page:
1303                    top = html.link(rel="top", href=top.url)
1304                else:
1305                    top = None
1306
1307            icbm = u"49.9433; 11.5703"
1308
1309            e = target.html(
1310                target.head(
1311                    meta.contenttype(),
1312                    target.title(context.page.title),
1313                    keywords,
1314                    description,
1315                    meta.stylesheet(href="root:main_screen.css", media=u"screen, projection, tv"),
1316                    meta.stylesheet(href="root:main_print.css", media=u"print"),
1317                    meta.author(name=u"Walter Dörwald", email=u"walter.doerwald@livinglogic.de"),
1318                    html.meta(name=u"icbm", content=icbm),
1319                    html.meta(name=u"geo.position", content=icbm),
1320                    html.meta(name=u"geo.placename", content=u"Bayreuth, Germany, Europe"),
1321                    html.meta(name=u"geo.region", content=u"DE-BY"),
1322                    html.meta(name=u"DC.title", content=context.page.title),
1323                    html.link(rel=u"icon", href=u"root:images/favicon.gif", type=u"image/gif"),
1324                    top,
1325                    parent,
1326                    firstsibling,
1327                    prevsibling,
1328                    nextsibling,
1329                    lastsibling,
1330                    (html.link(link.attrs) for link in context.page.alternates()),
1331                    refresh
1332                ),
1333                target.body(c),
1334                xml.Attrs(lang=u"en"),
1335                lang=u"en",
1336            )
1337            e = xsc.Frag(
1338                xml.XML10(),
1339                u"\n",
1340                target.DocTypeXHTML10transitional(),
1341                u"\n",
1342                e
1343            )
1344        return e.convert(converter)
Note: See TracBrowser for help on using the browser.