root/livinglogic.python.www/site/Python_xmlns.py @ 422:d752ecf3c03f

Revision 422:d752ecf3c03f, 42.2 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

ll-core 1.4.

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, 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    XISTPage(u"cvs",
897        crumb=(abbr.cvs(), u" access"),
898        title=(abbr.cvs(), u" access · Python software · LivingLogic AG"),
899        header=(abbr.cvs(), u" access"),
900        subheader=(u"Access to the ", abbr.cvs(), u" repository via ViewCVS"),
901        url=u"root:cvs.html",
902        localkeywords=[abbr.cvs(), u"development", u"repository"],
903        linktitle=u"ViewCVS view of the source code",
904        description=u"""
905        Provides a link to the ViewCVS view of the source code for all
906        Open Source Python projects by LivingLogic.
907        """
908    ),
909    crumb=u"Python software",
910    title=u"Python software · LivingLogic AG",
911    header=u"Python packages",
912    subheader=u"Python packages and modules by LivingLogic",
913    url=u"root:index.html",
914    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
915    localkeywords=[u"packages", abbr.xist(), u"sisyphus", u"toxic", u"orasql"],
916    linktitle=u"Startpage with project list",
917    description=u"""
918    LivingLogic provides several Open Source Python packages:
919    XIST, ll-url, ll-make, ll-color, ll-sisyphus, ll-toxic, ll-xpit, ll-orasql
920    """
921)
922
923
924class pageref(xsc.Element):
925    model = sims.NoElements()
926    class Attrs(xsc.Element.Attrs):
927        class ref(xsc.TextAttr): pass
928
929    def convert(self, converter):
930        if "ref" in self.attrs:
931            page = pages[unicode(self["ref"].convert(converter))]
932        else:
933            page = pages
934        e = html.a(self.content, href=page.url, title=page.linktitle)
935        return e.convert(converter)
936
937
938class download(xsc.Element):
939    model = sims.Empty()
940    class Attrs(xsc.Element.Attrs):
941        class href(xsc.TextAttr): pass
942        class type(xsc.TextAttr): pass
943
944    def convert(self, converter):
945        target = converter.target
946        name = url.URL(unicode(self["href"].convert(converter))).file
947        if "type" in self.attrs:
948            type = self["type"]
949        elif name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
950            type = "Source"
951        elif name.endswith(".egg"):
952            if "win32" in name:
953                type = "Windows egg"
954            elif "linux" in name:
955                type = "Linux egg"
956            else:
957                type = "Egg"
958            pos = name.rfind("py")
959            if pos >= 0:
960                version = name[pos+2:pos+5]
961                type += " (Python %s)" % version
962        elif name.endswith(".exe"):
963            type = "Windows installer"
964            pos = name.rfind("py")
965            if pos >= 0:
966                version = name[pos+2:-4]
967                type += " (Python %s)" % version
968        elif name.endswith(".src.rpm"):
969            type = "Source RPM"
970        elif name.endswith(".rpm"):
971            type = "Binary RPM"
972        else:
973            type = chars.nbsp()
974
975        if issubclass(target, doc):
976            e = target.item(
977                target.link(unicode(name), href=("http://ftp.livinglogic.de/", self["href"])),
978                " (",
979                type,
980                ")"
981            )
982        else:
983            e = html.tr(
984                html.td(html.a(unicode(name), href=("http://ftp.livinglogic.de/", self["href"]), title=("Download http://ftp.livinglogic.de/", self["href"])), class_="file"),
985                html.td(type, class_="type"),
986                class_="download"
987            )
988        return e.convert(converter)
989
990
991class downloads(xsc.Element):
992    model = sims.Elements(download)
993    class Attrs(xsc.Element.Attrs):
994        class version(xsc.TextAttr): pass
995        class date(xsc.TextAttr): pass
996
997    def convert(self, converter):
998        target = converter.target
999        if issubclass(target, doc):
1000            e = target.section(
1001                target.title("Version ", self["version"], " (released ", self["date"], ")"),
1002                target.ulist(self.content)
1003            )
1004        else:
1005            e = xsc.Frag(
1006                html.tr(
1007                    html.th(self["version"], class_="version"),
1008                    html.th("Type", class_="type"),
1009                ),
1010                self.content
1011            )
1012            if "date" in self.attrs:
1013                e[0][0].append(" ", html.span("(released ", self["date"], ")", class_="note"))
1014        return e.convert(converter)
1015
1016
1017class alldownloads(xsc.Element):
1018    model = sims.Elements(downloads)
1019
1020    def convert(self, converter):
1021        target = converter.target
1022        if issubclass(target, doc):
1023            e = self.content
1024        else:
1025            e = html.div(
1026                htmlspecials.plaintable(
1027                    self.content,
1028                    class_="downloads"
1029                ),
1030                align="center"
1031            )
1032        return e.convert(converter)
1033
1034
1035class page(xsc.Element):
1036    model = sims.Elements(alldownloads, doc.block)
1037    class Attrs(xsc.Element.Attrs):
1038        class refresh(xsc.TextAttr): pass
1039        class path(xsc.TextAttr): pass
1040
1041    def _nodetype(self, path, activepath):
1042        if path[-1] is activepath[-1]:
1043            return "here"
1044        elif path[-1] in activepath:
1045            return "path"
1046        else:
1047            return "other"
1048
1049    def _node(self, path, activepath):
1050        type = self._nodetype(path, activepath)
1051        page = path[-1]
1052        if type == "here":
1053            e = html.div(page.crumb)
1054            children = True
1055        else:
1056            e = html.a(
1057                html.span(u"\u2713", class_=u"visited", title=u"You have already visited that page"),
1058                page.crumb,
1059                href=page.url,
1060                title=page.linktitle,
1061                class_=type,
1062            )
1063            children = (type == "path")
1064        if len(path) > 1:
1065            e = html.li(e, class_=type)
1066        else:
1067            e = xsc.Frag(e)
1068        if children:
1069            e.append(self._children(path, activepath))
1070        return e
1071
1072    def _children(self, path, activepath):
1073        e = html.ul()
1074        for child in path[-1].getChildren():
1075            e.append(self._node(path + [child], activepath))
1076        return e
1077
1078    def _links(self, context):
1079        return self._node([pages], context.page.getPath())
1080
1081    def _crumbs(self, context):
1082        e = xsc.Frag()
1083        page = context.page
1084        while page is not None:
1085            if page is context.page:
1086                e.insert(0, html.span(page.crumb, class_=u"here"))
1087            else:
1088                e.insert(0, self.__ns__.pageref(page.crumb, ref=page.getPathString()))
1089            e.insert(0, u"\xa0\u203a\xa0")
1090            page = page.parent
1091        e.insert(0, html.a(u"Home", href=u"http://www.livinglogic.de/", hreflang=u"de", title=u"The company homepage (in german)"))
1092        return e
1093
1094    def convert(self, converter):
1095        converter[doc.pyref].base = "root:"
1096        target = converter.target
1097        context = converter[self]
1098        context.path = unicode(self["path"].convert(converter))
1099        context.page = pages[context.path]
1100        if issubclass(target, text):
1101            e = target.html(
1102                target.head(
1103                    meta.contenttype(),
1104                    target.title(context.page.title),
1105                ),
1106                target.body(
1107                    self.content
1108                )
1109            )
1110        elif issubclass(target, doc):
1111            return self.content.convert(converter)
1112        elif not issubclass(target, html):
1113            raise ValueError("unknown conversion target %r" % target)
1114        else:
1115            header = xsc.Frag()
1116            if context.page.header:
1117                header.append(html.h1(context.page.header))
1118            if context.page.subheader:
1119                header.append(html.h2(context.page.subheader))
1120
1121            c = htmlspecials.plaintable(
1122                html.tr(
1123                    html.td(htmlspecials.pixel(height=50), class_="header1", width="20%"),
1124                    html.td(header, class_="header2", width="79%"),
1125                    html.td(htmlspecials.pixel(height=120, width=30), class_="header3", width="1%"),
1126                    valign="bottom",
1127                    class_="header",
1128                ),
1129                html.tr(
1130                    html.td(htmlspecials.pixel(), class_="crumbs1"),
1131                    html.td(
1132                        htmlspecials.plaintable(
1133                            html.tr(
1134                                html.td(
1135                                    self._crumbs(context),
1136                                    class_="crumbs",
1137                                ),
1138                                html.td(
1139                                    xsc.Frag(context.page.alternates()).withsep(u"\xa0\xb7\xa0"),
1140                                    align="right",
1141                                    class_="alternate",
1142                                ),
1143                                valign="middle",
1144                            ),
1145                            width="100%",
1146                        ),
1147                        class_="crumbs2",
1148                    ),
1149                    class_="crumbs",
1150                ),
1151                html.tr(
1152                    html.td(
1153                        htmlspecials.pixel(width=200),
1154                        self._links(context),
1155                        rowspan=2,
1156                        class_="links",
1157                    ),
1158                    html.td(
1159                        self.content,
1160                        class_="content",
1161                    ),
1162                    valign="top",
1163                    class_="content",
1164                ),
1165                width="100%",
1166                class_="body",
1167            )
1168
1169            keywords = context.page.keywords
1170            if keywords:
1171                keywords = meta.keywords(xsc.Frag(*keywords).withsep(", "))
1172            else:
1173                keywords = xsc.Null
1174            description = context.page.description
1175            if description is not None:
1176                description = meta.description(description)
1177            else:
1178                description = xsc.Null
1179            if "refresh" in self.attrs:
1180                refresh = html.meta(http_equiv="refresh", content=self["refresh"])
1181            else:
1182                refresh = xsc.Null
1183
1184            firstsibling = context.page.getFirstSibling()
1185            if firstsibling is not None:
1186                if firstsibling != context.page:
1187                    firstsibling = html.link(rel="first", title="First page in set", href=firstsibling.url)
1188                else:
1189                    firstsibling = None
1190
1191            prevsibling = context.page.getPrevSibling()
1192            if prevsibling is not None:
1193                if prevsibling != context.page:
1194                    prevsibling = html.link(rel="prev", title="Previous page", href=prevsibling.url)
1195                else:
1196                    prevsibling = None
1197
1198            nextsibling = context.page.getNextSibling()
1199            if nextsibling is not None:
1200                if nextsibling != context.page:
1201                    nextsibling = html.link(rel="next", title="Next page", href=nextsibling.url)
1202                else:
1203                    nextsibling = None
1204
1205            lastsibling = context.page.getLastSibling()
1206            if lastsibling is not None:
1207                if lastsibling != context.page:
1208                    lastsibling = html.link(rel="last", title="Last page in set", href=lastsibling.url)
1209                else:
1210                    lastsibling = None
1211
1212            parent = context.page.parent
1213            if parent is not None:
1214                parent = html.link(rel="up", href=parent.url)
1215
1216            top = context.page.getRoot()
1217            if top is not None:
1218                if top != context.page:
1219                    top = html.link(rel="top", href=top.url)
1220                else:
1221                    top = None
1222
1223            icbm = u"49.9433; 11.5703"
1224
1225            e = target.html(
1226                target.head(
1227                    meta.contenttype(),
1228                    target.title(context.page.title),
1229                    keywords,
1230                    description,
1231                    meta.stylesheet(href="root:main_screen.css", media=u"screen, projection, tv"),
1232                    meta.stylesheet(href="root:main_print.css", media=u"print"),
1233                    meta.author(name=u"Walter Dörwald", email=u"walter.doerwald@livinglogic.de"),
1234                    html.meta(name=u"icbm", content=icbm),
1235                    html.meta(name=u"geo.position", content=icbm),
1236                    html.meta(name=u"geo.placename", content=u"Bayreuth, Germany, Europe"),
1237                    html.meta(name=u"geo.region", content=u"DE-BY"),
1238                    html.meta(name=u"DC.title", content=context.page.title),
1239                    html.link(rel=u"icon", href=u"root:images/favicon.gif", type=u"image/gif"),
1240                    top,
1241                    parent,
1242                    firstsibling,
1243                    prevsibling,
1244                    nextsibling,
1245                    lastsibling,
1246                    (html.link(link.attrs) for link in context.page.alternates()),
1247                    refresh
1248                ),
1249                target.body(c),
1250                xml.Attrs(lang=u"en"),
1251                lang=u"en",
1252            )
1253            e = xsc.Frag(
1254                xml.XML10(),
1255                u"\n",
1256                target.DocTypeXHTML10transitional(),
1257                u"\n",
1258                e
1259            )
1260        return e.convert(converter)
1261
1262
1263class __ns__(xsc.Namespace):
1264    xmlname = "py"
1265    xmlurl = "http://xmlns.livinglogic.de/Python"
1266__ns__.makemod(vars())
Note: See TracBrowser for help on using the browser.