root/livinglogic.python.www/site/Python_xmlns.py @ 354:470e566b1504

Revision 354:470e566b1504, 46.5 KB (checked in by Walter Doerwald <walter@…>, 14 years ago)

Add the rest of the packages to the description.

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