root/livinglogic.python.www/site/Python_xmlns.py @ 306:bb51372ebb20

Revision 306:bb51372ebb20, 37.6 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Enhance layout of here link.

Add link title to a few pages (via the description).

Add releases of all packages.

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