root/livinglogic.python.www/site/Python_xmlns.py @ 677:f87fe339f8f1

Revision 677:f87fe339f8f1, 49.1 KB (checked in by Walter Doerwald <walter@…>, 8 years ago)

XIST 3.25. Add page for uhpp script.

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