root/livinglogic.python.www/site/Python_xmlns.py @ 311:b37a0944bee3

Revision 311:b37a0944bee3, 41.1 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Add a walk method to Page.

Add linktitles to the rest of the pages.

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    ),
604    PythonSourcePage(u"url",
605        XISTPage(u"howto",
606            crumb=u"Howto",
607            title=u"URL howto · Python software · LivingLogic AG",
608            header=u"URL documentation",
609            subheader=u"Special features of URL",
610            url=u"root:url/Howto.html",
611            localkeywords=[],
612            linktitle=u"Special features of URL",
613        ),
614        XISTPage(u"download",
615            crumb=u"Download",
616            title=u"URL download · Python software · LivingLogic AG",
617            header=u"URL download",
618            subheader=u"All versions for download",
619            url=u"root:url/Download.html",
620            localkeywords=[u"download", u"file", u"archive"],
621            linktitle=u"Links to Windows and Linux, source and binary distributions",
622        ),
623        XISTPage(u"history",
624            crumb=u"History",
625            title=u"URL history · Python software · LivingLogic AG",
626            header=u"URL history",
627            subheader=u"The development history",
628            url=u"root:url/History.html",
629            localkeywords=[u"packages", u"history", u"changes", u"version"],
630            linktitle=u"ChangeLog for ll-url",
631        ),
632        XISTPage(u"installation",
633            crumb=u"Installation",
634            title=u"URL requirements and installation · Python software · LivingLogic AG",
635            header=u"URL installation",
636            subheader=u"Requirements and installation",
637            url=u"root:url/Installation.html",
638            localkeywords=[u"installation", u"distutils"],
639            linktitle=u"How to install ll-url",
640        ),
641        crumb=u"url",
642        title=u"URL · Python software · LivingLogic AG",
643        header=u"url",
644        subheader=(u"Module implementing ", abbr.url(), u"s"),
645        url=u"root:url/index.html",
646        linktitle=u"Module ll.url: RFC 2396 compliant URLs",
647    ),
648    PythonSourcePage(u"make",
649        XISTPage(u"download",
650            crumb=u"Download",
651            title=u"Make download · Python software · LivingLogic AG",
652            header=u"Make download",
653            subheader=u"All versions for download",
654            url=u"root:make/Download.html",
655            localkeywords=[u"packages", u"download", u"file", u"archive"],
656            linktitle=u"Links to Windows and Linux, source and binary distributions",
657        ),
658        XISTPage(u"history",
659            crumb=u"History",
660            title=u"Make history · Python software · LivingLogic AG",
661            header=u"Make history",
662            subheader=u"The development history",
663            url=u"root:make/History.html",
664            localkeywords=[u"packages", u"history", u"changes", u"version"],
665            linktitle=u"ChangeLog for ll-make",
666        ),
667        XISTPage(u"installation",
668            crumb=u"Installation",
669            title=u"Make requirements and installation · Python software · LivingLogic AG",
670            header=u"Make installation",
671            subheader=u"Requirements and installation",
672            url=u"root:make/Installation.html",
673            localkeywords=[u"installation", u"distutils"],
674            linktitle=u"How to install ll-make",
675        ),
676        XISTPage(u"migration",
677            crumb=u"Migration",
678            title=u"Make migration guide · Python software · LivingLogic AG",
679            header=u"Make migration guide",
680            subheader=u"How to update your code to new versions of Make",
681            url=u"root:make/Migration.html",
682            localkeywords=[],
683            linktitle=u"How to update your code to new versions of ll-make",
684        ),
685        crumb=u"Make",
686        title=u"Make · Python software · LivingLogic AG",
687        header=u"Make",
688        subheader=u"Object oriented make replacement",
689        url=u"root:make/index.html",
690        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
691        linktitle=u"Module ll.make: Object oriented make replacement",
692    ),
693    PythonSourcePage(u"color",
694        XISTPage(u"download",
695            crumb=u"Download",
696            title=u"Color download · Python software · LivingLogic AG",
697            header=u"Color download",
698            subheader=u"All versions for download",
699            url=u"root:color/Download.html",
700            localkeywords=[u"packages", u"download", u"file", u"archive"],
701            linktitle=u"Links to Windows and Linux, source and binary distributions",
702        ),
703        XISTPage(u"history",
704            crumb=u"History",
705            title=u"Color history · Python software · LivingLogic AG",
706            header=u"Color history",
707            subheader=u"The development history",
708            url=u"root:color/History.html",
709            localkeywords=[u"packages", u"history", u"changes", u"version"],
710            linktitle=u"ChangeLog for ll-color",
711        ),
712        XISTPage(u"installation",
713            crumb=u"Installation",
714            title=u"Color requirements and installation · Python software · LivingLogic AG",
715            header=u"Color installation",
716            subheader=u"Requirements and installation",
717            url=u"root:color/Installation.html",
718            localkeywords=[u"installation", u"distutils"],
719            linktitle=u"How to install ll-color",
720        ),
721        crumb=u"Color",
722        title=u"Color · Python software · LivingLogic AG",
723        header=u"Color",
724        subheader=u"RGB color values and color model conversion",
725        url=u"root:color/index.html",
726        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"],
727        linktitle=u"Module ll.color: RGB color values and color model conversion",
728    ),
729    PythonSourcePage(u"sisyphus",
730        XISTPage(u"download",
731            crumb=u"Download",
732            title=u"Sisyphus download · Python software · LivingLogic AG",
733            header=u"Sisyphus download",
734            subheader=u"All versions for download",
735            url=u"root:sisyphus/Download.html",
736            localkeywords=[u"download", u"file", u"archive"],
737            linktitle=u"Links to Windows and Linux, source and binary distributions",
738        ),
739        XISTPage(u"history",
740            crumb=u"History",
741            title=u"Sisyphus history · Python software · LivingLogic AG",
742            header=u"Sisyphus history",
743            subheader=u"The development history",
744            url=u"root:sisyphus/History.html",
745            localkeywords=[u"history", u"changes", u"version"],
746            linktitle=u"ChangeLog for ll-sisyphus",
747        ),
748        crumb=u"Sisyphus",
749        title=u"Sisyphus · Python software · LivingLogic AG",
750        header=u"Sisyphus",
751        subheader=u"Writing cron jobs with Python",
752        url=u"root:sisyphus/index.html",
753        inheritablekeywords=[u"packages", u"Sisyphus", u"cron", u"job"],
754        linktitle=u"Module ll.sisyphus: Writing cron jobs with Python",
755    ),
756    PythonSourcePage(u"ansistyle",
757        XISTPage(u"download",
758            crumb=u"Download",
759            title=u"ANSIStyle download · Python software · LivingLogic AG",
760            header=u"ANSIStyle download",
761            subheader=u"All versions for download",
762            url=u"root:ansistyle/Download.html",
763            localkeywords=[u"download", u"file", u"archive"],
764            linktitle=u"Links to Windows and Linux, source and binary distributions",
765        ),
766        XISTPage(u"history",
767            crumb=u"History",
768            title=u"ANSIStyle history · Python software · LivingLogic AG",
769            header=u"ANSIStyle history",
770            subheader=u"The development history",
771            url=u"root:ansistyle/History.html",
772            localkeywords=[u"history", u"changes", u"version"],
773            linktitle=u"ChangeLog for ll-ansistyle",
774        ),
775        XISTPage(u"installation",
776            crumb=u"Installation",
777            title=u"ANSIStyle requirements and installation · Python software · LivingLogic AG",
778            header=u"ANSIStyle installation",
779            subheader=u"Requirements and installation",
780            url=u"root:ansistyle/Installation.html",
781            localkeywords=[u"installation", u"distutils"],
782            linktitle=u"How to install ll-ansistyle",
783        ),
784        crumb=u"ANSIStyle",
785        title=u"ANSIStyle · Python software · LivingLogic AG",
786        header=u"ANSIStyle",
787        subheader=u"ANSI colors for output streams and strings",
788        url=u"root:ansistyle/index.html",
789        inheritablekeywords=[u"packages", u"ANSIStyle", abbr.ansi(), u"escape", u"color", u"console"],
790        linktitle=u"Module ll.ansistyle: ANSI colors for output streams and strings",
791    ),
792    PythonSourcePage(u"toxic",
793        XISTPage(u"download",
794            crumb=u"Download",
795            title=u"Toxic download · Python software · LivingLogic AG",
796            header=u"Toxic download",
797            subheader=u"All versions for download",
798            url=u"root:toxic/Download.html",
799            localkeywords=[u"packages", u"download", u"file", u"archive"],
800            linktitle=u"Links to Windows and Linux, source and binary distributions",
801        ),
802        XISTPage(u"history",
803            crumb=u"History",
804            title=u"Toxic history · Python software · LivingLogic AG",
805            header=u"Toxic history",
806            subheader=u"The development history",
807            url=u"root:toxic/History.html",
808            localkeywords=[u"packages", u"history", u"changes", u"version"],
809            linktitle=u"ChangeLog for ll-toxic",
810        ),
811        XISTPage(u"installation",
812            crumb=u"Installation",
813            title=u"Toxic requirements and installation · Python software · LivingLogic AG",
814            header=u"Toxic installation",
815            subheader=u"Requirements and installation",
816            url=u"root:toxic/Installation.html",
817            localkeywords=[u"installation", u"distutils"],
818            linktitle=u"How to install ll-toxic",
819        ),
820        crumb=u"Toxic",
821        title=u"Toxic · Python software · LivingLogic AG",
822        header=u"Toxic",
823        subheader=(u"Generate Oracle functions from PL/SQL embedded in ", abbr.xml()),
824        url=u"root:toxic/index.html",
825        localkeywords=[u"Oracle", u"user defined function", u"PL/SQL", u"XML", u"HTML", u"processing instruction", u"PI", u"embed"],
826        linktitle=u"Module ll.toxic: Embed PL/SQL in XIST XML",
827    ),
828    PythonSourcePage(u"orasql",
829        XISTPage(u"download",
830            crumb=u"Download",
831            title=u"OraSQL download · Python software · LivingLogic AG",
832            header=u"OraSQL download",
833            subheader=u"All versions for download",
834            url=u"root:orasql/Download.html",
835            localkeywords=[u"packages", u"download", u"file", u"archive"],
836            linktitle=u"Links to Windows and Linux, source and binary distributions",
837        ),
838        XISTPage(u"history",
839            crumb=u"History",
840            title=u"OraSQL history · Python software · LivingLogic AG",
841            header=u"OraSQL history",
842            subheader=u"The development history",
843            url=u"root:orasql/History.html",
844            localkeywords=[u"packages", u"history", u"changes", u"version"],
845            linktitle=u"ChangeLog for ll-orasql",
846        ),
847        XISTPage(u"installation",
848            crumb=u"Installation",
849            title=u"OraSQL installation · Python software · LivingLogic AG",
850            header=u"OraSQL installation",
851            subheader=u"Requirements and installation",
852            url=u"root:orasql/Installation.html",
853            localkeywords=[u"installation", u"distutils"],
854            linktitle=u"How to install ll-orasql",
855        ),
856        crumb=u"OraSQL",
857        title=u"OraSQL · Python software · LivingLogic AG",
858        header=u"OraSQL",
859        subheader=u"Utilities for working with cx_Oracle",
860        url=u"root:orasql/index.html",
861        localkeywords=[u"Oracle", u"cx_Oracle"],
862        linktitle=u"Module ll.orasql: Utilities for cx_Oracle",
863    ),
864    PythonSourcePage(u"sql",
865        XISTPage(u"download",
866            crumb=u"Download",
867            title=u"SQL download · Python software · LivingLogic AG",
868            header=u"SQL download",
869            subheader=u"All versions for download",
870            url=u"root:sql/Download.html",
871            localkeywords=[u"packages", u"download", u"file", u"archive"],
872            linktitle=u"Links to Windows and Linux, source and binary distributions",
873        ),
874        XISTPage(u"history",
875            crumb=u"History",
876            title=u"SQL history · Python software · LivingLogic AG",
877            header=u"SQL history",
878            subheader=u"The development history",
879            url=u"root:sql/History.html",
880            localkeywords=[u"packages", u"history", u"changes", u"version"],
881            linktitle=u"ChangeLog for ll-sql",
882        ),
883        XISTPage(u"installation",
884            crumb=u"Installation",
885            title=u"SQL requirements and installation · Python software · LivingLogic AG",
886            header=u"SQL installation",
887            subheader=u"Requirements and installation",
888            url=u"root:sql/Installation.html",
889            localkeywords=[u"installation", u"distutils"],
890            linktitle=u"How to install ll-sql",
891        ),
892        crumb=u"SQL",
893        title=u"SQL · Python software · LivingLogic AG",
894        header=u"SQL",
895        subheader=(u"Simplifies generating ", abbr.sql(), u" queries"),
896        url=u"root:sql/index.html",
897        localkeywords=[u"packages", u"SQL", u"query"],
898        linktitle=u"Module ll.sql: Formatting SQL queries",
899    ),
900    XISTPage(u"cvs",
901        crumb=(abbr.cvs(), u" access"),
902        title=(abbr.cvs(), u" access · Python software · LivingLogic AG"),
903        header=(abbr.cvs(), u" access"),
904        subheader=(u"Access to the ", abbr.cvs(), u" repository via ViewCVS"),
905        url=u"root:cvs.html",
906        localkeywords=[abbr.cvs(), u"development", u"repository"],
907        linktitle=u"ViewCVS view of the source code",
908    ),
909    crumb=u"Python software",
910    title=u"Python software · LivingLogic AG",
911    header=u"Python packages",
912    subheader=u"Python packages and modules by LivingLogic",
913    url=u"root:index.html",
914    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
915    localkeywords=[u"packages", abbr.xist(), u"sql", u"ansistyle", u"sisyphus", u"toxic", u"orasql"],
916    linktitle=u"Startpage with project list",
917)
918
919
920class cat(xsc.Entity):
921    def convert(self, converter):
922        return html.span(u"CATsystems", class_=u"caps")
923
924
925class hsc(xsc.Entity):
926    def convert(self, converter):
927        return html.span(u"HSC", class_=u"caps")
928
929
930class pageref(xsc.Element):
931    model = sims.NoElements()
932    class Attrs(xsc.Element.Attrs):
933        class ref(xsc.TextAttr): pass
934
935    def convert(self, converter):
936        if "ref" in self.attrs:
937            page = pages[unicode(self["ref"].convert(converter))]
938        else:
939            page = pages
940        e = html.a(self.content, href=page.url, title=page.linktitle)
941        return e.convert(converter)
942
943
944class download(xsc.Element):
945    model = sims.Empty()
946    class Attrs(xsc.Element.Attrs):
947        class href(xsc.TextAttr): pass
948        class type(xsc.TextAttr): pass
949
950    def convert(self, converter):
951        target = converter.target
952        name = url.URL(unicode(self["href"].convert(converter))).file
953        if "type" in self.attrs:
954            type = self["type"]
955        elif name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
956            type = "Source"
957        elif name.endswith(".exe"):
958            type = "Windows installer"
959            pos = name.rfind("py")
960            if pos >= 0:
961                version = name[pos+2:-4]
962                type += " (Python %s)" % version
963        elif name.endswith(".src.rpm"):
964            type = "Source RPM"
965        elif name.endswith(".rpm"):
966            type = "Binary RPM"
967        else:
968            type = chars.nbsp()
969
970        if issubclass(target, doc):
971            e = target.item(
972                target.link(unicode(name), href=("http://ftp.livinglogic.de/", self["href"])),
973                " (",
974                type,
975                ", ",
976                specials.filesize(href=("http://ftp.livinglogic.de/", self["href"])),
977                " bytes)"
978            )
979        else:
980            e = html.tr(
981                html.td(html.a(unicode(name), href=("http://ftp.livinglogic.de/", self["href"]), title=("Download http://ftp.livinglogic.de/", self["href"])), class_="file"),
982                html.td(type, class_="type"),
983                html.td(specials.filesize(href=("http://ftp.livinglogic.de/", self["href"])), class_="size"),
984                class_="download"
985            )
986        return e.convert(converter)
987
988
989class downloads(xsc.Element):
990    model = sims.Elements(download)
991    class Attrs(xsc.Element.Attrs):
992        class version(xsc.TextAttr): pass
993        class date(xsc.TextAttr): pass
994
995    def convert(self, converter):
996        target = converter.target
997        if issubclass(target, doc):
998            e = target.section(
999                target.title("Version ", self["version"], " (released ", self["date"], ")"),
1000                target.ulist(self.content)
1001            )
1002        else:
1003            e = xsc.Frag(
1004                html.tr(
1005                    html.th(self["version"], class_="version"),
1006                    html.th("Type", class_="type"),
1007                    html.th("Size", class_="size")
1008                ),
1009                self.content
1010            )
1011            if "date" in self.attrs:
1012                e[0][0].append(" ", html.span("(released ", self["date"], ")", class_="note"))
1013        return e.convert(converter)
1014
1015
1016class alldownloads(xsc.Element):
1017    model = sims.Elements(downloads)
1018
1019    def convert(self, converter):
1020        target = converter.target
1021        if issubclass(target, doc):
1022            e = self.content
1023        else:
1024            e = html.div(
1025                htmlspecials.plaintable(
1026                    self.content,
1027                    class_="downloads"
1028                ),
1029                align="center"
1030            )
1031        return e.convert(converter)
1032
1033
1034class page(xsc.Element):
1035    model = sims.Elements(alldownloads, doc.block)
1036    class Attrs(xsc.Element.Attrs):
1037        class refresh(xsc.TextAttr): pass
1038        class path(xsc.TextAttr): pass
1039
1040    def _nodetype(self, path, activepath):
1041        if path[-1] is activepath[-1]:
1042            return "here"
1043        elif path[-1] in activepath:
1044            return "path"
1045        else:
1046            return "other"
1047
1048    def _node(self, path, activepath):
1049        type = self._nodetype(path, activepath)
1050        page = path[-1]
1051        if type == "here":
1052            e = html.div(page.crumb)
1053            children = True
1054        else:
1055            e = html.a(
1056                html.span(u"\u2713", class_="visited", title="You have already visited that page"),
1057                page.crumb,
1058                href=page.url,
1059                title=page.linktitle,
1060                class_=type,
1061            )
1062            children = (type == "path")
1063        if len(path) > 1:
1064            e = html.li(e, class_=type)
1065        else:
1066            e = xsc.Frag(e)
1067        if children:
1068            e.append(self._children(path, activepath))
1069        return e
1070
1071    def _children(self, path, activepath):
1072        e = html.ul()
1073        for child in path[-1].getChildren():
1074            e.append(self._node(path + [child], activepath))
1075        return e
1076
1077    def _links(self, context):
1078        return self._node([pages], context.page.getPath())
1079
1080    def _crumbs(self, context):
1081        e = xsc.Frag()
1082        page = context.page
1083        while page is not None:
1084            if page is context.page:
1085                e.insert(0, html.span(page.crumb, class_="here"))
1086            else:
1087                e.insert(0, self.__ns__.pageref(page.crumb, ref=page.getPathString()))
1088            e.insert(0, u"\xa0\u203a\xa0")
1089            page = page.parent
1090        e.insert(0, html.a("Home", href="http://www.livinglogic.de/", hreflang="de", title="The company homepage (in german)"))
1091        return e
1092
1093    def convert(self, converter):
1094        converter[doc.pyref].base = "root:"
1095        target = converter.target
1096        context = converter[self]
1097        context.path = unicode(self["path"].convert(converter))
1098        context.page = pages[context.path]
1099        if issubclass(target, text):
1100            e = target.html(
1101                target.head(
1102                    meta.contenttype(),
1103                    target.title(context.page.title),
1104                ),
1105                target.body(
1106                    self.content
1107                )
1108            )
1109        elif issubclass(target, doc):
1110            return self.content.convert(converter)
1111        elif not issubclass(target, html):
1112            raise ValueError("unknown conversion target %r" % target)
1113        else:
1114            header = xsc.Frag()
1115            if context.page.header:
1116                header.append(html.h1(context.page.header))
1117            if context.page.subheader:
1118                header.append(html.h2(context.page.subheader))
1119
1120            c = htmlspecials.plaintable(
1121                html.tr(
1122                    html.td(htmlspecials.pixel(height=50), class_="header1", width="20%"),
1123                    html.td(header, class_="header2", width="79%"),
1124                    html.td(htmlspecials.pixel(height=120, width=30), class_="header3", width="1%"),
1125                    valign="bottom",
1126                ),
1127                html.tr(
1128                    html.td(htmlspecials.pixel(), class_="crumbs1"),
1129                    html.td(self._crumbs(context), class_="crumbs2"),
1130                ),
1131                html.tr(
1132                    html.td(
1133                        htmlspecials.pixel(width=200),
1134                        self._links(context),
1135                        rowspan=2,
1136                        class_="links",
1137                    ),
1138                    html.td(self.content, class_="content"),
1139                    valign="top",
1140                ),
1141                width="100%",
1142            )
1143
1144            keywords = context.page.keywords
1145            if keywords:
1146                keywords = meta.keywords(xsc.Frag(*keywords).withsep(", "))
1147            else:
1148                keywords = xsc.Null
1149            description = context.page.description
1150            if description is not None:
1151                description = meta.description(description)
1152            else:
1153                description = xsc.Null
1154            if "refresh" in self.attrs:
1155                refresh = html.meta(http_equiv="refresh", content=self["refresh"])
1156            else:
1157                refresh = xsc.Null
1158
1159            firstsibling = context.page.getFirstSibling()
1160            if firstsibling is not None:
1161                if firstsibling != context.page:
1162                    firstsibling = html.link(rel="first", title="First page in set", href=firstsibling.url)
1163                else:
1164                    firstsibling = None
1165
1166            prevsibling = context.page.getPrevSibling()
1167            if prevsibling is not None:
1168                if prevsibling != context.page:
1169                    prevsibling = html.link(rel="prev", title="Previous page", href=prevsibling.url)
1170                else:
1171                    prevsibling = None
1172
1173            nextsibling = context.page.getNextSibling()
1174            if nextsibling is not None:
1175                if nextsibling != context.page:
1176                    nextsibling = html.link(rel="next", title="Next page", href=nextsibling.url)
1177                else:
1178                    nextsibling = None
1179
1180            lastsibling = context.page.getLastSibling()
1181            if lastsibling is not None:
1182                if lastsibling != context.page:
1183                    lastsibling = html.link(rel="last", title="Last page in set", href=lastsibling.url)
1184                else:
1185                    lastsibling = None
1186
1187            parent = context.page.parent
1188            if parent is not None:
1189                parent = html.link(rel="up", href=parent.url)
1190
1191            top = context.page.getRoot()
1192            if top is not None:
1193                if top != context.page:
1194                    top = html.link(rel="top", href=top.url)
1195                else:
1196                    top = None
1197
1198            icbm = "49.9433; 11.5703"
1199
1200            e = target.html(
1201                target.head(
1202                    meta.contenttype(),
1203                    target.title(context.page.title),
1204                    meta.stylesheet(href="root:main_screen.css", media="screen, projection, tv"),
1205                    meta.stylesheet(href="root:doc_screen.css", media="screen, projection, tv"),
1206                    meta.stylesheet(href="root:main_print.css", media="print"),
1207                    meta.stylesheet(href="root:doc_print.css", media="print"),
1208                    meta.author(name=u"Walter Dörwald", email="walter.doerwald@livinglogic.de"),
1209                    html.meta(name="icbm", content=icbm),
1210                    html.meta(name="geo.position", content=icbm),
1211                    html.meta(name="geo.placename", content="Bayreuth, Germany, Europe"),
1212                    html.meta(name="geo.region", content="DE-BY"),
1213                    html.meta(name="DC.title", content=context.page.title),
1214                    html.link(rel="icon", href="root:images/favicon.gif", type="image/gif"),
1215                    top,
1216                    parent,
1217                    firstsibling,
1218                    prevsibling,
1219                    nextsibling,
1220                    lastsibling,
1221                    context.page.getLinks(),
1222                    keywords,
1223                    description,
1224                    refresh
1225                ),
1226                target.body(c),
1227                {(xml, "lang"): "en"},
1228                lang="en",
1229            )
1230            e = xsc.Frag(
1231                xml.XML10(),
1232                "\n",
1233                target.DocTypeXHTML10transitional(),
1234                "\n",
1235                e
1236            )
1237        return e.convert(converter)
1238
1239
1240class xmlns(xsc.Namespace):
1241    xmlname = "py"
1242    xmlurl = "http://xmlns.livinglogic.de/Python"
1243xmlns.makemod(vars())
1244
Note: See TracBrowser for help on using the browser.