root/livinglogic.python.www/site/Python_xmlns.py @ 217:89e3e2ccc30a

Revision 217:89e3e2ccc30a, 29.1 KB (checked in by Walter Doerwald <walter@…>, 16 years ago)

Add a real alt attribute.

Add geographical information about the site.

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 page(xsc.Element):
693    empty = False
694    class Attrs(xsc.Element.Attrs):
695        class title(xsc.TextAttr): pass
696        class keywords(xsc.TextAttr): pass
697        class description(xsc.TextAttr): pass
698        class refresh(xsc.TextAttr): pass
699        class class_(xsc.TextAttr): xmlname = "class"
700        class path(xsc.TextAttr): pass
701
702    def __linkLine(self, page, type, pos, indent):
703        e = htmlspecials.plaintable()
704
705        # empty space to the left
706        width = max(0, 15*(indent-1))
707
708        e2 = html.tr(valign="top")
709        # empty space to the left of title strip
710        if width:
711            e2.append(html.td(htmlspecials.pixel(width=width), rowspan=2))
712
713        # lines
714        if indent>0:
715            if type=="child" and page is not page.getParent()[-1]:
716                e2.append(html.td(htmlspecials.autoimg(src="root:images/Links/Tree_Cont.gif", alt=""), class_="joiner"))
717            else:
718                e2.append(html.td(htmlspecials.autoimg(src="root:images/Links/Tree_End.gif", alt="")))
719
720        # title strip
721        name = page.getName()
722        if type=="here":
723            e2.append(html.td(html.div(name, class_="linktitle"), width=130, valign="bottom"))
724        else:
725            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"))
726
727        # next line
728        e.append(e2)
729
730        e2 = html.tr()
731        # lines
732        if indent>0:
733            if type=="child" and page is not page.getParent()[-1]:
734                e2.append(html.td(htmlspecials.pixel(width=15), class_="joiner"))
735            else:
736                e2.append(html.td(htmlspecials.pixel(width=15)))
737        if pos>=6:
738            name = "Link_6"
739        else:
740            name = "Link_%d%s" % (pos, "abcde"[indent])
741        e2.append(html.td(html.div(page.getLinkInfo(), class_="linkinfo")))
742        e.append(e2)
743        return e
744
745    def __links(self, context):
746        e = html.div(class_="links")
747        path = context.path.split("/")
748        curpage = pages
749        indent = 0
750        pos = 1
751        while curpage is not context.page:
752            e.append(self.__linkLine(curpage, "parent", pos, indent))
753            curpage = curpage.getChildByName(path[indent])
754            indent += 1
755            pos += 1
756        e.append(self.__linkLine(curpage, "here", pos, indent))
757        indent += 1
758        pos += 1
759        for curpage in curpage:
760            e.append(self.__linkLine(curpage, "child", pos, indent))
761            pos += 1
762        return e
763
764    def _crumbs(self, context):
765        e = xsc.Frag()
766        page = context.page
767        while page is not None:
768            if page is context.page:
769                e.insert(0, html.span(page.getCrumb(), class_="here"))
770            else:
771                e.insert(0, self.xmlns.pageref(page.getCrumb(), ref=page.getPathString()))
772            e.insert(0, html.nbsp(), htmlspecials.autoimg(src="root:images/KruemmelPfeil.gif", alt=" > "), html.nbsp())
773            page = page.getParent()
774        e.insert(0, html.a("Home", href="http://www.livinglogic.de/", hreflang="de", title="The company homepage (in german)"))
775        return e
776
777    def convert(self, converter):
778        target = converter.target
779        context = converter[self.__class__]
780        context.path = unicode(self["path"].convert(converter))
781        context.page = pages[context.path]
782        # if the page does not have a "content" element, the whole page's content is considered as the page content
783        e_content = self.content.find(xsc.FindType(content))
784        if not len(e_content):
785            e_content = self.content
786        if issubclass(target, text):
787            e = target.html(
788                target.head(
789                    meta.contenttype(),
790                    target.title(self["title"]),
791                ),
792                target.body(
793                    e_content
794                )
795            )
796        elif issubclass(target, doc):
797            return e_content.convert(converter)
798        elif not issubclass(target, html):
799            raise ValueError("unknown conversion target %r" % target)
800        else:
801            c = htmlspecials.plaintable(
802                html.tr(
803                    html.td(htmlspecials.pixel(height=50)), # links
804                    html.td( # content
805                        html.a(
806                            htmlspecials.autoimg(
807                                src="root:images/LivingLogicKlein.gif",
808                                border=0,
809                                alt="[LivingLogic]",
810                            ),
811                            href="http://www.livinglogic.de/",
812                            hreflang="de",
813                            title="The company homepage (in german)"
814                        ),
815                        align="left",
816                        valign="middle",
817                        height=50
818                    ),
819                    class_="header" # this covers the background image
820                ),
821                html.tr(
822                    html.td(colspan=2, class_="linie")
823                ),
824                html.tr(
825                    html.td(htmlspecials.pixel()),
826                    html.td(html.div(self._crumbs(context), class_="crumbs")),
827                    valign="top"
828                ),
829                html.tr(
830                    html.td(self.__links(context)),
831                    html.td(html.div(e_content, class_="content")),
832                    valign="top"
833                ),
834                width="100%"
835            )
836
837            keywords = context.page.getKeywords()
838            if len(keywords):
839                keywords = meta.keywords(xsc.Frag(*keywords).withsep(", "))
840            else:
841                keywords = xsc.Null
842            description = context.page.getDescription()
843            if description is not None:
844                description = meta.description(description)
845            else:
846                description = xsc.Null
847            if "refresh" in self.attrs:
848                refresh = html.meta(http_equiv="refresh", content=self["refresh"])
849            else:
850                refresh = xsc.Null
851
852            firstsibling = context.page.getFirstSibling()
853            if firstsibling is not None:
854                if firstsibling != context.page:
855                    firstsibling = html.link(rel="first", title="First page in set", href=firstsibling.getURL())
856                else:
857                    firstsibling = None
858
859            prevsibling = context.page.getPrevSibling()
860            if prevsibling is not None:
861                if prevsibling != context.page:
862                    prevsibling = html.link(rel="prev", title="Previous page", href=prevsibling.getURL())
863                else:
864                    prevsibling = None
865
866            nextsibling = context.page.getNextSibling()
867            if nextsibling is not None:
868                if nextsibling != context.page:
869                    nextsibling = html.link(rel="next", title="Next page", href=nextsibling.getURL())
870                else:
871                    nextsibling = None
872
873            lastsibling = context.page.getLastSibling()
874            if lastsibling is not None:
875                if lastsibling != context.page:
876                    lastsibling = html.link(rel="last", title="Last page in set", href=lastsibling.getURL())
877                else:
878                    lastsibling = None
879
880            parent = context.page.getParent()
881            if parent is not None:
882                parent = html.link(rel="up", href=parent.getURL())
883
884            top = context.page.getRoot()
885            if top is not None:
886                if top != context.page:
887                    top = html.link(rel="top", href=top.getURL())
888                else:
889                    top = None
890
891            icbm = "49.9433; 11.5703"
892
893            e = target.html(
894                target.head(
895                    meta.contenttype(),
896                    target.title(self["title"]),
897                    meta.stylesheet(href="root:Main.css", media="screen, projection, tv"),
898                    meta.stylesheet(href="root:Doc.css", media="screen, projection, tv"),
899                    meta.stylesheet(href="root:MainPrint.css", media="print"),
900                    meta.stylesheet(href="root:DocPrint.css", media="print"),
901                    meta.author(name=u"Walter Dörwald", email="walter.doerwald@livinglogic.de"),
902                    html.meta(name="icbm", content=icbm),
903                    html.meta(name="geo.position", content=icbm),
904                    html.meta(name="geo.placename", content="Bayreuth, Germany, Europe"),
905                    html.meta(name="geo.region", content="DE-BY"),
906                    html.link(rel="icon", href="root:images/favicon.gif", type="image/gif"),
907                    top,
908                    parent,
909                    firstsibling,
910                    prevsibling,
911                    nextsibling,
912                    lastsibling,
913                    context.page.getLinks(),
914                    keywords,
915                    description,
916                    refresh
917                ),
918                target.body(
919                    target.div(htmlspecials.autoimg(src=("root:images/Backdrops/Nautilus-", self["class_"], ".jpg"), alt=""), class_="backdrop"),
920                    target.div(c, class_="page"),
921                    class_=self["class_"]
922                ),
923                {(xml, "lang"): "en"},
924                lang="en",
925            )
926            e = xsc.Frag(
927                xml.XML10(),
928                "\n",
929                target.DocTypeXHTML10transitional(),
930                "\n",
931                e
932            )
933        return e.convert(converter)
934
935class content(xsc.Element):
936    empty = False
937    def convert(self, converter):
938        return self.content.convert(converter)
939
940class pageref(xsc.Element):
941    empty = False
942    class Attrs(xsc.Element.Attrs):
943        class ref(xsc.TextAttr): pass
944
945    def convert(self, converter):
946        if "ref" in self.attrs:
947            page = pages[unicode(self["ref"].convert(converter))]
948        else:
949            page = pages
950        e = html.a(self.content, href=page.getURL(), title=page.getDescription())
951        return e.convert(converter)
952
953class alldownloads(xsc.Element):
954    empty = False
955
956    def convert(self, converter):
957        target = converter.target
958        if issubclass(target, doc):
959            e = self.content
960        else:
961            e = html.div(
962                htmlspecials.plaintable(
963                    self.content,
964                    class_="downloads"
965                ),
966                align="center"
967            )
968        return e.convert(converter)
969
970class downloads(xsc.Element):
971    empty = False
972    class Attrs(xsc.Element.Attrs):
973        class version(xsc.TextAttr): pass
974        class date(xsc.TextAttr): pass
975
976    def convert(self, converter):
977        target = converter.target
978        if issubclass(target, doc):
979            e = target.section(
980                target.title("Version ", self["version"], " (released ", self["date"], ")"),
981                target.ulist(self.content)
982            )
983        else:
984            e = xsc.Frag(
985                html.tr(
986                    html.th(self["version"], class_="version"),
987                    html.th("Type", class_="type"),
988                    html.th("Size", class_="size")
989                ),
990                self.content
991            )
992            if "date" in self.attrs:
993                e[0][0].append(" ", html.span("(released ", self["date"], ")", class_="note"))
994        return e.convert(converter)
995
996class download(xsc.Element):
997    empty = True
998    class Attrs(xsc.Element.Attrs):
999        class href(xsc.TextAttr): pass
1000        class type(xsc.TextAttr): pass
1001
1002    def convert(self, converter):
1003        target = converter.target
1004        name = url.URL(unicode(self["href"].convert(converter))).file
1005        if "type" in self.attrs:
1006            type = self["type"]
1007        elif name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
1008            type = "Source"
1009        elif name.endswith(".exe"):
1010            type = "Windows installer"
1011        elif name.endswith(".src.rpm"):
1012            type = "Source RPM"
1013        elif name.endswith(".rpm"):
1014            type = "Binary RPM"
1015        else:
1016            type = html.nbsp()
1017
1018        if issubclass(target, doc):
1019            e = target.item(
1020                target.link(unicode(name), href=("http://ftp.livinglogic.de/", self["href"])),
1021                " (",
1022                type,
1023                ", ",
1024                specials.filesize(href=("http://ftp.livinglogic.de/", self["href"])),
1025                " bytes)"
1026            )
1027        else:
1028            e = html.tr(
1029                html.td(html.a(unicode(name), href=("http://ftp.livinglogic.de/", self["href"]), title=("Download http://ftp.livinglogic.de/", self["href"])), class_="file"),
1030                html.td(type, class_="type"),
1031                html.td(specials.filesize(href=("http://ftp.livinglogic.de/", self["href"])), class_="size"),
1032                class_="download"
1033            )
1034        return e.convert(converter)
1035
1036doc.pyref.base = "root:"
1037
1038class xmlns(xsc.Namespace):
1039    xmlname = "py"
1040    xmlurl = "http://xmlns.livinglogic.de/Python"
1041xmlns.makemod(vars())
1042
Note: See TracBrowser for help on using the browser.