root/livinglogic.python.www/site/Python_xmlns.py @ 321:ae724daf4088

Revision 321:ae724daf4088, 47.1 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Add aplora and xpit.

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        PythonSourcePage(u"errors",
544            crumb=u"errors",
545            title=(abbr.xist(), u".errors · Python software · LivingLogic AG"),
546            header=(abbr.xist(), u".errors"),
547            subheader=u"Module containing exception classes",
548            url=u"root:xist/errors/index.html",
549            linktitle=u"Module ll.xist.errors: XIST exception classes",
550        ),
551        XISTPage(u"download",
552            crumb=u"Download",
553            title=(abbr.xist(), u" download · Python software · LivingLogic AG"),
554            header=(abbr.xist(), u" download"),
555            subheader=u"All versions for download",
556            url=u"root:xist/Download.html",
557            localkeywords=[u"download", u"file", u"archive"],
558            linktitle=u"Links to Windows and Linux, source and binary distributions",
559        ),
560        XISTPage(u"history",
561            crumb=u"History",
562            title=(abbr.xist(), u" history · Python software · LivingLogic AG"),
563            header=(abbr.xist(), u" history"),
564            subheader=u"The development history",
565            url=u"root:xist/History.html",
566            localkeywords=[u"history", u"changes", u"version"],
567            linktitle=u"ChangeLog for XIST",
568        ),
569        XISTPage(u"installation",
570            crumb=u"Installation",
571            title=(abbr.xist(), u" requirements and installation · Python software · LivingLogic AG"),
572            header=(abbr.xist(), u" installation"),
573            subheader=u"Requirements, installation and configuration",
574            url=u"root:xist/Installation.html",
575            localkeywords=[u"installation", u"distutils"],
576            linktitle=u"How to install and configure XIST",
577        ),
578        XISTPage(u"migration",
579            crumb=u"Migration",
580            title=(abbr.xist(), u" migration guide · Python software · LivingLogic AG"),
581            header=(abbr.xist(), u" migration"),
582            subheader=(u"How to update your code to new versions of ", abbr.xist()),
583            url=u"root:xist/Migration.html",
584            localkeywords=[],
585            linktitle=u"How to update your code to new versions of XIST",
586        ),
587        XISTPage(u"mailinglists",
588            crumb=u"Mailing lists",
589            title=(abbr.xist(), u" mailing lists · Python software · LivingLogic AG"),
590            header=(abbr.xist(), u" mailing lists"),
591            subheader=u"How to subscribe to the mailing lists",
592            url=u"root:xist/Mailinglists.html",
593            localkeywords=[u"mailing list", u"list", u"posting", u"discussion", u"announcement"],
594            linktitle=u"How to subscribe to the XIST mailing lists",
595        ),
596        crumb=abbr.xist(),
597        title=(abbr.xist(), u" · Python software · LivingLogic AG"),
598        header=abbr.xist(),
599        subheader=(u"An extensible ", abbr.html(), u"/", abbr.xml(), u" generator"),
600        url=u"root:xist/index.html",
601        inheritablekeywords=[abbr.xist(), abbr.xml(), u"transformation", abbr.xsl(), u"hsc"],
602        linktitle=u"Package ll.xist: An extensible XML/HTML generator",
603        description=u"""
604        XIST is an extensible HTML/XML generator written in Python. XIST is also a
605        DOM parser (built on top of SAX2) with a very simple and pythonesque tree
606        API. Every XML element type corresponds to a Python class and these Python
607        classes provide a conversion method to transform the XML tree (e.g. into
608        HTML). XIST can be considered 'object oriented XSL'.
609        """,
610    ),
611    PythonSourcePage(u"url",
612        XISTPage(u"howto",
613            crumb=u"Howto",
614            title=u"URL howto · Python software · LivingLogic AG",
615            header=u"URL documentation",
616            subheader=u"Special features of URL",
617            url=u"root:url/Howto.html",
618            localkeywords=[],
619            linktitle=u"Special features of URL",
620        ),
621        XISTPage(u"download",
622            crumb=u"Download",
623            title=u"URL download · Python software · LivingLogic AG",
624            header=u"URL download",
625            subheader=u"All versions for download",
626            url=u"root:url/Download.html",
627            localkeywords=[u"download", u"file", u"archive"],
628            linktitle=u"Links to Windows and Linux, source and binary distributions",
629        ),
630        XISTPage(u"history",
631            crumb=u"History",
632            title=u"URL history · Python software · LivingLogic AG",
633            header=u"URL history",
634            subheader=u"The development history",
635            url=u"root:url/History.html",
636            localkeywords=[u"packages", u"history", u"changes", u"version"],
637            linktitle=u"ChangeLog for ll-url",
638        ),
639        XISTPage(u"installation",
640            crumb=u"Installation",
641            title=u"URL requirements and installation · Python software · LivingLogic AG",
642            header=u"URL installation",
643            subheader=u"Requirements and installation",
644            url=u"root:url/Installation.html",
645            localkeywords=[u"installation", u"distutils"],
646            linktitle=u"How to install ll-url",
647        ),
648        crumb=u"url",
649        title=u"URL · Python software · LivingLogic AG",
650        header=u"url",
651        subheader=(u"Module implementing ", abbr.url(), u"s"),
652        url=u"root:url/index.html",
653        linktitle=u"Module ll.url: RFC 2396 compliant URLs",
654        description=u"""
655        ll-url is a Python module that provides classes for parsing and
656        constructing RFC 2396 compliant URLs.
657        """,
658    ),
659    PythonSourcePage(u"make",
660        XISTPage(u"download",
661            crumb=u"Download",
662            title=u"Make download · Python software · LivingLogic AG",
663            header=u"Make download",
664            subheader=u"All versions for download",
665            url=u"root:make/Download.html",
666            localkeywords=[u"packages", u"download", u"file", u"archive"],
667            linktitle=u"Links to Windows and Linux, source and binary distributions",
668        ),
669        XISTPage(u"history",
670            crumb=u"History",
671            title=u"Make history · Python software · LivingLogic AG",
672            header=u"Make history",
673            subheader=u"The development history",
674            url=u"root:make/History.html",
675            localkeywords=[u"packages", u"history", u"changes", u"version"],
676            linktitle=u"ChangeLog for ll-make",
677        ),
678        XISTPage(u"installation",
679            crumb=u"Installation",
680            title=u"Make requirements and installation · Python software · LivingLogic AG",
681            header=u"Make installation",
682            subheader=u"Requirements and installation",
683            url=u"root:make/Installation.html",
684            localkeywords=[u"installation", u"distutils"],
685            linktitle=u"How to install ll-make",
686        ),
687        XISTPage(u"migration",
688            crumb=u"Migration",
689            title=u"Make migration guide · Python software · LivingLogic AG",
690            header=u"Make migration guide",
691            subheader=u"How to update your code to new versions of Make",
692            url=u"root:make/Migration.html",
693            localkeywords=[],
694            linktitle=u"How to update your code to new versions of ll-make",
695        ),
696        crumb=u"Make",
697        title=u"Make · Python software · LivingLogic AG",
698        header=u"Make",
699        subheader=u"Object oriented make replacement",
700        url=u"root:make/index.html",
701        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
702        linktitle=u"Module ll.make: Object oriented make replacement",
703        description=u"""
704        ll-make is a Python module that provides an object oriented make replacement.
705        Like make it allows you to specify dependencies between files and actions
706        to be executed when files don't exist or are out of date with respect to
707        one of their sources. But unlike make you can do this in a object oriented
708        way and targets are not only limited to files, but you can implement
709        e.g. dependencies on database records.
710        """,
711    ),
712    PythonSourcePage(u"color",
713        XISTPage(u"download",
714            crumb=u"Download",
715            title=u"Color download · Python software · LivingLogic AG",
716            header=u"Color download",
717            subheader=u"All versions for download",
718            url=u"root:color/Download.html",
719            localkeywords=[u"packages", u"download", u"file", u"archive"],
720            linktitle=u"Links to Windows and Linux, source and binary distributions",
721        ),
722        XISTPage(u"history",
723            crumb=u"History",
724            title=u"Color history · Python software · LivingLogic AG",
725            header=u"Color history",
726            subheader=u"The development history",
727            url=u"root:color/History.html",
728            localkeywords=[u"packages", u"history", u"changes", u"version"],
729            linktitle=u"ChangeLog for ll-color",
730        ),
731        XISTPage(u"installation",
732            crumb=u"Installation",
733            title=u"Color requirements and installation · Python software · LivingLogic AG",
734            header=u"Color installation",
735            subheader=u"Requirements and installation",
736            url=u"root:color/Installation.html",
737            localkeywords=[u"installation", u"distutils"],
738            linktitle=u"How to install ll-color",
739        ),
740        crumb=u"Color",
741        title=u"Color · Python software · LivingLogic AG",
742        header=u"Color",
743        subheader=u"RGB color values and color model conversion",
744        url=u"root:color/index.html",
745        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"],
746        linktitle=u"Module ll.color: RGB color values and color model conversion",
747        description=u"""
748        ll-color is a Python module that provides classes and functions for handling
749        RGB color values. This includes the ability to convert between different
750        color models (RGB, HSV, HLS) as well as to and from CSS format, and several
751        functions for modifying and mixing colors.
752        """,
753    ),
754    PythonSourcePage(u"sisyphus",
755        XISTPage(u"download",
756            crumb=u"Download",
757            title=u"Sisyphus download · Python software · LivingLogic AG",
758            header=u"Sisyphus download",
759            subheader=u"All versions for download",
760            url=u"root:sisyphus/Download.html",
761            localkeywords=[u"download", u"file", u"archive"],
762            linktitle=u"Links to Windows and Linux, source and binary distributions",
763        ),
764        XISTPage(u"history",
765            crumb=u"History",
766            title=u"Sisyphus history · Python software · LivingLogic AG",
767            header=u"Sisyphus history",
768            subheader=u"The development history",
769            url=u"root:sisyphus/History.html",
770            localkeywords=[u"history", u"changes", u"version"],
771            linktitle=u"ChangeLog for ll-sisyphus",
772        ),
773        crumb=u"Sisyphus",
774        title=u"Sisyphus · Python software · LivingLogic AG",
775        header=u"Sisyphus",
776        subheader=u"Writing cron jobs with Python",
777        url=u"root:sisyphus/index.html",
778        inheritablekeywords=[u"packages", u"Sisyphus", u"cron", u"job"],
779        linktitle=u"Module ll.sisyphus: Writing cron jobs with Python",
780        description=u"""
781        ll-sisyphus is a Python module that simplifies writing Python scripts
782        that run as cron jobs.
783        """,
784    ),
785    PythonSourcePage(u"ansistyle",
786        XISTPage(u"download",
787            crumb=u"Download",
788            title=u"ANSIStyle download · Python software · LivingLogic AG",
789            header=u"ANSIStyle download",
790            subheader=u"All versions for download",
791            url=u"root:ansistyle/Download.html",
792            localkeywords=[u"download", u"file", u"archive"],
793            linktitle=u"Links to Windows and Linux, source and binary distributions",
794        ),
795        XISTPage(u"history",
796            crumb=u"History",
797            title=u"ANSIStyle history · Python software · LivingLogic AG",
798            header=u"ANSIStyle history",
799            subheader=u"The development history",
800            url=u"root:ansistyle/History.html",
801            localkeywords=[u"history", u"changes", u"version"],
802            linktitle=u"ChangeLog for ll-ansistyle",
803        ),
804        XISTPage(u"installation",
805            crumb=u"Installation",
806            title=u"ANSIStyle requirements and installation · Python software · LivingLogic AG",
807            header=u"ANSIStyle installation",
808            subheader=u"Requirements and installation",
809            url=u"root:ansistyle/Installation.html",
810            localkeywords=[u"installation", u"distutils"],
811            linktitle=u"How to install ll-ansistyle",
812        ),
813        crumb=u"ANSIStyle",
814        title=u"ANSIStyle · Python software · LivingLogic AG",
815        header=u"ANSIStyle",
816        subheader=u"ANSI colors for output streams and strings",
817        url=u"root:ansistyle/index.html",
818        inheritablekeywords=[u"packages", u"ANSIStyle", abbr.ansi(), u"escape", u"color", u"console"],
819        linktitle=u"Module ll.ansistyle: ANSI colors for output streams and strings",
820        description=u"""
821        ll-ansistyle is a Python module that adds color capability to streams
822        via ANSI escape sequences.
823        """,
824    ),
825    PythonSourcePage(u"toxic",
826        XISTPage(u"download",
827            crumb=u"Download",
828            title=u"Toxic download · Python software · LivingLogic AG",
829            header=u"Toxic download",
830            subheader=u"All versions for download",
831            url=u"root:toxic/Download.html",
832            localkeywords=[u"packages", u"download", u"file", u"archive"],
833            linktitle=u"Links to Windows and Linux, source and binary distributions",
834        ),
835        XISTPage(u"history",
836            crumb=u"History",
837            title=u"Toxic history · Python software · LivingLogic AG",
838            header=u"Toxic history",
839            subheader=u"The development history",
840            url=u"root:toxic/History.html",
841            localkeywords=[u"packages", u"history", u"changes", u"version"],
842            linktitle=u"ChangeLog for ll-toxic",
843        ),
844        XISTPage(u"installation",
845            crumb=u"Installation",
846            title=u"Toxic requirements and installation · Python software · LivingLogic AG",
847            header=u"Toxic installation",
848            subheader=u"Requirements and installation",
849            url=u"root:toxic/Installation.html",
850            localkeywords=[u"installation", u"distutils"],
851            linktitle=u"How to install ll-toxic",
852        ),
853        crumb=u"Toxic",
854        title=u"Toxic · Python software · LivingLogic AG",
855        header=u"Toxic",
856        subheader=(u"Generate Oracle functions from PL/SQL embedded in ", abbr.xml()),
857        url=u"root:toxic/index.html",
858        localkeywords=[u"Oracle", u"user defined function", u"PL/SQL", u"XML", u"HTML", u"processing instruction", u"PI", u"embed"],
859        linktitle=u"Module ll.toxic: Embed PL/SQL in XIST XML",
860        description=u"""
861        ll-toxic is a Python module that provides an XIST namespace that can be
862        used for generating Oracle database functions that return XML strings.
863        This is done by embedding processing instructions containing PL/SQL code
864        into XML files and transforming those files with XIST.
865        """,
866    ),
867    PythonSourcePage(u"xpit",
868        XISTPage(u"download",
869            crumb=u"Download",
870            title=u"XPIT download · Python software · LivingLogic AG",
871            header=u"XPIT download",
872            subheader=u"All versions for download",
873            url=u"root:xpit/Download.html",
874            localkeywords=[u"packages", u"download", u"file", u"archive"],
875            linktitle=u"Links to Windows and Linux, source and binary distributions",
876        ),
877        XISTPage(u"history",
878            crumb=u"History",
879            title=u"XPIT history · Python software · LivingLogic AG",
880            header=u"XPIT history",
881            subheader=u"The development history",
882            url=u"root:xpit/History.html",
883            localkeywords=[u"packages", u"history", u"changes", u"version"],
884            linktitle=u"ChangeLog for ll-xpit",
885        ),
886        XISTPage(u"installation",
887            crumb=u"Installation",
888            title=u"XPIT requirements and installation · Python software · LivingLogic AG",
889            header=u"XPIT installation",
890            subheader=u"Requirements and installation",
891            url=u"root:xpit/Installation.html",
892            localkeywords=[u"installation", u"distutils"],
893            linktitle=u"How to install ll-xpit",
894        ),
895        crumb=u"XPIT",
896        title=u"XPIT · Python software · LivingLogic AG",
897        header=u"XPIT",
898        subheader=u"Embed Python expressions in text",
899        url=u"root:xpit/index.html",
900        localkeywords=[u"template", u"embed", u"processing instruction", u"PI", u"Python expression"],
901        linktitle=u"Module ll.xpit: Embed Python expressions in text",
902        description=u"""
903        ll-toxic is a Python module that provides an XIST namespace that can be
904        used for generating Oracle database functions that return XML strings.
905        This is done by embedding processing instructions containing PL/SQL code
906        into XML files and transforming those files with XIST.
907        """,
908    ),
909    PythonSourcePage(u"orasql",
910        XISTPage(u"download",
911            crumb=u"Download",
912            title=u"OraSQL download · Python software · LivingLogic AG",
913            header=u"OraSQL download",
914            subheader=u"All versions for download",
915            url=u"root:orasql/Download.html",
916            localkeywords=[u"packages", u"download", u"file", u"archive"],
917            linktitle=u"Links to Windows and Linux, source and binary distributions",
918        ),
919        XISTPage(u"history",
920            crumb=u"History",
921            title=u"OraSQL history · Python software · LivingLogic AG",
922            header=u"OraSQL history",
923            subheader=u"The development history",
924            url=u"root:orasql/History.html",
925            localkeywords=[u"packages", u"history", u"changes", u"version"],
926            linktitle=u"ChangeLog for ll-orasql",
927        ),
928        XISTPage(u"installation",
929            crumb=u"Installation",
930            title=u"OraSQL installation · Python software · LivingLogic AG",
931            header=u"OraSQL installation",
932            subheader=u"Requirements and installation",
933            url=u"root:orasql/Installation.html",
934            localkeywords=[u"installation", u"distutils"],
935            linktitle=u"How to install ll-orasql",
936        ),
937        crumb=u"OraSQL",
938        title=u"OraSQL · Python software · LivingLogic AG",
939        header=u"OraSQL",
940        subheader=u"Utilities for working with cx_Oracle",
941        url=u"root:orasql/index.html",
942        localkeywords=[u"Oracle", u"cx_Oracle"],
943        linktitle=u"Module ll.orasql: Utilities for cx_Oracle",
944        description=u"""
945        ll-orasql is a Python module that provides utilities for working with cx_Oracle:
946        It allows calling Oracle procedures via keyword arguments and it wraps the
947        result of fetch calls in a custom dictionary.
948        """,
949    ),
950    PythonSourcePage(u"sql",
951        XISTPage(u"download",
952            crumb=u"Download",
953            title=u"SQL download · Python software · LivingLogic AG",
954            header=u"SQL download",
955            subheader=u"All versions for download",
956            url=u"root:sql/Download.html",
957            localkeywords=[u"packages", u"download", u"file", u"archive"],
958            linktitle=u"Links to Windows and Linux, source and binary distributions",
959        ),
960        XISTPage(u"history",
961            crumb=u"History",
962            title=u"SQL history · Python software · LivingLogic AG",
963            header=u"SQL history",
964            subheader=u"The development history",
965            url=u"root:sql/History.html",
966            localkeywords=[u"packages", u"history", u"changes", u"version"],
967            linktitle=u"ChangeLog for ll-sql",
968        ),
969        XISTPage(u"installation",
970            crumb=u"Installation",
971            title=u"SQL requirements and installation · Python software · LivingLogic AG",
972            header=u"SQL installation",
973            subheader=u"Requirements and installation",
974            url=u"root:sql/Installation.html",
975            localkeywords=[u"installation", u"distutils"],
976            linktitle=u"How to install ll-sql",
977        ),
978        crumb=u"SQL",
979        title=u"SQL · Python software · LivingLogic AG",
980        header=u"SQL",
981        subheader=(u"Simplifies generating ", abbr.sql(), u" queries"),
982        url=u"root:sql/index.html",
983        localkeywords=[u"packages", u"SQL", u"query"],
984        linktitle=u"Module ll.sql: Formatting SQL queries",
985        description=u"""
986        ll-sql is a Python module that provides classes for generating simple SQL
987        insert, delete and update queries.
988        """
989    ),
990    PythonSourcePage(u"aplora",
991        XISTPage(u"download",
992            crumb=u"Download",
993            title=u"Aplora download · Python software · LivingLogic AG",
994            header=u"Aplora download",
995            subheader=u"All versions for download",
996            url=u"root:aplora/Download.html",
997            localkeywords=[u"packages", u"download", u"file", u"archive"],
998            linktitle=u"Links to source distribution",
999        ),
1000        XISTPage(u"history",
1001            crumb=u"History",
1002            title=u"Aplora history · Python software · LivingLogic AG",
1003            header=u"Aplora history",
1004            subheader=u"The development history",
1005            url=u"root:aplora/History.html",
1006            localkeywords=[u"packages", u"history", u"changes", u"version"],
1007            linktitle=u"ChangeLog for ll-aplora",
1008        ),
1009        XISTPage(u"installation",
1010            crumb=u"Installation",
1011            title=u"Aplora requirements, installation and configuration · Python software · LivingLogic AG",
1012            header=u"Aplora installation",
1013            subheader=u"Requirements, installation and configuration",
1014            url=u"root:aplora/Installation.html",
1015            localkeywords=[u"installation", u"distutils"],
1016            linktitle=u"How to install ll-aplora",
1017        ),
1018        crumb=u"Aplora",
1019        title=u"Aplora · Python software · LivingLogic AG",
1020        header=u"Aplora",
1021        subheader=(u"Logging Apache ", abbr.http(), u" requests to an Oracle database"),
1022        url=u"root:aplora/index.html",
1023        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
1024        linktitle=u"Script ll.aplora: Logging Apache HTTP requests to an Oracle database",
1025        description=u"""
1026        ll-aplora is a script that can be used with Apaches piped logging facility
1027        to log HTTP request to an Oracle database.
1028        """,
1029    ),
1030    XISTPage(u"cvs",
1031        crumb=(abbr.cvs(), u" access"),
1032        title=(abbr.cvs(), u" access · Python software · LivingLogic AG"),
1033        header=(abbr.cvs(), u" access"),
1034        subheader=(u"Access to the ", abbr.cvs(), u" repository via ViewCVS"),
1035        url=u"root:cvs.html",
1036        localkeywords=[abbr.cvs(), u"development", u"repository"],
1037        linktitle=u"ViewCVS view of the source code",
1038        description=u"""
1039        Provides a link to the ViewCVS view of the source code for all
1040        Open Source Python projects by LivingLogic.
1041        """
1042    ),
1043    crumb=u"Python software",
1044    title=u"Python software · LivingLogic AG",
1045    header=u"Python packages",
1046    subheader=u"Python packages and modules by LivingLogic",
1047    url=u"root:index.html",
1048    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
1049    localkeywords=[u"packages", abbr.xist(), u"sql", u"ansistyle", u"sisyphus", u"toxic", u"orasql"],
1050    linktitle=u"Startpage with project list",
1051    description=u"""
1052    LivingLogic provides several Open Source Python packages: XIST,
1053    """
1054)
1055
1056
1057class cat(xsc.Entity):
1058    def convert(self, converter):
1059        return html.span(u"CATsystems", class_=u"caps")
1060
1061
1062class hsc(xsc.Entity):
1063    def convert(self, converter):
1064        return html.span(u"HSC", class_=u"caps")
1065
1066
1067class pageref(xsc.Element):
1068    model = sims.NoElements()
1069    class Attrs(xsc.Element.Attrs):
1070        class ref(xsc.TextAttr): pass
1071
1072    def convert(self, converter):
1073        if "ref" in self.attrs:
1074            page = pages[unicode(self["ref"].convert(converter))]
1075        else:
1076            page = pages
1077        e = html.a(self.content, href=page.url, title=page.linktitle)
1078        return e.convert(converter)
1079
1080
1081class download(xsc.Element):
1082    model = sims.Empty()
1083    class Attrs(xsc.Element.Attrs):
1084        class href(xsc.TextAttr): pass
1085        class type(xsc.TextAttr): pass
1086
1087    def convert(self, converter):
1088        target = converter.target
1089        name = url.URL(unicode(self["href"].convert(converter))).file
1090        if "type" in self.attrs:
1091            type = self["type"]
1092        elif name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
1093            type = "Source"
1094        elif name.endswith(".exe"):
1095            type = "Windows installer"
1096            pos = name.rfind("py")
1097            if pos >= 0:
1098                version = name[pos+2:-4]
1099                type += " (Python %s)" % version
1100        elif name.endswith(".src.rpm"):
1101            type = "Source RPM"
1102        elif name.endswith(".rpm"):
1103            type = "Binary RPM"
1104        else:
1105            type = chars.nbsp()
1106
1107        if issubclass(target, doc):
1108            e = target.item(
1109                target.link(unicode(name), href=("http://ftp.livinglogic.de/", self["href"])),
1110                " (",
1111                type,
1112                ", ",
1113                specials.filesize(href=("http://ftp.livinglogic.de/", self["href"])),
1114                " bytes)"
1115            )
1116        else:
1117            e = html.tr(
1118                html.td(html.a(unicode(name), href=("http://ftp.livinglogic.de/", self["href"]), title=("Download http://ftp.livinglogic.de/", self["href"])), class_="file"),
1119                html.td(type, class_="type"),
1120                html.td(specials.filesize(href=("http://ftp.livinglogic.de/", self["href"])), class_="size"),
1121                class_="download"
1122            )
1123        return e.convert(converter)
1124
1125
1126class downloads(xsc.Element):
1127    model = sims.Elements(download)
1128    class Attrs(xsc.Element.Attrs):
1129        class version(xsc.TextAttr): pass
1130        class date(xsc.TextAttr): pass
1131
1132    def convert(self, converter):
1133        target = converter.target
1134        if issubclass(target, doc):
1135            e = target.section(
1136                target.title("Version ", self["version"], " (released ", self["date"], ")"),
1137                target.ulist(self.content)
1138            )
1139        else:
1140            e = xsc.Frag(
1141                html.tr(
1142                    html.th(self["version"], class_="version"),
1143                    html.th("Type", class_="type"),
1144                    html.th("Size", class_="size")
1145                ),
1146                self.content
1147            )
1148            if "date" in self.attrs:
1149                e[0][0].append(" ", html.span("(released ", self["date"], ")", class_="note"))
1150        return e.convert(converter)
1151
1152
1153class alldownloads(xsc.Element):
1154    model = sims.Elements(downloads)
1155
1156    def convert(self, converter):
1157        target = converter.target
1158        if issubclass(target, doc):
1159            e = self.content
1160        else:
1161            e = html.div(
1162                htmlspecials.plaintable(
1163                    self.content,
1164                    class_="downloads"
1165                ),
1166                align="center"
1167            )
1168        return e.convert(converter)
1169
1170
1171class page(xsc.Element):
1172    model = sims.Elements(alldownloads, doc.block)
1173    class Attrs(xsc.Element.Attrs):
1174        class refresh(xsc.TextAttr): pass
1175        class path(xsc.TextAttr): pass
1176
1177    def _nodetype(self, path, activepath):
1178        if path[-1] is activepath[-1]:
1179            return "here"
1180        elif path[-1] in activepath:
1181            return "path"
1182        else:
1183            return "other"
1184
1185    def _node(self, path, activepath):
1186        type = self._nodetype(path, activepath)
1187        page = path[-1]
1188        if type == "here":
1189            e = html.div(page.crumb)
1190            children = True
1191        else:
1192            e = html.a(
1193                html.span(u"\u2713", class_="visited", title="You have already visited that page"),
1194                page.crumb,
1195                href=page.url,
1196                title=page.linktitle,
1197                class_=type,
1198            )
1199            children = (type == "path")
1200        if len(path) > 1:
1201            e = html.li(e, class_=type)
1202        else:
1203            e = xsc.Frag(e)
1204        if children:
1205            e.append(self._children(path, activepath))
1206        return e
1207
1208    def _children(self, path, activepath):
1209        e = html.ul()
1210        for child in path[-1].getChildren():
1211            e.append(self._node(path + [child], activepath))
1212        return e
1213
1214    def _links(self, context):
1215        return self._node([pages], context.page.getPath())
1216
1217    def _crumbs(self, context):
1218        e = xsc.Frag()
1219        page = context.page
1220        while page is not None:
1221            if page is context.page:
1222                e.insert(0, html.span(page.crumb, class_="here"))
1223            else:
1224                e.insert(0, self.__ns__.pageref(page.crumb, ref=page.getPathString()))
1225            e.insert(0, u"\xa0\u203a\xa0")
1226            page = page.parent
1227        e.insert(0, html.a("Home", href="http://www.livinglogic.de/", hreflang="de", title="The company homepage (in german)"))
1228        return e
1229
1230    def convert(self, converter):
1231        converter[doc.pyref].base = "root:"
1232        target = converter.target
1233        context = converter[self]
1234        context.path = unicode(self["path"].convert(converter))
1235        context.page = pages[context.path]
1236        if issubclass(target, text):
1237            e = target.html(
1238                target.head(
1239                    meta.contenttype(),
1240                    target.title(context.page.title),
1241                ),
1242                target.body(
1243                    self.content
1244                )
1245            )
1246        elif issubclass(target, doc):
1247            return self.content.convert(converter)
1248        elif not issubclass(target, html):
1249            raise ValueError("unknown conversion target %r" % target)
1250        else:
1251            header = xsc.Frag()
1252            if context.page.header:
1253                header.append(html.h1(context.page.header))
1254            if context.page.subheader:
1255                header.append(html.h2(context.page.subheader))
1256
1257            c = htmlspecials.plaintable(
1258                html.tr(
1259                    html.td(htmlspecials.pixel(height=50), class_="header1", width="20%"),
1260                    html.td(header, class_="header2", width="79%"),
1261                    html.td(htmlspecials.pixel(height=120, width=30), class_="header3", width="1%"),
1262                    valign="bottom",
1263                    class_="header",
1264                ),
1265                html.tr(
1266                    html.td(htmlspecials.pixel(), class_="crumbs1"),
1267                    html.td(
1268                        htmlspecials.plaintable(
1269                            html.tr(
1270                                html.td(
1271                                    self._crumbs(context),
1272                                    class_="crumbs",
1273                                ),
1274                                html.td(
1275                                    xsc.Frag(context.page.alternates()).withsep(u"\xa0\xb7\xa0"),
1276                                    align="right",
1277                                    class_="alternate",
1278                                ),
1279                                valign="middle",
1280                            ),
1281                            width="100%",
1282                        ),
1283                        class_="crumbs2",
1284                    ),
1285                    class_="crumbs",
1286                ),
1287                html.tr(
1288                    html.td(
1289                        htmlspecials.pixel(width=200),
1290                        self._links(context),
1291                        rowspan=2,
1292                        class_="links",
1293                    ),
1294                    html.td(
1295                        self.content,
1296                        class_="content",
1297                    ),
1298                    valign="top",
1299                    class_="content",
1300                ),
1301                width="100%",
1302                class_="body",
1303            )
1304
1305            keywords = context.page.keywords
1306            if keywords:
1307                keywords = meta.keywords(xsc.Frag(*keywords).withsep(", "))
1308            else:
1309                keywords = xsc.Null
1310            description = context.page.description
1311            if description is not None:
1312                description = meta.description(description)
1313            else:
1314                description = xsc.Null
1315            if "refresh" in self.attrs:
1316                refresh = html.meta(http_equiv="refresh", content=self["refresh"])
1317            else:
1318                refresh = xsc.Null
1319
1320            firstsibling = context.page.getFirstSibling()
1321            if firstsibling is not None:
1322                if firstsibling != context.page:
1323                    firstsibling = html.link(rel="first", title="First page in set", href=firstsibling.url)
1324                else:
1325                    firstsibling = None
1326
1327            prevsibling = context.page.getPrevSibling()
1328            if prevsibling is not None:
1329                if prevsibling != context.page:
1330                    prevsibling = html.link(rel="prev", title="Previous page", href=prevsibling.url)
1331                else:
1332                    prevsibling = None
1333
1334            nextsibling = context.page.getNextSibling()
1335            if nextsibling is not None:
1336                if nextsibling != context.page:
1337                    nextsibling = html.link(rel="next", title="Next page", href=nextsibling.url)
1338                else:
1339                    nextsibling = None
1340
1341            lastsibling = context.page.getLastSibling()
1342            if lastsibling is not None:
1343                if lastsibling != context.page:
1344                    lastsibling = html.link(rel="last", title="Last page in set", href=lastsibling.url)
1345                else:
1346                    lastsibling = None
1347
1348            parent = context.page.parent
1349            if parent is not None:
1350                parent = html.link(rel="up", href=parent.url)
1351
1352            top = context.page.getRoot()
1353            if top is not None:
1354                if top != context.page:
1355                    top = html.link(rel="top", href=top.url)
1356                else:
1357                    top = None
1358
1359            icbm = u"49.9433; 11.5703"
1360
1361            e = target.html(
1362                target.head(
1363                    meta.contenttype(),
1364                    target.title(context.page.title),
1365                    keywords,
1366                    description,
1367                    meta.stylesheet(href="root:main_screen.css", media=u"screen, projection, tv"),
1368                    meta.stylesheet(href="root:main_print.css", media=u"print"),
1369                    meta.author(name=u"Walter Dörwald", email=u"walter.doerwald@livinglogic.de"),
1370                    html.meta(name=u"icbm", content=icbm),
1371                    html.meta(name=u"geo.position", content=icbm),
1372                    html.meta(name=u"geo.placename", content=u"Bayreuth, Germany, Europe"),
1373                    html.meta(name=u"geo.region", content=u"DE-BY"),
1374                    html.meta(name=u"DC.title", content=context.page.title),
1375                    html.link(rel=u"icon", href=u"root:images/favicon.gif", type=u"image/gif"),
1376                    top,
1377                    parent,
1378                    firstsibling,
1379                    prevsibling,
1380                    nextsibling,
1381                    lastsibling,
1382                    (html.link(link.attrs) for link in context.page.alternates()),
1383                    refresh
1384                ),
1385                target.body(c),
1386                xml.Attrs(lang=u"en"),
1387                lang=u"en",
1388            )
1389            e = xsc.Frag(
1390                xml.XML10(),
1391                u"\n",
1392                target.DocTypeXHTML10transitional(),
1393                u"\n",
1394                e
1395            )
1396        return e.convert(converter)
1397
1398
1399class xmlns(xsc.Namespace):
1400    xmlname = "py"
1401    xmlurl = "http://xmlns.livinglogic.de/Python"
1402xmlns.makemod(vars())
1403
Note: See TracBrowser for help on using the browser.