root/livinglogic.python.www/site/Python_xmlns.py @ 390:b84ce0455172

Revision 390:b84ce0455172, 41.4 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

Make it work with the newest version of all modules.

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