root/livinglogic.python.www/site/Python_xmlns.py @ 333:f5713d401925

Revision 333:f5713d401925, 46.8 KB (checked in by Walter Doerwald <walter@…>, 14 years ago)

XIST release 2.9.

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