root/livinglogic.python.www/site/Python_xmlns.py @ 198:014d9586256a

Revision 198:014d9586256a, 28.7 KB (checked in by Walter Doerwald <walter@…>, 17 years ago)

Add make migration guide.

make release 0.6.

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