root/livinglogic.python.www/site/Python_xmlns.py @ 400:2a6eb40a5a98

Revision 400:2a6eb40a5a98, 41.9 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

Renamed venom to detox.

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