root/livinglogic.python.www/site/Python_xmlns.py @ 663:0c5d6dba114d

Revision 663:0c5d6dba114d, 48.7 KB (checked in by Walter Doerwald <walter@…>, 8 years ago)

Add pages for orasql scripts.

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, parse
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"parse",
521            crumb=u"parse",
522            title=(abbr.xist(), u".parse · Python software · LivingLogic AG"),
523            header=(abbr.xist(), u".parse"),
524            subheader=(u"Tools for parsing ", abbr.xml(), " from various sources"),
525            url=u"root:xist/parse/index.html",
526            hint=u"Parsing XML",
527        ),
528        PythonSourcePage(u"present",
529            crumb=u"present",
530            title=(abbr.xist(), u".present · Python software · LivingLogic AG"),
531            header=(abbr.xist(), u".present"),
532            subheader=u"Module with classes for printing trees",
533            url=u"root:xist/present/index.html",
534            hint=u"Screen output of XML trees",
535        ),
536        PythonSourcePage(u"sims",
537            crumb=u"sims",
538            title=(abbr.xist(), u".sims · Python software · LivingLogic AG"),
539            header=(abbr.xist(), u".sims"),
540            subheader=u"Simple schema validation",
541            url=u"root:xist/sims/index.html",
542            hint=u"Simple schema validation",
543        ),
544        PythonSourcePage(u"xfind",
545            crumb=u"xfind",
546            title=(abbr.xist(), u".xfind · Python software · LivingLogic AG"),
547            header=(abbr.xist(), u".xfind"),
548            subheader=u"Tree iteration and filtering",
549            url=u"root:xist/xfind/index.html",
550            hint=u"Tree iteration and filtering",
551        ),
552        PythonSourcePage(u"css",
553            crumb=u"css",
554            title=(abbr.xist(), u".css · Python software · LivingLogic AG"),
555            header=(abbr.xist(), u".css"),
556            subheader=(abbr.css(), " related funtions"),
557            url=u"root:xist/css/index.html",
558            hint=u"CSS related functions",
559        ),
560        PythonSourcePage(u"scripts",
561            PythonSourcePage(u"dtd2xsc",
562                crumb=u"dtd2xsc",
563                title=u"ll.xist.scripts.dtd2xsc · Python software · LivingLogic AG",
564                header=u"ll.xist.scripts.dtd2xsc",
565                subheader=u"Script for converting DTDs to XIST namespaces",
566                url=u"root:xist/scripts/dtd2xsc.html",
567                inheritablekeywords=[u"DTD"],
568                hint=u"Script for converting DTDs to XIST namespaces",
569                description=u"""
570                dtd2xsc creates a skeleton XIST namespace module from one or more DTDs.
571                """,
572            ),
573            PythonSourcePage(u"xml2xsc",
574                crumb=u"xml2xsc",
575                title=u"ll.xist.scripts.xml2xsc · Python software · LivingLogic AG",
576                header=u"ll.xist.scripts.xml2xsc",
577                subheader=u"Script for creating an XIST namespace from XML files",
578                url=u"root:xist/scripts/xml2xsc.html",
579                inheritablekeywords=[u"XML"],
580                hint=u"Script for creating an XIST namespace from XML files",
581                description=u"""
582                xml2xsc creates a skeleton XIST namespace module from several XML files.
583                """,
584            ),
585            PythonSourcePage(u"tld2xsc",
586                crumb=u"tld2xsc",
587                title=u"ll.xist.scripts.tld2xsc · Python software · LivingLogic AG",
588                header=u"ll.xist.scripts.tld2xsc",
589                subheader=u"Script for converting a Java tag library description XML file to an XIST namespace",
590                url=u"root:xist/scripts/tld2xsc.html",
591                inheritablekeywords=[u"TLD", "Java", "taglib"],
592                hint=u"Script for converting a Java tag library description XML file to an XIST namespace",
593                description=u"""
594                tld2xsc creates a skeleton XIST namespace from a Java tag library description XML file.
595                """,
596            ),
597            PythonSourcePage(u"doc2txt",
598                crumb=u"doc2txt",
599                title=u"ll.xist.scripts.doc2txt · Python software · LivingLogic AG",
600                header=u"ll.xist.scripts.doc2txt",
601                subheader=u"Script for creating a plain text file from an XIST doc XML file",
602                url=u"root:xist/scripts/doc2txt.html",
603                inheritablekeywords=[u"doc"],
604                hint=u"Script for creating a plain text file from an XIST doc XML file",
605                description=u"""
606                doc2txt creates a plain text file from a XML file using XISTs doc
607                XML vocabulary.
608                """,
609            ),
610            crumb=u"scripts",
611            title=u"ll.xist.scripts · Python software · LivingLogic AG",
612            header=u"ll.xist.scripts",
613            subheader=u"Scripts for text conversion and creating XIST namespaces",
614            url=u"root:xist/scripts/index.html",
615            inheritablekeywords=[u"script", "XIST"],
616            localkeywords=[u"xnd", "namespace"],
617            hint=u"Scripts for text conversion and creating XIST namespaces",
618            description=u"""
619            ll.xist.scripts is a Python package that contains the scripts dtd2xsc,
620            xml2xsc, tld2xsc and doc2txt.
621            """,
622        ),
623        XISTPage(u"history",
624            XISTPage(u"old",
625                crumb=u"Old history",
626                title=u"Old history · Python software · LivingLogic AG",
627                header=u"Old history",
628                subheader=u"The history before distribution restructuring",
629                url=u"root:xist/OldHistory.html",
630                localkeywords=[u"history", u"changes", u"version"],
631                hint=(u"Old ChangeLog for modules merged into ", abbr.xist()),
632            ),
633            crumb=u"History",
634            title=(abbr.xist(), u" history · Python software · LivingLogic AG"),
635            header=(abbr.xist(), u" history"),
636            subheader=u"The development history",
637            url=u"root:xist/History.html",
638            localkeywords=[u"history", u"changes", u"version"],
639            hint=("ChangeLog for ", abbr.xist()),
640        ),
641        XISTPage(u"installation",
642            crumb=u"Installation",
643            title=(abbr.xist(), u" requirements and installation · Python software · LivingLogic AG"),
644            header=(abbr.xist(), u" installation"),
645            subheader=u"Requirements, installation and configuration",
646            url=u"root:xist/Installation.html",
647            localkeywords=[u"installation", u"distutils"],
648            hint=("How to install and configure ", abbr.xist()),
649        ),
650        XISTPage(u"migration",
651            XISTPage(u"old",
652                crumb=u"Old migration info",
653                title=u"Old migration info · Python software · LivingLogic AG",
654                header=u"Old migration info",
655                subheader=u"Migration infomation for old versions before distribution restructuring",
656                url=u"root:xist/OldMigration.html",
657                localkeywords=[u"history", u"changes", u"version"],
658                hint=u"Old migration info",
659            ),
660            crumb=u"Migration",
661            title=(abbr.xist(), u" migration guide · Python software · LivingLogic AG"),
662            header=(abbr.xist(), u" migration"),
663            subheader=(u"How to update your code to new versions of ", abbr.xist()),
664            url=u"root:xist/Migration.html",
665            localkeywords=[],
666            hint=(u"How to update your code to new versions of ", abbr.xist()),
667        ),
668        XISTPage(u"mailinglists",
669            crumb=u"Mailing lists",
670            title=(abbr.xist(), u" mailing lists · Python software · LivingLogic AG"),
671            header=(abbr.xist(), u" mailing lists"),
672            subheader=u"How to subscribe to the mailing lists",
673            url=u"root:xist/Mailinglists.html",
674            localkeywords=[u"mailing list", u"list", u"posting", u"discussion", u"announcement"],
675            hint=(u"How to subscribe to the ", abbr.xist(), " mailing lists"),
676        ),
677        crumb="ll.xist",
678        title=(abbr.xist(), u" · Python software · LivingLogic AG"),
679        header=abbr.xist(),
680        subheader=(u"An extensible ", abbr.html(), u"/", abbr.xml(), u" generator"),
681        url=u"root:xist/index.html",
682        inheritablekeywords=[abbr.xist(), abbr.xml(), u"transformation", abbr.xsl(), u"hsc"],
683        hint=u"An extensible XML/HTML generator",
684        description=u"""
685        XIST is an extensible HTML/XML generator written in Python. XIST is also a
686        DOM parser (built on top of SAX2) with a very simple and pythonesque tree
687        API. Every XML element type corresponds to a Python class and these Python
688        classes provide a conversion method to transform the XML tree (e.g. into
689        HTML). XIST can be considered 'object oriented XSL'.
690        """,
691    ),
692    PythonSourcePage(u"ul4",
693        XISTPage(u"howto",
694            crumb=u"Howto",
695            title=u"ll.ul4c howto · Python software · LivingLogic AG",
696            header=u"ll.ul4c documentation",
697            subheader=u"How to use UL4",
698            url=u"root:ul4c/Howto.html",
699            localkeywords=[],
700            hint=u"How to use UL4",
701        ),
702        crumb=u"ll.ul4c",
703        title=u"ll.ul4c · Python software · LivingLogic AG",
704        header=u"ll.ul4c",
705        subheader=(u"Crossplatform templating language"),
706        url=u"root:ul4c/index.html",
707        hint=u"A templating language",
708        description=u"""
709        ll.ul4c provides a crossplatform templating language.
710        """,
711    ),
712    PythonSourcePage(u"url",
713        XISTPage(u"howto",
714            crumb=u"Howto",
715            title=u"ll.url howto · Python software · LivingLogic AG",
716            header=u"ll.url documentation",
717            subheader=u"Special features of URL",
718            url=u"root:url/Howto.html",
719            localkeywords=[],
720            hint=u"Special features of URL",
721        ),
722        crumb=u"ll.url",
723        title=u"ll.url · Python software · LivingLogic AG",
724        header=u"ll.url",
725        subheader=(u"Module implementing ", abbr.url(), u"s"),
726        url=u"root:url/index.html",
727        hint=u"RFC 2396 compliant URLs",
728        description=u"""
729        ll.url is a Python module that provides classes for parsing and
730        constructing RFC 2396 compliant URLs.
731        """,
732    ),
733    PythonSourcePage(u"make",
734        crumb=u"ll.make",
735        title=u"ll.make · Python software · LivingLogic AG",
736        header=u"ll.make",
737        subheader=u"Object oriented make replacement",
738        url=u"root:make/index.html",
739        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
740        hint=u"Object oriented make replacement",
741        description=u"""
742        ll.make is a Python module that provides an object oriented make replacement.
743        Like make it allows you to specify dependencies between files and actions
744        to be executed when files don't exist or are out of date with respect to
745        one of their sources. But unlike make you can do this in a object oriented
746        way and targets are not only limited to files, but you can implement
747        e.g. dependencies on database records.
748        """,
749    ),
750    PythonSourcePage(u"daemon",
751        crumb=u"ll.daemon",
752        title=u"ll.daemon · Python software · LivingLogic AG",
753        header=u"ll.daemon",
754        subheader=u"Forking daemon processes with Python",
755        url=u"root:daemon/index.html",
756        inheritablekeywords=[u"daemon", u"fork", u"process"],
757        hint=u"Forking daemon processes",
758        description=u"""
759        ll.daemon is a Python module that can be used on UNIX to fork a daemon process.
760        """,
761    ),
762    PythonSourcePage(u"sisyphus",
763        crumb=u"ll.sisyphus",
764        title=u"ll.sisyphus · Python software · LivingLogic AG",
765        header=u"ll.sisyphus",
766        subheader=u"Writing cron jobs with Python",
767        url=u"root:sisyphus/index.html",
768        inheritablekeywords=[u"packages", u"Sisyphus", u"cron", u"job"],
769        hint=u"Writing cron jobs with Python",
770        description=u"""
771        ll.sisyphus is a Python module that simplifies writing Python scripts
772        that run as cron jobs.
773        """,
774    ),
775    PythonSourcePage(u"color",
776        crumb=u"ll.color",
777        title=u"ll.color · Python software · LivingLogic AG",
778        header=u"ll.color",
779        subheader=u"RGB color values and color model conversion",
780        url=u"root:color/index.html",
781        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"],
782        hint=u"RGB color values and color model conversion",
783        description=u"""
784        ll.color is a Python module that provides classes and functions for handling
785        RGB color values. This includes the ability to convert between different
786        color models (RGB, HSV, HLS) as well as to and from CSS format, and several
787        functions for modifying and mixing colors.
788        """,
789    ),
790    PythonSourcePage(u"misc",
791        crumb=u"ll.misc",
792        title=u"ll.misc · Python software · LivingLogic AG",
793        header=u"ll.misc",
794        subheader=u"Miscellaneous utility functions and classes",
795        url=u"root:misc/index.html",
796        localkeywords=[u"utilities", u"decorator", u"property", u"module", u"namespace"],
797        hint=u"Misc utility functions and classes",
798        description=u"""
799        ll.misc provides serveral utility classes and functions.
800        """,
801    ),
802    PythonSourcePage(u"orasql",
803        PythonSourcePage(u"scripts",
804            PythonSourcePage(u"oracreate",
805                crumb=u"oracreate",
806                title=u"ll.orasql.scripts.oracreate · Python software · LivingLogic AG",
807                header=u"ll.orasql.scripts.oracreate",
808                subheader=u"Script for printing an Oracle schema definition",
809                url=u"root:orasql/scripts/oracreate.html",
810                inheritablekeywords=["DDL"],
811                hint=u"Script for printing an Oracle schema definition",
812                description=u"""
813                oracreate is a script for printing an Oracle schema definition.
814                """,
815            ),
816            PythonSourcePage(u"oradrop",
817                crumb=u"oradrop",
818                title=u"ll.orasql.scripts.oradrop · Python software · LivingLogic AG",
819                header=u"ll.orasql.scripts.oradrop",
820                subheader=u"Script for deleting an Oracle schema definition",
821                url=u"root:orasql/scripts/oradrop.html",
822                inheritablekeywords=["DDL"],
823                hint=u"Script for deleting an Oracle schema definition",
824                description=u"""
825                oradrop is a script for deleting an Oracle schema definition.
826                """,
827            ),
828            PythonSourcePage(u"oradelete",
829                crumb=u"oradelete",
830                title=u"ll.orasql.scripts.oradelete · Python software · LivingLogic AG",
831                header=u"ll.orasql.scripts.oradelete",
832                subheader=u"Script for deleting all records from all tables in an Oracle database",
833                url=u"root:orasql/scripts/oradelete.html",
834                inheritablekeywords=["delete"],
835                hint=u"Script for deleting all records from all tables in an Oracle database",
836                description=u"""
837                oradelete is a script for deleting all records from all tables in an
838                Oracle database.
839                """,
840            ),
841            PythonSourcePage(u"oragrant",
842                crumb=u"oragrant",
843                title=u"ll.orasql.scripts.oragrant · Python software · LivingLogic AG",
844                header=u"ll.orasql.scripts.oragrant",
845                subheader=u"Script for printing access permissions for an Oracle database",
846                url=u"root:orasql/scripts/oragrant.html",
847                inheritablekeywords=["grant"],
848                hint=u"Script for printing access permissions for an Oracle database",
849                description=u"""
850                orafind is a script for printing access permissions for an Oracle database.
851                """,
852            ),
853            PythonSourcePage(u"orafind",
854                crumb=u"orafind",
855                title=u"ll.orasql.scripts.orafind · Python software · LivingLogic AG",
856                header=u"ll.orasql.scripts.orafind",
857                subheader=u"Script for finding records in an Oracle database",
858                url=u"root:orasql/scripts/orafind.html",
859                inheritablekeywords=["find", "regexp", "regular expression"],
860                hint=u"Script for finding records in an Oracle database",
861                description=u"""
862                orafind is a script for finding records in an Oracle database.
863                """,
864            ),
865            PythonSourcePage(u"oradiff",
866                crumb=u"oradiff",
867                title=u"ll.orasql.scripts.oradiff · Python software · LivingLogic AG",
868                header=u"ll.orasql.scripts.oradiff",
869                subheader=u"Script for diffing two Oracle database schemas",
870                url=u"root:orasql/scripts/oradiff.html",
871                inheritablekeywords=["diff"],
872                hint=u"Script for diffing two Oracle database schemas",
873                description=u"""
874                oradiff is a script for finding the differences between to Oracle
875                database schemas.
876                """,
877            ),
878            PythonSourcePage(u"oramerge",
879                crumb=u"oramerge",
880                title=u"ll.orasql.scripts.oramerge · Python software · LivingLogic AG",
881                header=u"ll.orasql.scripts.oramerge",
882                subheader=u"Script for merging Oracle database schemas",
883                url=u"root:orasql/scripts/oramerge.html",
884                inheritablekeywords=["merge"],
885                hint=u"Script for merging Oracle database schemas",
886                description=u"""
887                oramerge is a script that can be used for merging the changes between
888                two Oracle database schemas into a third one.
889                """,
890            ),
891            crumb=u"scripts",
892            title=u"ll.orasql.scripts · Python software · LivingLogic AG",
893            header=u"ll.orasql.scripts",
894            subheader=u"Scripts for working with Oracle databases",
895            url=u"root:orasql/scripts/index.html",
896            inheritablekeywords=[u"script"],
897            localkeywords=[u"xnd", "namespace"],
898            hint=u"Scripts for working with Oracle databases",
899            description=u"""
900            ll.orasql.scripts is a Python package that contains the scripts oracreate,
901            oradrop, oradelete, orafind, oradiff and oramerge.
902            """,
903        ),
904        XISTPage(u"history",
905            crumb=u"History",
906            title=u"ll.orasql history · Python software · LivingLogic AG",
907            header=u"ll.orasql history",
908            subheader=u"The development history",
909            url=u"root:orasql/History.html",
910            localkeywords=[u"packages", u"history", u"changes", u"version"],
911            hint=(u"ChangeLog for ", doc.mod("ll.orasql")),
912        ),
913        XISTPage(u"installation",
914            crumb=u"Installation",
915            title=u"ll.orasql installation · Python software · LivingLogic AG",
916            header=u"ll.orasql installation",
917            subheader=u"Requirements and installation",
918            url=u"root:orasql/Installation.html",
919            localkeywords=[u"installation", u"distutils"],
920            hint=(u"How to install ", doc.mod("ll.orasql")),
921        ),
922        crumb=u"ll.orasql",
923        title=u"ll.orasql · Python software · LivingLogic AG",
924        header=u"ll.orasql",
925        subheader=(u"Utilities for working with ", doc.mod("cx_Oracle")),
926        url=u"root:orasql/index.html",
927        inheritablekeywords=[u"Oracle", u"cx_Oracle"],
928        hint=u"Utilities for cx_Oracle",
929        description=u"""
930        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
931        It allows calling Oracle procedures via keyword arguments and it wraps the
932        result of fetch calls in a custom dictionary.
933        """,
934    ),
935    PythonSourcePage(u"nightshade",
936        XISTPage(u"history",
937            crumb=u"History",
938            title=u"ll.nightshade history · Python software · LivingLogic AG",
939            header=u"ll.nightshade history",
940            subheader=u"The development history",
941            url=u"root:nightshade/History.html",
942            localkeywords=[u"packages", u"history", u"changes", u"version"],
943            hint=(u"ChangeLog for ", doc.mod("ll.nightshade")),
944        ),
945        XISTPage(u"installation",
946            crumb=u"Installation",
947            title=u"ll.nightshade installation · Python software · LivingLogic AG",
948            header=u"ll.nightshade installation",
949            subheader=u"Requirements and installation",
950            url=u"root:nightshade/Installation.html",
951            localkeywords=[u"installation", u"distutils"],
952            hint=(u"How to install ", doc.mod("ll.nightshade")),
953        ),
954        XISTPage(u"migration",
955            crumb=u"Migration",
956            title=(u"nightshade migration guide · Python software · LivingLogic AG"),
957            header=(u"nightshade migration"),
958            subheader=(u"How to update your code to new versions of nightshade"),
959            url=u"root:nightshade/Migration.html",
960            localkeywords=[],
961            hint=u"How to update your code to new versions of nightshade",
962        ),
963        crumb=u"ll.nightshade",
964        title=u"ll.nightshade · Python software · LivingLogic AG",
965        header=u"ll.nightshade",
966        subheader=u"Serving the output of Oracle functions/procedures with CherryPy",
967        url=u"root:nightshade/index.html",
968        localkeywords=[u"Oracle", u"cx_Oracle"],
969        hint=u"Serve the output of Oracle functions/procedures with CherryPy",
970        description=u"""
971        ll.orasql is a Python module that provides utilities for working with cx_Oracle:
972        It allows calling Oracle procedures via keyword arguments and it wraps the
973        result of fetch calls in a custom dictionary.
974        """,
975    ),
976    PythonSourcePage(u"scripts",
977        PythonSourcePage(u"db2ul4",
978            crumb=u"db2ul4",
979            title=u"ll.scripts.db2ul4 · Python software · LivingLogic AG",
980            header=u"ll.scripts.db2ul4",
981            subheader=u"Script for rendering UL4 templates with database content",
982            url=u"root:scripts/db2ul4.html",
983            inheritablekeywords=[u"UL4", "template", "database"],
984            hint=u"Script for rendering UL4 templates with database content",
985            description=u"""
986            db2ul4 renders an UL4 template. The available template variables
987            allow system command and database access. Supported databases are
988            Oracle, sqllite and MySQL.
989            """,
990        ),
991        PythonSourcePage(u"uls",
992            crumb=u"uls",
993            title=u"ll.scripts.uls · Python software · LivingLogic AG",
994            header=u"ll.scripts.uls",
995            subheader=u"Script for listing directory contents of URLs",
996            url=u"root:scripts/uls.html",
997            inheritablekeywords=[u"uls"],
998            hint=u"Script for listing directory contents of URLs",
999            description=u"""
1000            uls is a script that lists directory contents. It is an URL-enabled version
1001            of the ls system command. Via ll.url and ll.orasql uls supports
1002            ssh and oracle URLs too.
1003            """,
1004        ),
1005        PythonSourcePage(u"ucp",
1006            crumb=u"ucp",
1007            title=u"ll.scripts.ucp · Python software · LivingLogic AG",
1008            header=u"ll.scripts.ucp",
1009            subheader=u"Script for copying files/directories",
1010            url=u"root:scripts/ucp.html",
1011            inheritablekeywords=[u"ucp"],
1012            hint=u"Script for copying files/directories",
1013            description=u"""
1014            ucp is a script that copies files/directory contents. It is an URL-enabled
1015            version of the cp system command. Via ll.url and ll.orasql ucp supports
1016            ssh and oracle URLs too.
1017            """,
1018        ),
1019        PythonSourcePage(u"ucat",
1020            crumb=u"ucat",
1021            title=u"ll.scripts.ucat · Python software · LivingLogic AG",
1022            header=u"ll.scripts.ucat",
1023            subheader=u"Script for printing files",
1024            url=u"root:scripts/ucat.html",
1025            inheritablekeywords=[u"ucat"],
1026            hint=u"Script for printing files",
1027            description=u"""
1028            ucat is a script that prints files. It is an URL-enabled version of
1029            the cat system command. Via ll.url and ll.orasql ucat supports
1030            ssh and oracle URLs too.
1031            """,
1032        ),
1033        crumb=u"ll.scripts",
1034        title=u"ll.scripts · Python software · LivingLogic AG",
1035        header=u"ll.scripts",
1036        subheader=u"Scripts for rendering UL4 templates and working with URLs",
1037        url=u"root:scripts/index.html",
1038        inheritablekeywords=[u"script"],
1039        localkeywords=[u"UL4", "template", "URL", "db2ul4", "uls", "ucp", "ucat"],
1040        hint=u"Scripts for UL4 template rendering and URL handling",
1041        description=u"""
1042        ll.scripts is a Python package that contains the scripts db2ul4, ucls,
1043        ucp and ucat.
1044        """,
1045    ),
1046    PythonSourcePage(u"aplora",
1047        XISTPage(u"history",
1048            crumb=u"History",
1049            title=u"Aplora history · Python software · LivingLogic AG",
1050            header=u"Aplora history",
1051            subheader=u"The development history",
1052            url=u"root:aplora/History.html",
1053            localkeywords=[u"packages", u"history", u"changes", u"version"],
1054            hint=(u"ChangeLog for ", doc.mod("aplora")),
1055        ),
1056        XISTPage(u"installation",
1057            crumb=u"Installation",
1058            title=u"Aplora requirements, installation and configuration · Python software · LivingLogic AG",
1059            header=u"Aplora installation",
1060            subheader=u"Requirements, installation and configuration",
1061            url=u"root:aplora/Installation.html",
1062            localkeywords=[u"installation", u"distutils"],
1063            hint=(u"How to install ", doc.mod("aplora")),
1064        ),
1065        crumb=u"Aplora",
1066        title=u"Aplora · Python software · LivingLogic AG",
1067        header=u"Aplora",
1068        subheader=(u"Logging Apache ", abbr.http(), u" requests to an Oracle database"),
1069        url=u"root:aplora/index.html",
1070        localkeywords=[u"make", u"build", u"dependencies", u"development", u"target"],
1071        hint=u"Logging Apache HTTP requests to an Oracle database",
1072        description=u"""
1073        ll-aplora is a script that can be used with Apaches piped logging facility
1074        to log HTTP request to an Oracle database.
1075        """,
1076    ),
1077    PythonSourcePage(u"pycoco",
1078        XISTPage(u"history",
1079            crumb=u"History",
1080            title=u"Pycoco history · Python software · LivingLogic AG",
1081            header=u"Pycoco history",
1082            subheader=u"The development history",
1083            url=u"root:pycoco/History.html",
1084            localkeywords=[u"packages", u"history", u"changes", u"version"],
1085            hint=(u"ChangeLog for", doc.mod("pycoco")),
1086        ),
1087        XISTPage(u"installation",
1088            crumb=u"Installation",
1089            title=u"Pycoco requirements, installation and configuration · Python software · LivingLogic AG",
1090            header=u"Pycoco installation",
1091            subheader=u"Requirements, installation and configuration",
1092            url=u"root:pycoco/Installation.html",
1093            localkeywords=[u"installation", u"distutils"],
1094            hint=(u"How to install ", doc.mod("pycoco")),
1095        ),
1096        crumb=u"Pycoco",
1097        title=u"Pycoco · Python software · LivingLogic AG",
1098        header=u"Pycoco",
1099        subheader=(u"Python code coverage report"),
1100        url=u"root:pycoco/index.html",
1101        localkeywords=[u"test", u"Python", "code coverage"],
1102        hint=u"Python code coverage",
1103        description=u"""
1104        A script that can be used to generate code coverage info
1105        for the Python source code.
1106        """,
1107    ),
1108    XISTPage(u"download",
1109        crumb=u"Download",
1110        title=u"Download · Python software · LivingLogic AG",
1111        header="Downloads",
1112        subheader=u"All versions for download",
1113        url=u"root:Download.html",
1114        localkeywords=[u"download", u"file", u"archive"],
1115        hint=u"Links to Windows and Linux, source and binary distributions",
1116    ),
1117    XISTPage(u"source",
1118        crumb=u"Source code",
1119        title=u"Source code · Python software · LivingLogic AG",
1120        header=u"Source code",
1121        subheader=(u"Access to the Mercurial repositories"),
1122        url=u"root:Source.html",
1123        localkeywords=[u"Mercurial", u"development", u"repository"],
1124        hint=u"Access to the Mercurial repositories",
1125        description=u"""
1126        Provides a link to the Mercurial repositories for all
1127        Open Source Python projects by LivingLogic.
1128        """
1129    ),
1130    crumb=u"Python software",
1131    title=u"Python software · LivingLogic AG",
1132    header=u"Python packages",
1133    subheader=u"Python packages and modules by LivingLogic",
1134    url=u"root:index.html",
1135    inheritablekeywords=[u"Living", u"Logic", u"LivingLogic", u"Bayreuth", u"Python"],
1136    localkeywords=[u"packages", abbr.xist(), u"sisyphus", u"toxic", u"orasql"],
1137    hint=u"list of projects",
1138    description=u"""
1139    LivingLogic provides several Open Source Python packages:
1140    XIST, ll-url, ll-make, ll-color, ll-sisyphus, ll-toxic, ll-ul4, ll-orasql
1141    """
1142)
1143
1144
1145class pageref(xsc.Element):
1146    xmlns = xmlns
1147    model = sims.NoElements()
1148    class Attrs(xsc.Element.Attrs):
1149        class ref(xsc.TextAttr): pass
1150
1151    def convert(self, converter):
1152        if "ref" in self.attrs:
1153            page = pages[unicode(self.attrs.ref.convert(converter))]
1154        else:
1155            page = pages
1156        e = html.a(self.content, href=page.url, title=page.hint)
1157        return e.convert(converter)
1158
1159
1160class download(xsc.Element):
1161    xmlns = xmlns
1162    model = sims.Empty()
1163    class Attrs(xsc.Element.Attrs):
1164        class version(xsc.TextAttr): pass
1165        class date(xsc.TextAttr): pass
1166
1167    base = "ssh://root@ftp.livinglogic.de/~ftp/pub/livinglogic/"
1168
1169    def file(self, converter, u):
1170        target = converter.target
1171        name = u.file
1172        if name.endswith(".tar.gz") or name.endswith(".tar.bz2") or name.endswith(".zip"):
1173            type = "Source"
1174        elif name.endswith(".egg"):
1175            if "win32" in name:
1176                type = "Windows egg"
1177            elif "linux" in name:
1178                type = "Linux egg"
1179            else:
1180                type = "Egg"
1181            pos = name.rfind("py")
1182            if pos >= 0:
1183                version = name[pos+2:pos+5]
1184                type += " (Python %s)" % version
1185        elif name.endswith(".exe"):
1186            type = "Windows installer"
1187            pos = name.rfind("py")
1188            if pos >= 0:
1189                version = name[pos+2:-4]
1190                type += " (Python %s)" % version
1191        elif name.endswith(".src.rpm"):
1192            type = "Source RPM"
1193        elif name.endswith(".rpm"):
1194            type = "Binary RPM"
1195        else:
1196            type = chars.nbsp()
1197
1198        href = ("http://ftp.livinglogic.de/", u.relative(self.base))
1199        if target.xmlns == doc.xmlns:
1200            e = target.li(target.a(unicode(name), href=href), " (", type,")")
1201        else:
1202            e = html.tr(
1203                html.td(html.a(unicode(name), href=href, title=("Download ", href)), class_="file"),
1204                html.td(type, class_="type"),
1205                html.td(u.size(), class_="size"),
1206                class_="download"
1207            )
1208        return e
1209
1210    def convert(self, converter):
1211        version = str(self.attrs.version.convert(converter))
1212        name = converter[downloads].name
1213        u = url.URL("%s/%s/" % (self.base, name))
1214        files = u/u.files("*-%s[-.][twpz]*" % version)
1215        files = (self.file(converter, f) for f in files)
1216        target = converter.target
1217        if target.xmlns == doc.xmlns:
1218            e = target.section(
1219                target.h("Version ", self.attrs.version, " (released ", self.attrs.date, ")"),
1220                target.ul(files),
1221            )
1222        else:
1223            with xsc.build():
1224                with xsc.Frag() as e:
1225                    with html.tr():
1226                        with html.th(self.attrs.version, class_="version"):
1227                            if "date" in self.attrs:
1228                                xsc.add(" ", html.span("(released ", self.attrs.date, ")", class_="note"))
1229                        +html.th("Type", class_="type")
1230                        +html.th("Bytes", class_="size")
1231                    xsc.add(files)
1232        return e.convert(converter)
1233
1234
1235class downloads(xsc.Element):
1236    xmlns = xmlns
1237    model = sims.Elements(download)
1238    class Attrs(xsc.Element.Attrs):
1239        class name(xsc.TextAttr): pass
1240    class Context(xsc.Element.Context):
1241        pass
1242
1243    def convert(self, converter):
1244        converter[self].name = str(self.attrs.name.convert(converter))
1245        target = converter.target
1246        if target.xmlns == doc.xmlns:
1247            e = self.content
1248        else:
1249            e = html.div(
1250                htmlspecials.plaintable(
1251                    self.content,
1252                    class_="downloads",
1253                ),
1254                align="center"
1255            )
1256        return e.convert(converter)
1257
1258
1259class alldownloads(xsc.Element):
1260    xmlns = xmlns
1261    model = sims.Elements(downloads)
1262
1263    def convert(self, converter):
1264        e = html.div(self.content, class_="alldownloads")
1265        return e.convert(converter)
1266
1267
1268class page(xsc.Element):
1269    xmlns = xmlns
1270    model = sims.Elements(alldownloads, doc.block)
1271    class Attrs(xsc.Element.Attrs):
1272        class refresh(xsc.TextAttr): pass
1273        class path(xsc.TextAttr): pass
1274
1275    def _nodetype(self, path, activepath):
1276        if path[-1] is activepath[-1]:
1277            return "here"
1278        elif path[-1] in activepath:
1279            return "path"
1280        else:
1281            return "other"
1282
1283    def _node(self, path, activepath):
1284        type = self._nodetype(path, activepath)
1285        page = path[-1]
1286        if type == "here":
1287            e = html.div(page.crumb, html.span(page.hint, class_="hint"))
1288            children = True
1289        else:
1290            e = html.a(
1291                page.crumb,
1292                html.span(page.hint, class_="hint"),
1293                href=page.url,
1294                class_=type,
1295            )
1296            children = (type == "path")
1297        if len(path) > 1:
1298            e = html.li(e, class_=type)
1299        else:
1300            e = xsc.Frag(e)
1301        if children:
1302            e.append(self._children(path, activepath))
1303        return e
1304
1305    def _children(self, path, activepath):
1306        return html.ul(self._node(path + [child], activepath) for child in path[-1].getChildren())
1307
1308    def _links(self, context):
1309        return self._node([pages], context.page.getPath())
1310
1311    def _crumbs(self, context):
1312        e = xsc.Frag()
1313        page = context.page
1314        while page is not None:
1315            if page is context.page:
1316                e.insert(0, html.span(page.crumb, class_=u"here"))
1317            else:
1318                e.insert(0, pageref(page.crumb, ref=page.getPathString()))
1319            e.insert(0, u"\xa0\u203a\xa0")
1320            page = page.parent
1321        e.insert(0, html.a(u"Home", href=u"http://www.livinglogic.de/", hreflang=u"de", title=u"The company homepage (in german)"))
1322        return e
1323
1324    def convert(self, converter):
1325        converter[doc.pyref].base = "root:"
1326        target = converter.target
1327        context = converter[self]
1328        context.path = unicode(self["path"].convert(converter))
1329        context.page = pages[context.path]
1330        if target.xmlns == doc.xmlns:
1331            return self.content.convert(converter)
1332        elif not target.xmlns == html.xmlns:
1333            raise ValueError("unknown conversion target %r" % target)
1334        else:
1335            with xsc.build():
1336                with xsc.Frag(xml.XML(), u"\n", target.DocTypeXHTML10transitional(), u"\n") as e:
1337                    with target.html(xml.Attrs(lang=u"en"), lang=u"en"):
1338                        with target.head():
1339                            +meta.contenttype()
1340                            +target.title(unicode(xsc.Frag(context.page.title).convert(converter)))
1341                            if context.page.keywords:
1342                                +meta.keywords(xsc.Frag(*context.page.keywords).withsep(", "))
1343                            if context.page.description is not None:
1344                                +meta.description(context.page.description)
1345                            +meta.stylesheet(href="root:main_screen.css", media=u"screen, projection, tv")
1346                            +meta.stylesheet(href="root:main_print.css", media=u"print")
1347                            +meta.author(name=u"Walter Dörwald", email=u"walter.doerwald@livinglogic.de")
1348                            icbm = u"49.9550; 11.5909"
1349                            +html.meta(name=u"icbm", content=icbm)
1350                            +html.meta(name=u"geo.position", content=icbm)
1351                            +html.meta(name=u"geo.placename", content=u"Bayreuth, Germany, Europe")
1352                            +html.meta(name=u"geo.region", content=u"DE-BY")
1353                            +html.meta(name=u"DC.title", content=context.page.title)
1354                            +html.link(rel=u"icon", href=u"root:images/favicon.gif", type=u"image/gif")
1355                            top = context.page.getRoot()
1356                            if top is not None and top != context.page:
1357                                +html.link(rel="top", href=top.url)
1358                            parent = context.page.parent
1359                            if parent is not None:
1360                                +html.link(rel="up", href=parent.url)
1361                            firstsibling = context.page.getFirstSibling()
1362                            if firstsibling is not None and firstsibling != context.page:
1363                                +html.link(rel="first", title="First page in set", href=firstsibling.url)
1364                            prevsibling = context.page.getPrevSibling()
1365                            if prevsibling is not None and prevsibling != context.page:
1366                                +html.link(rel="prev", title="Previous page", href=prevsibling.url)
1367                            nextsibling = context.page.getNextSibling()
1368                            if nextsibling is not None and nextsibling != context.page:
1369                                +html.link(rel="next", title="Next page", href=nextsibling.url)
1370                            lastsibling = context.page.getLastSibling()
1371                            if lastsibling is not None and lastsibling != context.page:
1372                                +html.link(rel="last", title="Last page in set", href=lastsibling.url)
1373                            for link in context.page.alternates():
1374                                +html.link(link.attrs)
1375                            if "refresh" in self.attrs:
1376                                +html.meta(http_equiv="refresh", content=self.attrs.refresh)
1377
1378                        with target.body():
1379                            with html.div(class_="header"):
1380                                if context.page.header:
1381                                    +html.h1(context.page.header)
1382                                if context.page.subheader:
1383                                    +html.h2(context.page.subheader)
1384                            with html.div(class_="crumbs"):
1385                                with htmlspecials.plaintable(width="100%"):
1386                                    with html.tr(valign="middle"):
1387                                        +html.td(self._crumbs(context), class_="crumbs")
1388                                        +html.td(xsc.Frag(context.page.alternates()).withsep(u"\xa0\xb7\xa0"), align="right", class_="alternate")
1389                            with html.div(class_="body"):
1390                                +html.div(self._links(context), class_="links")
1391                                +html.div(self.content, class_="content")
1392        return e.convert(converter)
Note: See TracBrowser for help on using the browser.