root/livinglogic.python.www/site/Python_xmlns.py @ 365:9f8666d4f6bd

Revision 365:9f8666d4f6bd, 40.9 KB (checked in by Walter Doerwald <walter@…>, 14 years ago)

Update to new distribution structure (i.e. the new ll-core package).

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