root/livinglogic.python.www/site/Python_xmlns.py @ 715:3f31703af01f

Revision 715:3f31703af01f, 49.2 KB (checked in by Walter Doerwald <walter@…>, 6 years ago)

XIST 5.4.1. Remove unused imports.

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