root/livinglogic.python.www/site/Python_xmlns.py @ 453:5f2926acef9f

Revision 453:5f2926acef9f, 43.9 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

ll-orasql 1.16.

Revamp download stuff: Now ssh-URLs are used to get all files for one
version of the package (and to get the sizes again).

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