root/livinglogic.python.www/site/Python_xmlns.py @ 622:fa10ddc616df

Revision 622:fa10ddc616df, 40.1 KB (checked in by Walter Doerwald <walter@…>, 9 years ago)

Update code to newest XIST version.

Line 
1# -*- coding: iso-8859-1 -*-
2
3
4from __future__ import with_statement
5
6import sys, types, inspect
7
8from ll import misc, url
9from ll.xist import xsc, sims, parsers
10from ll.xist.ns import html, chars, htmlspecials, specials, abbr, meta, doc, code, xml
11
12
13xmlns = "http://xmlns.livinglogic.de/Python"
14
15
16class Page(object):
17    """
18    A webpage in the sitemap tree.
19    This is an abstract class, that provides common
20    functionality for derived classes.
21    """
22
23    class keywords(misc.propclass):
24        def __get__(self):
25            keywords = list(self.localkeywords)
26            page = self
27            while page is not None:
28                for keyword in page.inheritablekeywords:
29                    if keyword not in keywords:
30                        keywords.append(keyword)
31                page = page.parent
32            return keywords
33
34    @misc.notimplemented
35    def getChildByIndex(self, index):
36        pass
37
38    @misc.notimplemented
39    def getChildByName(self, index):
40        pass
41
42    def getFirstSibling(self):
43        parent = self.parent
44        if parent is None:
45            return None
46        else:
47            return parent.getChildByIndex(0)
48
49    def getPrevSibling(self):
50        parent = self.parent
51        if parent is None:
52            return None
53        else:
54            sibling = None
55            for child in parent.getChildren():
56                if child is self:
57                    break
58                sibling = child
59            return sibling
60
61    def getNextSibling(self):
62        parent = self.parent
63        if parent is None:
64            return None
65        else:
66            sibling = None
67            for child in parent.getChildren():
68                if child is self:
69                    sibling = self
70                elif sibling is not None:
71                    return child
72                else:
73                    sibling = None
74            return None
75
76    def getLastSibling(self):
77        parent = self.parent
78        if parent is None:
79            return None
80        else:
81            return parent.getChildByIndex(-1)
82
83    @misc.notimplemented
84    def __len__(self):
85        pass
86
87    def getChildren(self):
88        children = []
89        index = 0
90        while True:
91            try:
92                children.append(self.getChildByIndex(index))
93            except IndexError:
94                break
95            index + 1
96        return children
97
98    def walk(self):
99        yield self
100        for child in self.getChildren():
101            for page in child.walk():
102                yield page
103
104    def __getitem__(self, index):
105        if isinstance(index, (int, long)):
106            return self.getChildByIndex(index)
107        elif isinstance(index, basestring):
108            if index=="":
109                index = []
110            else:
111                index = index.split("/")
112        if isinstance(index, (list, tuple)):
113            result = self
114            for i in index:
115                if isinstance(i, (int, long)):
116                    result = result.getChildByIndex(i)
117                elif isinstance(i, basestring):
118                    result = result.getChildByName(i)
119                else:
120                    raise TypeError("illegal index type %r" % type(i))
121            return result
122        else:
123            raise TypeError("wrong type %s for index (must be int, long, string, unicode or tuple)" % type(index))
124
125    def getPath(self):
126        path = []
127        page = self
128        while page is not None:
129            path.insert(0, page)
130            page = page.parent
131        return path
132
133    def getPathString(self):
134        return "/".join([ page.name for page in self.getPath() if page.parent])
135
136    def getRoot(self):
137        """
138        return the root page (i.e. the one without a parent)
139        """
140        parent = self
141        while 1:
142            testparent = parent.parent
143            if testparent is None:
144                return parent
145            parent = testparent
146
147    def __repr__(self):
148        return '<%s object path="%s" at 0x%x>' % (self.__class__.__name__, self.getPathString(), id(self))
149
150    def alternates(self):
151        return []
152
153
154class StaticPage(Page):
155    """
156    A webpage in the sitemap tree
157    """
158    def __init__(self, name, *children, **attrs):
159        self.parent = None
160        self.name = name
161        self.title = None
162        self.crumb = None
163        self.url = None
164        self.header = None
165        self.subheader = None
166        self.localkeywords = []
167        self.inheritablekeywords = []
168        self.hint = None
169        self.description = None
170        for (k, v) in attrs.items():
171            if k=="crumb":
172                self.crumb = v
173            elif k=="url":
174                self.url = v
175            elif k=="title":
176                self.title = v
177            elif k=="header":
178                self.header = v
179            elif k=="subheader":
180                self.subheader = v
181            elif k=="localkeywords":
182                self.localkeywords = v
183            elif k=="inheritablekeywords":
184                self.inheritablekeywords = v
185            elif k=="hint":
186                self.hint = v
187            elif k=="description":
188                self.description = u" ".join(v.strip().split())
189            else:
190                raise ValueError("unknown keyword %s" % k)
191        for child in children:
192            child.parent = self # this creates a cycle
193        self.__children = list(children)
194
195    def getChildByIndex(self, index):
196        return self.__children[index]
197
198    def getChildByName(self, index):
199        for child in self.__children:
200            if child.name == index:
201                return child
202        raise KeyError("unknown child %r in page %r" % (index, self.getPathString()))
203
204    def getChildren(self):
205        return self.__children
206
207    def __len__(self):
208        return len(self.__children)
209
210
211class XISTPage(StaticPage):
212    def alternates(self):
213        alternates = super(XISTPage, self).alternates()
214
215        url = self.url
216        pos = url.rfind(".")
217        if pos>=0:
218            txturl = url[:pos+1] + "txt"
219            xmlurl = url[:pos+1] + "htmlxsc"
220        else:
221            txturl = url + ".txt"
222            xmlurl = url + ".htmlxsc"
223
224        return [
225            html.a("Text", href=txturl, rel="alternate", type="text/plain", title="A plain text version of this page"),
226            html.a("XIST", href=xmlurl, rel="alternate", type="text/xml", title=("The ", abbr.xist(), " source of this page"))
227        ] + alternates
228
229
230class PythonSourcePage(XISTPage):
231    def alternates(self):
232        alternates = super(PythonSourcePage, self).alternates()
233        url = self.url
234        if url.endswith(".html"):
235            url = url[:-5] + "_module.py"
236        else:
237            url = url + "_module.py"
238        return alternates + [html.a("Python", href=url, rel="alternate", type="text/x-python", title="The Python module described in this page")]
239
240
241pages = XISTPage(u"python",
242    PythonSourcePage(u"xist",
243        XISTPage(u"examples",
244            crumb=u"Examples",
245            title=(abbr.xist(), u" examples · Python software · LivingLogic AG"),
246            header=(abbr.xist(), u" examples"),
247            subheader=(u"An introduction to ", abbr.xist(), u" by examples"),
248            url=u"root:xist/Examples.html",
249            localkeywords=[],
250            hint=u"Parsing/creating/modifying XML; Traversing XML trees"
251        ),
252        XISTPage(u"howto",
253            crumb=u"Howto",
254            title=(abbr.xist(), u" howto · Python software · LivingLogic AG"),
255            header=(abbr.xist(), u" howto"),
256            subheader=(u"A quick tour of ", abbr.xist()),
257            url=u"root:xist/Howto.html",
258            localkeywords=[],
259            hint=(u"Explains parsing/generating XML files, XML transformations via ", abbr.xist(), " classes and other basic concepts.")
260        ),
261        XISTPage(u"searching",
262            crumb=u"Searching",
263            title=(u"Searching ", abbr.xist(), u" trees · Python software · LivingLogic AG"),
264            header=("Searching ", abbr.xist(), u" trees"),
265            subheader=("Searching, tree traversal, xfind and ", abbr.css(), " selectors"),
266            url=u"root:xist/Searching.html",
267            localkeywords=["searching", "traversal", "xfind", "css"],
268            hint=(u"How to iterate through ", abbr.xist(), " trees"),
269        ),
270        XISTPage(u"transformation",
271            crumb=u"Transformation",
272            title=("Transforming ", abbr.xist(), u" trees · Python software · LivingLogic AG"),
273            header=("Transforming ", abbr.xist(), u" trees"),
274            subheader=("The ", doc.func("mapped"), " function, sorting, etc."),
275            url=u"root:xist/Transformation.html",
276            localkeywords=[],
277            hint=(u"How to transform ", abbr.xist(), " trees"),
278        ),
279        XISTPage(u"advanced",
280            crumb=u"Advanced topics",
281            title=("Advanced ", abbr.xist(), u" · Python software · LivingLogic AG"),
282            header=("Advanced ", abbr.xist()),
283            subheader="Converter contexts, pool chaining, namespace extensions, conversion targets, validation",
284            url=u"root:xist/Advanced.html",
285            localkeywords=[],
286            hint=u"Pool chaining, converter contexts, validation"
287        ),
288        XISTPage(u"misc",
289            crumb=u"Miscellaneous",
290            title=(abbr.xist(), u" miscellaneous · Python software · LivingLogic AG"),
291            header=(abbr.xist(), u" miscellaneous"),
292            subheader=(abbr.url(), u"s, pretty printing, image sizes, embedding Python code"),
293            url=u"root:xist/Misc.html",
294            localkeywords=[],
295            hint=(u"Explains various odds and ends of ", abbr.xist()),
296        ),
297        PythonSourcePage(u"xsc",
298            crumb=u"xsc",
299            title=(abbr.xist(), u".xsc · Python software · LivingLogic AG"),
300            header=(abbr.xist(), u".xsc"),
301            subheader=(abbr.xist(), u" core classes"),
302            url=u"root:xist/xsc/index.html",
303            hint=(abbr.xist(), u" core classes"),
304        ),
305        PythonSourcePage(u"ns",
306            PythonSourcePage(u"html",
307                crumb=u"html",
308                title=(abbr.xist(), u".ns.html · Python software · LivingLogic AG"),
309                header=(abbr.xist(), u".ns.html"),
310                subheader=(u"Module implementing ", abbr.html(), u" 4.01 (with additions)"),
311                url=u"root:xist/ns/html/index.html",
312                hint=u"HTML namespace",
313            ),
314            PythonSourcePage(u"xml",
315                crumb=u"xml",
316                title=(abbr.xist(), u".ns.xml · Python software · LivingLogic AG"),
317                header=(abbr.xist(), u".ns.xml"),
318                subheader=(u"Module for global attributes from the ", abbr.xml(), u" namespace"),
319                url=u"root:xist/ns/xml/index.html",
320                hint=u"Namespace implementing global XML attributes",
321            ),
322            PythonSourcePage(u"wml",
323                crumb=u"wml",
324                title=(abbr.xist(), u".ns.wml · Python software · LivingLogic AG"),
325                header=(abbr.xist(), u".ns.wml"),
326                subheader=(u"Module implementing ", abbr.wml(), u" 1.3"),
327                url=u"root:xist/ns/wml/index.html",
328                hint=u"WML 1.3 namespace",
329            ),
330            PythonSourcePage(u"ihtml",
331                crumb=u"ihtml",
332                title=(abbr.xist(), u".ns.ihtml · Python software · LivingLogic AG"),
333                header=(abbr.xist(), u".ns.ihtml"),
334                subheader=(u"Module module implementing i-mode compatible ", abbr.html()),
335                url=u"root:xist/ns/ihtml/index.html",
336                hint=u"Namespace implementing i-mode compatible HTML",
337            ),
338            PythonSourcePage(u"docbook",
339                crumb=u"docbook",
340                title=(abbr.xist(), u".ns.docbook · Python software · LivingLogic AG"),
341                header=(abbr.xist(), u".ns.docbook"),
342                subheader=u"Namespace module implementing DocBook 4.3",
343                url=u"root:xist/ns/docbook/index.html",
344                hint=u"Namespace implementing DocBook 4.3",
345            ),
346            PythonSourcePage(u"svg",
347                crumb=u"svg",
348                title=(abbr.xist(), u".ns.svg · Python software · LivingLogic AG"),
349                header=(abbr.xist(), u".ns.svg"),
350                subheader=(u"Namespace module implementing ", abbr.svg(), u" 1.0"),
351                url=u"root:xist/ns/svg/index.html",
352                hint=u"Namespace implementing SVG 1.0",
353            ),
354            PythonSourcePage(u"abbr",
355                crumb=u"abbr",
356                title=(abbr.xist(), u".ns.abbr · Python software · LivingLogic AG"),
357                header=(abbr.xist(), u".ns.abbr"),
358                subheader=u"Namespace module containing many abbreviation entities",
359                url=u"root:xist/ns/abbr/index.html",
360                hint=u"Namespace containing abbreviation entities",
361            ),
362            PythonSourcePage(u"code",
363                crumb=u"code",
364                title=(abbr.xist(), u".ns.code · Python software · LivingLogic AG"),
365                header=(abbr.xist(), u".ns.code"),
366                subheader=(u"Namespace module for embedding Python code in ", abbr.xml()),
367                url=u"root:xist/ns/code/index.html",
368                hint=u"Namespace for embedding Python code in XML",
369            ),
370            PythonSourcePage(u"form",
371                crumb=u"form",
372                title=(abbr.xist(), u".ns.form · Python software · LivingLogic AG"),
373                header=(abbr.xist(), u".ns.form"),
374                subheader=u"Namespace module implementing form related elements",
375                url=u"root:xist/ns/form/index.html",
376                hint=u"Namespace implementing form related elements",
377            ),
378            PythonSourcePage(u"php",
379                crumb=u"php",
380                title=(abbr.xist(), u".ns.php · Python software · LivingLogic AG"),
381                header=(abbr.xist(), u".ns.php"),
382                subheader=(u"Namespace module for PHP processing instructions"),
383                url=u"root:xist/ns/php/index.html",
384                hint=u"Namespace for PHP processing instructions",
385            ),
386            PythonSourcePage(u"jsp",
387                crumb=u"jsp",
388                title=(abbr.xist(), u".ns.jsp · Python software · LivingLogic AG"),
389                header=(abbr.xist(), u".ns.jsp"),
390                subheader=(u"Namespace module for embedding ", abbr.jsp(), u" code as processing instructions"),
391                url=u"root:xist/ns/jsp/index.html",
392                hint=u"Namespace for JSP code as processing instructions",
393            ),
394            PythonSourcePage(u"meta",
395                crumb=u"meta",
396                title=(abbr.xist(), u".ns.meta · Python software · LivingLogic AG"),
397                header=(abbr.xist(), u".ns.meta"),
398                subheader=u"Namespace module containing meta information elements",
399                url=u"root:xist/ns/meta/index.html",
400                hint=u"Namespace containing meta information elements",
401            ),
402            PythonSourcePage(u"ruby",
403                crumb=u"ruby",
404                title=(abbr.xist(), u".ns.ruby · Python software · LivingLogic AG"),
405                header=(abbr.xist(), u".ns.ruby"),
406                subheader=u"Namespace implementing the W3C ruby draft",
407                url=u"root:xist/ns/ruby/index.html",
408                hint=u"Namespace implementing the W3C ruby draft",
409            ),
410            PythonSourcePage(u"specials",
411                crumb=u"specials",
412                title=(abbr.xist(), u".ns.specials · Python software · LivingLogic AG"),
413                header=(abbr.xist(), u".ns.specials"),
414                subheader=u"Common useful elements",
415                url=u"root:xist/ns/specials/index.html",
416                hint=u"Common useful elements",
417            ),
418            PythonSourcePage(u"htmlspecials",
419                crumb=u"htmlspecials",
420                title=(abbr.xist(), u".ns.htmlspecials · Python software · LivingLogic AG"),
421                header=(abbr.xist(), u".ns.htmlspecials"),
422                subheader=(u"Common useful elements for ", abbr.html(), u" generation"),
423                url=u"root:xist/ns/htmlspecials/index.html",
424                hint=u"Common useful elements for HTML generation",
425            ),
426            PythonSourcePage(u"doc",
427                crumb=u"doc",
428                title=(abbr.xist(), u".ns.doc · Python software · LivingLogic AG"),
429                header=(abbr.xist(), u".ns.doc"),
430                subheader=u"Namespace module for automated documentation generation",
431                url=u"root:xist/ns/doc/index.html",
432                hint=u"Namespace for automated documentation generation",
433            ),
434            PythonSourcePage(u"kid",
435                crumb=u"kid",
436                title=(abbr.xist(), u".ns.kid · Python software · LivingLogic AG"),
437                header=(abbr.xist(), u".ns.kid"),
438                subheader=u"Namespace module for Kid templates",
439                url=u"root:xist/ns/kid/index.html",
440                hint=u"Namespace for Kid templates",
441            ),
442            PythonSourcePage(u"detox",
443                crumb=u"detox",
444                title=(abbr.xist(), u".ns.detox · Python software · LivingLogic AG"),
445                header=(abbr.xist(), u".ns.detox"),
446                subheader=(abbr.xist(), u" based Python templating language"),
447                url=u"root:xist/ns/detox/index.html",
448                hint=u"Namespace for detox templates",
449            ),
450            PythonSourcePage(u"toxic",
451                crumb=u"toxic",
452                title=(abbr.xist(), u".ns.toxic · Python software · LivingLogic AG"),
453                header=(abbr.xist(), u".ns.toxic"),
454                subheader=(u"Generate Oracle functions from PL/SQL embedded in ", abbr.xml()),
455                url=u"root:xist/ns/toxic/index.html",
456                localkeywords=[u"Oracle", u"user defined function", u"PL/SQL", u"XML", u"HTML", u"processing instruction", u"PI", u"embed"],
457                hint=u"Embed PL/SQL in XIST XML",
458                description=u"""
459                toxic is an XIST namespace that can be used for generating Oracle
460                database functions that return XML strings. This is done by
461                embedding processing instructions containing PL/SQL code into XML
462                files and transforming those files with XIST.
463                """,
464            ),
465            PythonSourcePage(u"rng",
466                crumb=u"rng",
467                title=(abbr.xist(), u".ns.rng · Python software · LivingLogic AG"),
468                header=(abbr.xist(), u".ns.rng"),
469                subheader=u"Namespace module for Relax NG",
470                url=u"root:xist/ns/rng/index.html",
471                hint=u"Namespace for Relax NG",
472            ),
473            PythonSourcePage(u"rss091",
474                crumb=u"rss091",
475                title=(abbr.xist(), u".ns.rss091 · Python software · LivingLogic AG"),
476                header=(abbr.xist(), u".ns.rss091"),
477                subheader=u"Namespace module for RSS 0.91",
478                url=u"root:xist/ns/rss091/index.html",
479                hint=u"Namespace for RSS 0.91",
480            ),
481            PythonSourcePage(u"rss20",
482                crumb=u"rss20",
483                title=(abbr.xist(), u".ns.rss20 · Python software · LivingLogic AG"),
484                header=(abbr.xist(), u".ns.rss20"),
485                subheader=u"Namespace module for RSS 2.0",
486                url=u"root:xist/ns/rss20/index.html",
487                hint=u"Namespace for RSS 2.0",
488            ),
489            PythonSourcePage(u"atom",
490                crumb=u"atom",
491                title=(abbr.xist(), u".ns.atom · Python software · LivingLogic AG"),
492                header=(abbr.xist(), u".ns.atom"),
493                subheader=u"Namespace module for Atom 1.0",
494                url=u"root:xist/ns/atom/index.html",
495                hint=u"Namespace for Atom 1.0",
496            ),
497            PythonSourcePage(u"struts_html",
498                crumb=u"struts_html",
499                title=(abbr.xist(), u"ns.struts_html · Python software · LivingLogic AG"),
500                header=(abbr.xist(), u".ns.struts_html"),
501                subheader=(u"Mamespace module implementing the the Struts ", abbr.html(), u" tags"),
502                url=u"root:xist/ns/struts_html/index.html",
503                hint=u"Namespace for Jakarta Struts HTML tags",
504            ),
505            PythonSourcePage(u"struts_config",
506                crumb=u"struts_config",
507                title=(abbr.xist(), u".ns.struts_config · Python software · LivingLogic AG"),
508                header=(abbr.xist(), u".ns.struts_config"),
509                subheader=u"Namespace module for Struts configuration files",
510                url=u"root:xist/ns/struts_config/index.html",
511                hint=u"Namespace for Jakarta Struts configuration file tags",
512            ),
513            crumb=u"ns",
514            title=(abbr.xist(), u".ns"),
515            header=(abbr.xist(), u".ns"),
516            subheader=u"Subpackage containing namespace modules",
517            url=u"root:xist/ns/index.html",
518            hint=u"Package containing namespace modules",
519        ),
520        PythonSourcePage(u"parsers",
521            crumb=u"parsers",
522            title=(abbr.xist(), u".parsers · Python software · LivingLogic AG"),
523            header=(abbr.xist(), u".parsers"),
524            subheader=(u"Tools for parsing ", abbr.xml(), " from various sources"),
525            url=u"root:xist/parsers/index.html",
526            hint=u"Parsing XML",
527        ),
528        PythonSourcePage(u"converters",
529            crumb=u"converters",
530            title=(abbr.xist(), u".converters · Python software · LivingLogic AG"),
531            header=(abbr.xist(), u".converters"),
532            subheader=u"Module with the converter class",
533            url=u"root:xist/converters/index.html",
534            hint=u"Configuring the XML transformation",
535        ),
536        PythonSourcePage(u"presenters",
537            crumb=u"presenters",
538            title=(abbr.xist(), u".presenters · Python software · LivingLogic AG"),
539            header=(abbr.xist(), u".presenters"),
540            subheader=u"Module with classes for printing trees",
541            url=u"root:xist/presenters/index.html",
542            hint=u"Screen output of XML trees",
543        ),
544        PythonSourcePage(u"publishers",
545            crumb=u"publishers",
546            title=(abbr.xist(), u".publishers · Python software · LivingLogic AG"),
547            header=(abbr.xist(), u".publishers"),
548            subheader=u"Module with classes for publishing trees",
549            url=u"root:xist/publishers/index.html",
550            hint=u"XML output",
551        ),
552        PythonSourcePage(u"sims",
553            crumb=u"sims",
554            title=(abbr.xist(), u".sims · Python software · LivingLogic AG"),
555            header=(abbr.xist(), u".sims"),
556            subheader=u"Simple schema validation",
557            url=u"root:xist/sims/index.html",
558            hint=u"Simple schema validation",
559        ),
560        PythonSourcePage(u"xfind",
561            crumb=u"xfind",
562            title=(abbr.xist(), u".xfind · Python software · LivingLogic AG"),
563            header=(abbr.xist(), u".xfind"),
564            subheader=u"Tree iteration and filtering",
565            url=u"root:xist/xfind/index.html",
566            hint=u"Tree iteration and filtering",
567        ),
568        PythonSourcePage(u"css",
569            crumb=u"css",
570            title=(abbr.xist(), u".css · Python software · LivingLogic AG"),
571            header=(abbr.xist(), u".css"),
572            subheader=(abbr.css(), " related funtions"),
573            url=u"root:xist/css/index.html",
574            hint=u"CSS related functions",
575        ),
576        XISTPage(u"history",
577            XISTPage(u"old",
578                crumb=u"Old history",
579                title=u"Old history · Python software · LivingLogic AG",
580                header=u"Old history",
581                subheader=u"The history before distribution restructuring",
582                url=u"root:xist/OldHistory.html",
583                localkeywords=[u"history", u"changes", u"version"],
584                hint=(u"Old ChangeLog for modules merged into ", abbr.xist()),
585            ),
586            crumb=u"History",
587            title=(abbr.xist(), u" history · Python software · LivingLogic AG"),
588            header=(abbr.xist(), u" history"),
589            subheader=u"The development history",
590            url=u"root:xist/History.html",
591            localkeywords=[u"history", u"changes", u"version"],
592            hint=("ChangeLog for ", abbr.xist()),
593        ),
594        XISTPage(u"installation",
595            crumb=u"Installation",
596            title=(abbr.xist(), u" requirements and installation · Python software · LivingLogic AG"),
597            header=(abbr.xist(), u" installation"),
598            subheader=u"Requirements, installation and configuration",
599            url=u"root:xist/Installation.html",
600            localkeywords=[u"installation", u"distutils"],
601            hint=("How to install and configure ", abbr.xist()),
602        ),
603        XISTPage(u"migration",
604            XISTPage(u"old",
605                crumb=u"Old migration info",
606                title=u"Old migration info · Python software · LivingLogic AG",
607                header=u"Old migration info",
608                subheader=u"Migration infomation for old versions before distribution restructuring",
609                url=u"root:xist/OldMigration.html",
610                localkeywords=[u"history", u"changes", u"version"],
611                hint=u"Old migration info",
612            ),
613            crumb=u"Migration",
614            title=(abbr.xist(), u" migration guide · Python software · LivingLogic AG"),
615            header=(abbr.xist(), u" migration"),
616            subheader=(u"How to update your code to new versions of ", abbr.xist()),
617            url=u"root:xist/Migration.html",
618            localkeywords=[],
619            hint=(u"How to update your code to new versions of ", abbr.xist()),
620        ),
621        XISTPage(u"mailinglists",
622            crumb=u"Mailing lists",
623            title=(abbr.xist(), u" mailing lists · Python software · LivingLogic AG"),
624            header=(abbr.xist(), u" mailing lists"),
625            subheader=u"How to subscribe to the mailing lists",
626            url=u"root:xist/Mailinglists.html",
627            localkeywords=[u"mailing list", u"list", u"posting", u"discussion", u"announcement"],
628            hint=(u"How to subscribe to the ", abbr.xist(), " mailing lists"),
629        ),
630        crumb="ll.xist",
631        title=(abbr.xist(), u" · Python software · LivingLogic AG"),
632        header=abbr.xist(),
633        subheader=(u"An extensible ", abbr.html(), u"/", abbr.xml(), u" generator"),
634        url=u"root:xist/index.html",
635        inheritablekeywords=[abbr.xist(), abbr.xml(), u"transformation", abbr.xsl(), u"hsc"],
636        hint=u"An extensible XML/HTML generator",
637        description=u"""
638        XIST is an extensible HTML/XML generator written in Python. XIST is also a
639        DOM parser (built on top of SAX2) with a very simple and pythonesque tree
640        API. Every XML element type corresponds to a Python class and these Python
641        classes provide a conversion method to transform the XML tree (e.g. into
642        HTML). XIST can be considered 'object oriented XSL'.
643        """,
644    ),
645    PythonSourcePage(u"ul4",
646        XISTPage(u"howto",
647            crumb=u"Howto",
648            title=u"ll.ul4c howto · Python software · LivingLogic AG",
649            header=u"ll.ul4c documentation",
650            subheader=u"How to use UL4",
651            url=u"root:ul4c/Howto.html",
652            localkeywords=[],
653            hint=u"How to use UL4",
654        ),
655        crumb=u"ll.ul4c",
656        title=u"ll.ul4c · Python software · LivingLogic AG",
657        header=u"ll.ul4c",
658        subheader=(u"Crossplatform templating language"),
659        url=u"root:ul4c/index.html",
660        hint=u"A templating language",
661        description=u"""
662        ll.ul4c provides a crossplatform templating language.
663        """,
664    ),
665    PythonSourcePage(u"url",
666        XISTPage(u"howto",
667            crumb=u"Howto",
668            title=u"ll.url howto · Python software · LivingLogic AG",
669            header=u"ll.url documentation",
670            subheader=u"Special features of URL",
671            url=u"root:url/Howto.html",
672            localkeywords=[],
673            hint=u"Special features of URL",
674        ),
675        crumb=u"ll.url",
676        title=u"ll.url · Python software · LivingLogic AG",
677        header=u"ll.url",
678        subheader=(u"Module implementing ", abbr.url(), u"s"),
679        url=u"root:url/index.html",
680        hint=u"RFC 2396 compliant URLs",
681        description=u"""
682        ll.url is a Python module that provides classes for parsing and
683        constructing RFC 2396 compliant URLs.
684        """,
685    ),
686    PythonSourcePage(u"make",
687        crumb=u"ll.make",
688        title=u"ll.make · Python software · LivingLogic AG",
689        header=u"ll.make",
690        subheader=u"Object oriented make replacement",
691        url=u"root:make/index.html",
692        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
693        hint=u"Object oriented make replacement",
694        description=u"""
695        ll.make is a Python module that provides an object oriented make replacement.
696        Like make it allows you to specify dependencies between files and actions
697        to be executed when files don't exist or are out of date with respect to
698        one of their sources. But unlike make you can do this in a object oriented
699        way and targets are not only limited to files, but you can implement
700        e.g. dependencies on database records.
701        """,
702    ),
703    PythonSourcePage(u"daemon",
704        crumb=u"ll.daemon",
705        title=u"ll.daemon · Python software · LivingLogic AG",
706        header=u"ll.daemon",
707        subheader=u"Forking daemon processes with Python",
708        url=u"root:daemon/index.html",
709        inheritablekeywords=[u"daemon", u"fork", u"process"],
710        hint=u"Forking daemon processes",
711        description=u"""
712        ll.daemon is a Python module that can be used on UNIX to fork a daemon process.
713        """,
714    ),
715    PythonSourcePage(u"sisyphus",
716        crumb=u"ll.sisyphus",
717        title=u"ll.sisyphus · Python software · LivingLogic AG",
718        header=u"ll.sisyphus",
719        subheader=u"Writing cron jobs with Python",
720        url=u"root:sisyphus/index.html",
721        inheritablekeywords=[u"packages", u"Sisyphus", u"cron", u"job"],
722        hint=u"Writing cron jobs with Python",
723        description=u"""
724        ll.sisyphus is a Python module that simplifies writing Python scripts
725        that run as cron jobs.
726        """,
727    ),
728    PythonSourcePage(u"color",
729        crumb=u"ll.color",
730        title=u"ll.color · Python software · LivingLogic AG",
731        header=u"ll.color",
732        subheader=u"RGB color values and color model conversion",
733        url=u"root:color/index.html",
734        localkeywords=[u"RGB", u"red", u"green", u"blue", u"HSV", u"HSB", u"HSL", u"HLS", u"hue", u"saturation", u"value", u"brightness", u"luminance"],
735        hint=u"RGB color values and color model conversion",
736        description=u"""
737        ll.color is a Python module that provides classes and functions for handling
738        RGB color values. This includes the ability to convert between different
739        color models (RGB, HSV, HLS) as well as to and from CSS format, and several
740        functions for modifying and mixing colors.
741        """,
742    ),
743    PythonSourcePage(u"misc",
744        crumb=u"ll.misc",
745        title=u"ll.misc · Python software · LivingLogic AG",
746        header=u"ll.misc",
747        subheader=u"Miscellaneous utility functions and classes",
748        url=u"root:misc/index.html",
749        localkeywords=[u"utilities", u"decorator", u"property", u"module", u"namespace"],
750        hint=u"Misc utility functions and classes",
751        description=u"""
752        ll.misc provides serveral utility classes and functions.
753        """,
754    ),
755    PythonSourcePage(u"orasql",
756        XISTPage(u"history",
757            crumb=u"History",
758            title=u"ll.orasql history · Python software · LivingLogic AG",
759            header=u"ll.orasql history",
760            subheader=u"The development history",
761            url=u"root:orasql/History.html",
762            localkeywords=[u"packages", u"history", u"changes", u"version"],
763            hint=(u"ChangeLog for ", doc.mod("ll.orasql")),
764        ),
765        XISTPage(u"installation",
766            crumb=u"Installation",
767            title=u"ll.orasql installation · Python software · LivingLogic AG",
768            header=u"ll.orasql installation",
769            subheader=u"Requirements and installation",
770            url=u"root:orasql/Installation.html",
771            localkeywords=[u"installation", u"distutils"],
772            hint=(u"How to install ", doc.mod("ll.orasql")),
773        ),
774        crumb=u"ll.orasql",
775        title=u"ll.orasql · Python software · LivingLogic AG",
776        header=u"ll.orasql",
777        subheader=(u"Utilities for working with ", doc.mod("cx_Oracle")),
778        url=u"root:orasql/index.html",
779        localkeywords=[u"Oracle", u"cx_Oracle"],
780        hint=u"Utilities for cx_Oracle",
781        description=u"""
782        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
783        It allows calling Oracle procedures via keyword arguments and it wraps the
784        result of fetch calls in a custom dictionary.
785        """,
786    ),
787    PythonSourcePage(u"nightshade",
788        XISTPage(u"history",
789            crumb=u"History",
790            title=u"ll.nightshade history · Python software · LivingLogic AG",
791            header=u"ll.nightshade history",
792            subheader=u"The development history",
793            url=u"root:nightshade/History.html",
794            localkeywords=[u"packages", u"history", u"changes", u"version"],
795            hint=(u"ChangeLog for ", doc.mod("ll.nightshade")),
796        ),
797        XISTPage(u"installation",
798            crumb=u"Installation",
799            title=u"ll.nightshade installation · Python software · LivingLogic AG",
800            header=u"ll.nightshade installation",
801            subheader=u"Requirements and installation",
802            url=u"root:nightshade/Installation.html",
803            localkeywords=[u"installation", u"distutils"],
804            hint=(u"How to install ", doc.mod("ll.nightshade")),
805        ),
806        XISTPage(u"migration",
807            crumb=u"Migration",
808            title=(u"nightshade migration guide · Python software · LivingLogic AG"),
809            header=(u"nightshade migration"),
810            subheader=(u"How to update your code to new versions of nightshade"),
811            url=u"root:nightshade/Migration.html",
812            localkeywords=[],
813            hint=u"How to update your code to new versions of nightshade",
814        ),
815        crumb=u"ll.nightshade",
816        title=u"ll.nightshade · Python software · LivingLogic AG",
817        header=u"ll.nightshade",
818        subheader=u"Serving the output of Oracle functions/procedures with CherryPy",
819        url=u"root:nightshade/index.html",
820        localkeywords=[u"Oracle", u"cx_Oracle"],
821        hint=u"Serve the output of Oracle functions/procedures with CherryPy",
822        description=u"""
823        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
824        It allows calling Oracle procedures via keyword arguments and it wraps the
825        result of fetch calls in a custom dictionary.
826        """,
827    ),
828    PythonSourcePage(u"aplora",
829        XISTPage(u"history",
830            crumb=u"History",
831            title=u"Aplora history · Python software · LivingLogic AG",
832            header=u"Aplora history",
833            subheader=u"The development history",
834            url=u"root:aplora/History.html",
835            localkeywords=[u"packages", u"history", u"changes", u"version"],
836            hint=(u"ChangeLog for ", doc.mod("aplora")),
837        ),
838        XISTPage(u"installation",
839            crumb=u"Installation",
840            title=u"Aplora requirements, installation and configuration · Python software · LivingLogic AG",
841            header=u"Aplora installation",
842            subheader=u"Requirements, installation and configuration",
843            url=u"root:aplora/Installation.html",
844            localkeywords=[u"installation", u"distutils"],
845            hint=(u"How to install ", doc.mod("aplora")),
846        ),
847        crumb=u"Aplora",
848        title=u"Aplora · Python software · LivingLogic AG",
849        header=u"Aplora",
850        subheader=(u"Logging Apache ", abbr.http(), u" requests to an Oracle database"),
851        url=u"root:aplora/index.html",
852        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
853        hint=u"Logging Apache HTTP requests to an Oracle database",
854        description=u"""
855        ll-aplora is a script that can be used with Apaches piped logging facility
856        to log HTTP request to an Oracle database.
857        """,
858    ),
859    PythonSourcePage(u"pycoco",
860        XISTPage(u"history",
861            crumb=u"History",
862            title=u"Pycoco history · Python software · LivingLogic AG",
863            header=u"Pycoco history",
864            subheader=u"The development history",
865            url=u"root:pycoco/History.html",
866            localkeywords=[u"packages", u"history", u"changes", u"version"],
867            hint=(u"ChangeLog for", doc.mod("pycoco")),
868        ),
869        XISTPage(u"installation",
870            crumb=u"Installation",
871            title=u"Pycoco requirements, installation and configuration · Python software · LivingLogic AG",
872            header=u"Pycoco installation",
873            subheader=u"Requirements, installation and configuration",
874            url=u"root:pycoco/Installation.html",
875            localkeywords=[u"installation", u"distutils"],
876            hint=(u"How to install ", doc.mod("pycoco")),
877        ),
878        crumb=u"Pycoco",
879        title=u"Pycoco · Python software · LivingLogic AG",
880        header=u"Pycoco",
881        subheader=(u"Python code coverage report"),
882        url=u"root:pycoco/index.html",
883        localkeywords=[u"test", u"Python", "code coverage"],
884        hint=u"Python code coverage",
885        description=u"""
886        A script that can be used to generate code coverage info
887        for the Python source code.
888        """,
889    ),
890    XISTPage(u"download",
891        crumb=u"Download",
892        title=u"Download · Python software · LivingLogic AG",
893        header="Downloads",
894        subheader=u"All versions for download",
895        url=u"root:Download.html",
896        localkeywords=[u"download", u"file", u"archive"],
897        hint=u"Links to Windows and Linux, source and binary distributions",
898    ),
899    XISTPage(u"source",
900        crumb=u"Source code",
901        title=u"Source code · Python software · LivingLogic AG",
902        header=u"Source code",
903        subheader=(u"Access to the Mercurial repositories"),
904        url=u"root:Source.html",
905        localkeywords=[u"Mercurial", u"development", u"repository"],
906        hint=u"Access to the Mercurial repositories",
907        description=u"""
908        Provides a link to the Mercurial repositories for all
909        Open Source Python projects by LivingLogic.
910        """
911    ),
912    crumb=u"Python software",
913    title=u"Python software · LivingLogic AG",
914    header=u"Python packages",
915    subheader=u"Python packages and modules by LivingLogic",
916    url=u"root:index.html",
917    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
918    localkeywords=[u"packages", abbr.xist(), u"sisyphus", u"toxic", u"orasql"],
919    hint=u"list of projects",
920    description=u"""
921    LivingLogic provides several Open Source Python packages:
922    XIST, ll-url, ll-make, ll-color, ll-sisyphus, ll-toxic, ll-ul4, ll-orasql
923    """
924)
925
926
927class pageref(xsc.Element):
928    xmlns = xmlns
929    model = sims.NoElements()
930    class Attrs(xsc.Element.Attrs):
931        class ref(xsc.TextAttr): pass
932
933    def convert(self, converter):
934        if "ref" in self.attrs:
935            page = pages[unicode(self.attrs.ref.convert(converter))]
936        else:
937            page = pages
938        e = html.a(self.content, href=page.url, title=page.hint)
939        return e.convert(converter)
940
941
942class download(xsc.Element):
943    xmlns = xmlns
944    model = sims.Empty()
945    class Attrs(xsc.Element.Attrs):
946        class version(xsc.TextAttr): pass
947        class date(xsc.TextAttr): pass
948
949    base = "ssh://root@ftp.livinglogic.de/~ftp/pub/livinglogic/"
950
951    def file(self, converter, u):
952        target = converter.target
953        name = u.file
954        if name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
955            type = "Source"
956        elif name.endswith(".egg"):
957            if "win32" in name:
958                type = "Windows egg"
959            elif "linux" in name:
960                type = "Linux egg"
961            else:
962                type = "Egg"
963            pos = name.rfind("py")
964            if pos >= 0:
965                version = name[pos+2:pos+5]
966                type += " (Python %s)" % version
967        elif name.endswith(".exe"):
968            type = "Windows installer"
969            pos = name.rfind("py")
970            if pos >= 0:
971                version = name[pos+2:-4]
972                type += " (Python %s)" % version
973        elif name.endswith(".src.rpm"):
974            type = "Source RPM"
975        elif name.endswith(".rpm"):
976            type = "Binary RPM"
977        else:
978            type = chars.nbsp()
979
980        href = ("http://ftp.livinglogic.de/", u.relative(self.base))
981        if target.xmlns == doc.xmlns:
982            e = target.li(target.a(unicode(name), href=href), " (", type,")")
983        else:
984            e = html.tr(
985                html.td(html.a(unicode(name), href=href, title=("Download ", href)), class_="file"),
986                html.td(type, class_="type"),
987                html.td(u.size(), class_="size"),
988                class_="download"
989            )
990        return e
991
992    def convert(self, converter):
993        version = str(self.attrs.version.convert(converter))
994        name = converter[downloads].name
995        u = url.URL("%s/%s/" % (self.base, name))
996        files = u/u.files("*-%s[-.][twpz]*" % version)
997        files = (self.file(converter, f) for f in files)
998        target = converter.target
999        if target.xmlns == doc.xmlns:
1000            e = target.section(
1001                target.h("Version ", self.attrs.version, " (released ", self.attrs.date, ")"),
1002                target.ul(files),
1003            )
1004        else:
1005            with xsc.build():
1006                with xsc.Frag() as e:
1007                    with html.tr():
1008                        with html.th(self.attrs.version, class_="version"):
1009                            if "date" in self.attrs:
1010                                xsc.add(" ", html.span("(released ", self.attrs.date, ")", class_="note"))
1011                        +html.th("Type", class_="type")
1012                        +html.th("Bytes", class_="size")
1013                    xsc.add(files)
1014        return e.convert(converter)
1015
1016
1017class downloads(xsc.Element):
1018    xmlns = xmlns
1019    model = sims.Elements(download)
1020    class Attrs(xsc.Element.Attrs):
1021        class name(xsc.TextAttr): pass
1022    class Context(xsc.Element.Context):
1023        pass
1024
1025    def convert(self, converter):
1026        converter[self].name = str(self.attrs.name.convert(converter))
1027        target = converter.target
1028        if target.xmlns == doc.xmlns:
1029            e = self.content
1030        else:
1031            e = html.div(
1032                htmlspecials.plaintable(
1033                    self.content,
1034                    class_="downloads",
1035                ),
1036                align="center"
1037            )
1038        return e.convert(converter)
1039
1040
1041class alldownloads(xsc.Element):
1042    xmlns = xmlns
1043    model = sims.Elements(downloads)
1044
1045    def convert(self, converter):
1046        e = html.div(self.content, class_="alldownloads")
1047        return e.convert(converter)
1048
1049
1050class page(xsc.Element):
1051    xmlns = xmlns
1052    model = sims.Elements(alldownloads, doc.block)
1053    class Attrs(xsc.Element.Attrs):
1054        class refresh(xsc.TextAttr): pass
1055        class path(xsc.TextAttr): pass
1056
1057    def _nodetype(self, path, activepath):
1058        if path[-1] is activepath[-1]:
1059            return "here"
1060        elif path[-1] in activepath:
1061            return "path"
1062        else:
1063            return "other"
1064
1065    def _node(self, path, activepath):
1066        type = self._nodetype(path, activepath)
1067        page = path[-1]
1068        if type == "here":
1069            e = html.div(page.crumb, html.span(page.hint, class_="hint"))
1070            children = True
1071        else:
1072            e = html.a(
1073                page.crumb,
1074                html.span(page.hint, class_="hint"),
1075                href=page.url,
1076                class_=type,
1077            )
1078            children = (type == "path")
1079        if len(path) > 1:
1080            e = html.li(e, class_=type)
1081        else:
1082            e = xsc.Frag(e)
1083        if children:
1084            e.append(self._children(path, activepath))
1085        return e
1086
1087    def _children(self, path, activepath):
1088        return html.ul(self._node(path + [child], activepath) for child in path[-1].getChildren())
1089
1090    def _links(self, context):
1091        return self._node([pages], context.page.getPath())
1092
1093    def _crumbs(self, context):
1094        e = xsc.Frag()
1095        page = context.page
1096        while page is not None:
1097            if page is context.page:
1098                e.insert(0, html.span(page.crumb, class_=u"here"))
1099            else:
1100                e.insert(0, pageref(page.crumb, ref=page.getPathString()))
1101            e.insert(0, u"\xa0\u203a\xa0")
1102            page = page.parent
1103        e.insert(0, html.a(u"Home", href=u"http://www.livinglogic.de/", hreflang=u"de", title=u"The company homepage (in german)"))
1104        return e
1105
1106    def convert(self, converter):
1107        converter[doc.pyref].base = "root:"
1108        target = converter.target
1109        context = converter[self]
1110        context.path = unicode(self["path"].convert(converter))
1111        context.page = pages[context.path]
1112        if target.xmlns == doc.xmlns:
1113            return self.content.convert(converter)
1114        elif not target.xmlns == html.xmlns:
1115            raise ValueError("unknown conversion target %r" % target)
1116        else:
1117            with xsc.build():
1118                with xsc.Frag(xml.XML(), u"\n", target.DocTypeXHTML10transitional(), u"\n") as e:
1119                    with target.html(xml.Attrs(lang=u"en"), lang=u"en"):
1120                        with target.head():
1121                            +meta.contenttype()
1122                            +target.title(context.page.title)
1123                            if context.page.keywords:
1124                                +meta.keywords(xsc.Frag(*context.page.keywords).withsep(", "))
1125                            if context.page.description is not None:
1126                                +meta.description(context.page.description)
1127                            +meta.stylesheet(href="root:main_screen.css", media=u"screen, projection, tv")
1128                            +meta.stylesheet(href="root:main_print.css", media=u"print")
1129                            +meta.author(name=u"Walter Dörwald", email=u"walter.doerwald@livinglogic.de")
1130                            icbm = u"49.9550; 11.5909"
1131                            +html.meta(name=u"icbm", content=icbm)
1132                            +html.meta(name=u"geo.position", content=icbm)
1133                            +html.meta(name=u"geo.placename", content=u"Bayreuth, Germany, Europe")
1134                            +html.meta(name=u"geo.region", content=u"DE-BY")
1135                            +html.meta(name=u"DC.title", content=context.page.title)
1136                            +html.link(rel=u"icon", href=u"root:images/favicon.gif", type=u"image/gif")
1137                            top = context.page.getRoot()
1138                            if top is not None and top != context.page:
1139                                +html.link(rel="top", href=top.url)
1140                            parent = context.page.parent
1141                            if parent is not None:
1142                                +html.link(rel="up", href=parent.url)
1143                            firstsibling = context.page.getFirstSibling()
1144                            if firstsibling is not None and firstsibling != context.page:
1145                                +html.link(rel="first", title="First page in set", href=firstsibling.url)
1146                            prevsibling = context.page.getPrevSibling()
1147                            if prevsibling is not None and prevsibling != context.page:
1148                                +html.link(rel="prev", title="Previous page", href=prevsibling.url)
1149                            nextsibling = context.page.getNextSibling()
1150                            if nextsibling is not None and nextsibling != context.page:
1151                                +html.link(rel="next", title="Next page", href=nextsibling.url)
1152                            lastsibling = context.page.getLastSibling()
1153                            if lastsibling is not None and lastsibling != context.page:
1154                                +html.link(rel="last", title="Last page in set", href=lastsibling.url)
1155                            for link in context.page.alternates():
1156                                +html.link(link.attrs)
1157                            if "refresh" in self.attrs:
1158                                +html.meta(http_equiv="refresh", content=self.attrs.refresh)
1159
1160                        with target.body():
1161                            with html.div(class_="header"):
1162                                if context.page.header:
1163                                    +html.h1(context.page.header)
1164                                if context.page.subheader:
1165                                    +html.h2(context.page.subheader)
1166                            with html.div(class_="crumbs"):
1167                                with htmlspecials.plaintable(width="100%"):
1168                                    with html.tr(valign="middle"):
1169                                        +html.td(self._crumbs(context), class_="crumbs")
1170                                        +html.td(xsc.Frag(context.page.alternates()).withsep(u"\xa0\xb7\xa0"), align="right", class_="alternate")
1171                            with html.div(class_="body"):
1172                                +html.div(self._links(context), class_="links")
1173                                +html.div(self.content, class_="content")
1174        return e.convert(converter)
Note: See TracBrowser for help on using the browser.