root/livinglogic.python.www/site/Python_namespace.py @ 171:6bcbf974c8e1

Revision 171:6bcbf974c8e1, 28.2 KB (checked in by Walter Doerwald <walter@…>, 17 years ago)

Update everything to XIST 2.0 and add the XIST 2.0 download

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