root/livinglogic.python.www/site/Python_xmlns.py @ 201:56371f2191d2

Revision 201:56371f2191d2, 28.9 KB (checked in by Walter Doerwald <walter@…>, 17 years ago)

XIST release 2.1.

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