root/livinglogic.python.www/site/Python_xmlns.py @ 366:1acb0e093d7d

Revision 366:1acb0e093d7d, 41.2 KB (checked in by Walter Doerwald <walter@…>, 14 years ago)

Updates: ll-xist 2.12, ll-core 1.0, ll-orasql 1.0

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