root/livinglogic.python.www/site/Python_xmlns.py @ 309:93d56eaf801c

Revision 309:93d56eaf801c, 37.3 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Replace parent accessors with a plain attribute.

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