root/livinglogic.python.www/site/Python_xmlns.py @ 298:6cc055dd6261

Revision 298:6cc055dd6261, 32.7 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

Windows binary packages for ansistyle, url and XIST.

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