root/livinglogic.python.www/site/Python_xmlns.py @ 251:8a47fd321d6a

Revision 251:8a47fd321d6a, 30.8 KB (checked in by Walter Doerwald <walter@…>, 15 years ago)

FIrst release of toxic.

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