root/livinglogic.python.www/site/Python_xmlns.py @ 310:35e5bb9d0719

Revision 310:35e5bb9d0719, 40.1 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Make sure that keywords are unique.

Add antother attribute linktitle to page that is used on all links to
other pages in the navigation.

Add u-prefix to keywords.

Add linktitle to most of the pages.

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