root/livinglogic.python.www/site/Python_xmlns.py @ 343:f2850111b486

Revision 343:f2850111b486, 46.4 KB (checked in by Walter Doerwald <walter@…>, 14 years ago)

Remove the namespace modules css and cssspecials which went away in XIST 2.10
(pointed out by Derek Basch).

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