root/livinglogic.python.www/site/Python_xmlns.py @ 314:6cebdaed28b5

Revision 314:6cebdaed28b5, 43.4 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Merge stylesheet, so we have only one stylesheet per medium.

Fix left alignment of headers.

Update print style sheets.

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