root/livinglogic.python.www/site/Python_xmlns.py @ 389:6e45ca6f80c3

Revision 389:6e45ca6f80c3, 40.6 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

Remove ansistyle.

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