root/livinglogic.python.www/site/Python_xmlns.py @ 300:618e7ba4da05

Revision 300:618e7ba4da05, 35.5 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Major update of the webpages: New design, new navigation, move page
attributes from XML into Page classes, etc.

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