root/livinglogic.python.www/site/Python_xmlns.py @ 432:498e7642d382

Revision 432:498e7642d382, 43.7 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

Add pycoco.

withoutExt() -> withoutext().

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