root/livinglogic.python.www/site/Python_xmlns.py @ 205:3f36299ff25c

Revision 205:3f36299ff25c, 29.0 KB (checked in by Walter Doerwald <walter@…>, 16 years ago)

Update for XIST 2.2 with all new downloads.

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