root/livinglogic.python.www/site/Python_xmlns.py @ 602:1020b1bcbe6e

Revision 602:1020b1bcbe6e, 40.9 KB (checked in by Walter Doerwald <walter@…>, 11 years ago)

More markup for hints.

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"Module with classes for parsing files",
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("aplora")),
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        XISTPage(u"old",
892            crumb=u"Old download",
893            title=u"Old downloads · Python software · LivingLogic AG",
894            header=u"Old downloads",
895            subheader=u"Download old modules as separate distributions",
896            url=u"root:OldDownload.html",
897            localkeywords=[u"download", u"file", u"archive"],
898            hint=u"Links to older distributions",
899        ),
900        crumb=u"Download",
901        title=u"Download · Python software · LivingLogic AG",
902        header="Downloads",
903        subheader=u"All versions for download",
904        url=u"root:Download.html",
905        localkeywords=[u"download", u"file", u"archive"],
906        hint=u"Links to Windows and Linux, source and binary distributions",
907    ),
908    XISTPage(u"source",
909        crumb=u"Source code",
910        title=u"Source code · Python software · LivingLogic AG",
911        header=u"Source code",
912        subheader=(u"Access to the Mercurial repositories"),
913        url=u"root:Source.html",
914        localkeywords=[u"Mercurial", u"development", u"repository"],
915        hint=u"Access to the Mercurial repositories",
916        description=u"""
917        Provides a link to the Mercurial repositories for all
918        Open Source Python projects by LivingLogic.
919        """
920    ),
921    crumb=u"Python software",
922    title=u"Python software · LivingLogic AG",
923    header=u"Python packages",
924    subheader=u"Python packages and modules by LivingLogic",
925    url=u"root:index.html",
926    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
927    localkeywords=[u"packages", abbr.xist(), u"sisyphus", u"toxic", u"orasql"],
928    hint=u"list of projects",
929    description=u"""
930    LivingLogic provides several Open Source Python packages:
931    XIST, ll-url, ll-make, ll-color, ll-sisyphus, ll-toxic, ll-ul4, ll-orasql
932    """
933)
934
935
936class pageref(xsc.Element):
937    xmlns = xmlns
938    model = sims.NoElements()
939    class Attrs(xsc.Element.Attrs):
940        class ref(xsc.TextAttr): pass
941
942    def convert(self, converter):
943        if "ref" in self.attrs:
944            page = pages[unicode(self.attrs.ref.convert(converter))]
945        else:
946            page = pages
947        e = html.a(self.content, href=page.url, title=page.hint)
948        return e.convert(converter)
949
950
951class download(xsc.Element):
952    xmlns = xmlns
953    model = sims.Empty()
954    class Attrs(xsc.Element.Attrs):
955        class version(xsc.TextAttr): pass
956        class date(xsc.TextAttr): pass
957
958    base = "ssh://root@ftp.livinglogic.de/~ftp/pub/livinglogic/"
959
960    def file(self, converter, u):
961        target = converter.target
962        name = u.file
963        if name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
964            type = "Source"
965        elif name.endswith(".egg"):
966            if "win32" in name:
967                type = "Windows egg"
968            elif "linux" in name:
969                type = "Linux egg"
970            else:
971                type = "Egg"
972            pos = name.rfind("py")
973            if pos >= 0:
974                version = name[pos+2:pos+5]
975                type += " (Python %s)" % version
976        elif name.endswith(".exe"):
977            type = "Windows installer"
978            pos = name.rfind("py")
979            if pos >= 0:
980                version = name[pos+2:-4]
981                type += " (Python %s)" % version
982        elif name.endswith(".src.rpm"):
983            type = "Source RPM"
984        elif name.endswith(".rpm"):
985            type = "Binary RPM"
986        else:
987            type = chars.nbsp()
988
989        href = ("http://ftp.livinglogic.de/", u.relative(self.base))
990        if target.xmlns == doc.xmlns:
991            e = target.li(target.a(unicode(name), href=href), " (", type,")")
992        else:
993            e = html.tr(
994                html.td(html.a(unicode(name), href=href, title=("Download ", href)), class_="file"),
995                html.td(type, class_="type"),
996                html.td(u.size(), class_="size"),
997                class_="download"
998            )
999        return e
1000
1001    def convert(self, converter):
1002        version = str(self.attrs.version.convert(converter))
1003        name = converter[downloads].name
1004        u = url.URL("%s/%s/" % (self.base, name))
1005        files = u/u.files("*-%s[-.][twpz]*" % version)
1006        files = (self.file(converter, f) for f in files)
1007        target = converter.target
1008        if target.xmlns == doc.xmlns:
1009            e = target.section(
1010                target.h("Version ", self.attrs.version, " (released ", self.attrs.date, ")"),
1011                target.ul(files),
1012            )
1013        else:
1014            with xsc.build():
1015                with xsc.Frag() as e:
1016                    with html.tr():
1017                        with html.th(self.attrs.version, class_="version"):
1018                            if "date" in self.attrs:
1019                                xsc.add(" ", html.span("(released ", self.attrs.date, ")", class_="note"))
1020                        +html.th("Type", class_="type")
1021                        +html.th("Bytes", class_="size")
1022                    xsc.add(files)
1023        return e.convert(converter)
1024
1025
1026class downloads(xsc.Element):
1027    xmlns = xmlns
1028    model = sims.Elements(download)
1029    class Attrs(xsc.Element.Attrs):
1030        class name(xsc.TextAttr): pass
1031    class Context(xsc.Element.Context):
1032        pass
1033
1034    def convert(self, converter):
1035        converter[self].name = str(self.attrs.name.convert(converter))
1036        target = converter.target
1037        if target.xmlns == doc.xmlns:
1038            e = self.content
1039        else:
1040            e = html.div(
1041                htmlspecials.plaintable(
1042                    self.content,
1043                    class_="downloads",
1044                ),
1045                align="center"
1046            )
1047        return e.convert(converter)
1048
1049
1050class alldownloads(xsc.Element):
1051    xmlns = xmlns
1052    model = sims.Elements(downloads)
1053
1054    def convert(self, converter):
1055        e = html.div(self.content, class_="alldownloads")
1056        return e.convert(converter)
1057
1058
1059class page(xsc.Element):
1060    xmlns = xmlns
1061    model = sims.Elements(alldownloads, doc.block)
1062    class Attrs(xsc.Element.Attrs):
1063        class refresh(xsc.TextAttr): pass
1064        class path(xsc.TextAttr): pass
1065
1066    def _nodetype(self, path, activepath):
1067        if path[-1] is activepath[-1]:
1068            return "here"
1069        elif path[-1] in activepath:
1070            return "path"
1071        else:
1072            return "other"
1073
1074    def _node(self, path, activepath):
1075        type = self._nodetype(path, activepath)
1076        page = path[-1]
1077        if type == "here":
1078            e = html.div(page.crumb, html.span(page.hint, class_="hint"))
1079            children = True
1080        else:
1081            e = html.a(
1082                html.span(u"\u2713", class_=u"visited", title=u"You have already visited that page"),
1083                page.crumb,
1084                html.span(page.hint, class_="hint"),
1085                href=page.url,
1086                class_=type,
1087            )
1088            children = (type == "path")
1089        if len(path) > 1:
1090            e = html.li(e, class_=type)
1091        else:
1092            e = xsc.Frag(e)
1093        if children:
1094            e.append(self._children(path, activepath))
1095        return e
1096
1097    def _children(self, path, activepath):
1098        return html.ul(self._node(path + [child], activepath) for child in path[-1].getChildren())
1099
1100    def _links(self, context):
1101        return self._node([pages], context.page.getPath())
1102
1103    def _crumbs(self, context):
1104        e = xsc.Frag()
1105        page = context.page
1106        while page is not None:
1107            if page is context.page:
1108                e.insert(0, html.span(page.crumb, class_=u"here"))
1109            else:
1110                e.insert(0, pageref(page.crumb, ref=page.getPathString()))
1111            e.insert(0, u"\xa0\u203a\xa0")
1112            page = page.parent
1113        e.insert(0, html.a(u"Home", href=u"http://www.livinglogic.de/", hreflang=u"de", title=u"The company homepage (in german)"))
1114        return e
1115
1116    def convert(self, converter):
1117        converter[doc.pyref].base = "root:"
1118        target = converter.target
1119        context = converter[self]
1120        context.path = unicode(self["path"].convert(converter))
1121        context.page = pages[context.path]
1122        if target.xmlns == doc.xmlns:
1123            return self.content.convert(converter)
1124        elif not target.xmlns == html.xmlns:
1125            raise ValueError("unknown conversion target %r" % target)
1126        else:
1127            with xsc.build():
1128                with xsc.Frag(xml.XML(), u"\n", target.DocTypeXHTML10transitional(), u"\n") as e:
1129                    with target.html(xml.Attrs(lang=u"en"), lang=u"en"):
1130                        with target.head():
1131                            +meta.contenttype()
1132                            +target.title(context.page.title)
1133                            if context.page.keywords:
1134                                +meta.keywords(xsc.Frag(*context.page.keywords).withsep(", "))
1135                            if context.page.description is not None:
1136                                +meta.description(context.page.description)
1137                            +meta.stylesheet(href="root:main_screen.css", media=u"screen, projection, tv")
1138                            +meta.stylesheet(href="root:main_print.css", media=u"print")
1139                            +meta.author(name=u"Walter Dörwald", email=u"walter.doerwald@livinglogic.de")
1140                            icbm = u"49.9550; 11.5909"
1141                            +html.meta(name=u"icbm", content=icbm)
1142                            +html.meta(name=u"geo.position", content=icbm)
1143                            +html.meta(name=u"geo.placename", content=u"Bayreuth, Germany, Europe")
1144                            +html.meta(name=u"geo.region", content=u"DE-BY")
1145                            +html.meta(name=u"DC.title", content=context.page.title)
1146                            +html.link(rel=u"icon", href=u"root:images/favicon.gif", type=u"image/gif")
1147                            top = context.page.getRoot()
1148                            if top is not None and top != context.page:
1149                                +html.link(rel="top", href=top.url)
1150                            parent = context.page.parent
1151                            if parent is not None:
1152                                +html.link(rel="up", href=parent.url)
1153                            firstsibling = context.page.getFirstSibling()
1154                            if firstsibling is not None and firstsibling != context.page:
1155                                +html.link(rel="first", title="First page in set", href=firstsibling.url)
1156                            prevsibling = context.page.getPrevSibling()
1157                            if prevsibling is not None and prevsibling != context.page:
1158                                +html.link(rel="prev", title="Previous page", href=prevsibling.url)
1159                            nextsibling = context.page.getNextSibling()
1160                            if nextsibling is not None and nextsibling != context.page:
1161                                +html.link(rel="next", title="Next page", href=nextsibling.url)
1162                            lastsibling = context.page.getLastSibling()
1163                            if lastsibling is not None and lastsibling != context.page:
1164                                +html.link(rel="last", title="Last page in set", href=lastsibling.url)
1165                            for link in context.page.alternates():
1166                                +html.link(link.attrs)
1167                            if "refresh" in self.attrs:
1168                                +html.meta(http_equiv="refresh", content=self.attrs.refresh)
1169
1170                        with target.body():
1171                            with htmlspecials.plaintable(width="100%", class_="body"):
1172                                with html.tr(valign="bottom", class_="header"):
1173                                    +html.td(htmlspecials.pixel(height=150), class_="header1", width="20%")
1174                                    with html.td(class_="header2", width="79%"):
1175                                        if context.page.header:
1176                                            +html.h1(context.page.header)
1177                                        if context.page.subheader:
1178                                            +html.h2(context.page.subheader)
1179                                with html.tr(class_="crumbs"):
1180                                    +html.td(htmlspecials.pixel(), class_="crumbs1")
1181                                    with html.td(class_="crumbs2"):
1182                                        with htmlspecials.plaintable(width="100%"):
1183                                            with html.tr(valign="middle"):
1184                                                +html.td(self._crumbs(context), class_="crumbs")
1185                                                +html.td(xsc.Frag(context.page.alternates()).withsep(u"\xa0\xb7\xa0"), align="right", class_="alternate")
1186                                with html.tr(valign="top", class_="content"):
1187                                    +html.td(htmlspecials.pixel(width=300), self._links(context), rowspan=2, class_="links"),
1188                                    +html.td(self.content, class_="content")
1189        return e.convert(converter)
Note: See TracBrowser for help on using the browser.