root/livinglogic.python.www/site/Python_namespace.py @ 165:3a6f83bd7c02

Revision 165:3a6f83bd7c02, 27.3 KB (checked in by Walter Doerwald <walter@…>, 17 years ago)

Use the new package structure.

Add the the releases.

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