root/livinglogic.python.www/site/Python_xmlns.py @ 359:e31450b60490

Revision 359:e31450b60490, 46.9 KB (checked in by Walter Doerwald <walter@…>, 14 years ago)

Add a page with installation instructions for sisyphus.

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