root/livinglogic.python.www/site/m.py @ 467:246502c67ccc

Revision 467:246502c67ccc, 14.7 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

Update to work with XIST 3.0 (and its accompanying make).

  • Property exe set to *
Line 
1#!/usr/bin/env python
2
3from ll.xist import xsc
4
5import sys, os, os.path, errno, tempfile
6
7from ll import make, url
8from ll.xist import parsers, publishers, css
9from ll.xist.ns import html, doc, fo, specials, abbr, code, chars
10
11
12class XISTFOAction(make.PipeAction):
13    def execute(self, project, data):
14        project.writestep("Wrapping input in fodoc")
15        return doc.fodoc(data)
16
17
18class ExtractContentAction(make.PipeAction):
19    def execute(self, project, data):
20        project.writestep("Extracting content")
21        return data.walknode(css.FindCSS("td.content"))[0].content
22
23
24class Project(make.Project):
25    def create(self):
26        make.Project.create(self)
27        here = url.here()
28        root = url.root()
29        home = url.home()
30        srcdir = here
31        builddir = here/"../build/"
32        installdir = here/"../install/"
33        repositorydir = home
34        xistdir = url.firstdir([here/"../xist_src/", home/"LivingLogic/Python/xist/"])
35
36        build = self.add(make.PhonyAction(), "build")
37        install = self.add(make.PhonyAction(), "install")
38        clean = self.add(
39            make.PhonyAction("clean the build directory").addinputs(
40                make.alwaysaction / make.CommandAction("rm -rf %s" % (here/builddir).local())
41            ),
42            "clean"
43        )
44
45        installclean = self.add(
46            make.PhonyAction("clean the build and install directory").addinputs(
47                make.alwaysaction / make.CommandAction("rm -rf %s/*" % (here/installdir).local()),
48                clean
49            ),
50            "installclean"
51        )
52
53        namespaces = []
54        files = list(srcdir.walkfiles())
55
56        pixelfiles = [ file for file in xistdir.walkfiles() if str(file).startswith("px/") and file.ext=="gif" ]
57
58        copyextensions = {"gif": True, "jpg": True, "css": False, "js": False}
59        auxFiles = []
60        for id in files:
61            ext = id.ext
62            try:
63                aux = copyextensions[ext]
64            except KeyError:
65                continue
66            f1 = self.add(make.FileAction(here/srcdir/id))
67            f2 = self.add(f1 / make.FileAction(here/builddir/id))
68            f3 = self.add(f2 / make.FileAction(here/installdir/id) / make.ModeAction(0644))
69            if aux:
70                auxFiles.append(f2)
71            build.addinputs(f2)
72            install.addinputs(f3)
73
74        for id in pixelfiles:
75            f1 = self.add(make.FileAction(here/xistdir/id))
76            f2 = self.add(f1 / make.FileAction(here/builddir/id))
77            f3 = self.add(f2 / make.FileAction(here/installdir/id) / make.ModeAction(0644))
78            auxFiles.append(f2)
79            build.addinputs(f2)
80            install.addinputs(f3)
81
82        def makens(prefix, id):
83            f1 = self.add(make.FileAction(here/srcdir/id))
84            buildid = here/builddir/id
85            f2 = self.add(f1 / make.FileAction(buildid) / make.ModuleAction() / make.XISTNSPrefixAction(prefix=prefix), buildid)
86            return f2
87
88        pyns = makens("py", "Python_xmlns.py")
89
90        xmlparser = parsers.Parser(prefixes={None: (chars, abbr, doc, specials)})
91        publisher = publishers.Publisher(encoding="utf-8", xhtml=1)
92        fopublisher = publishers.Publisher(prefixes={fo: "fo", doc: "doc", "specials": specials}, encoding="utf-8", xhtml=2)
93
94        # These are not the real installed modules, but their source
95        file_core = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/__init__.py"))
96        file_xist = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/__init__.py"))
97        file_xist_xsc = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/xsc.py"))
98        file_xist_ns = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/__init__.py"))
99        file_xist_ns_html = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/html.py"))
100        file_xist_ns_xml = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/xml.py"))
101        file_xist_ns_wml = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/wml.py"))
102        file_xist_ns_ihtml = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/ihtml.py"))
103        file_xist_ns_docbook = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/docbook.py"))
104        file_xist_ns_abbr = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/abbr.py"))
105        file_xist_ns_cond = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/cond.py"))
106        file_xist_ns_form = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/form.py"))
107        file_xist_ns_php = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/php.py"))
108        file_xist_ns_jsp = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/jsp.py"))
109        file_xist_ns_meta = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/meta.py"))
110        file_xist_ns_ruby = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/ruby.py"))
111        file_xist_ns_specials = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/specials.py"))
112        file_xist_ns_htmlspecials = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/htmlspecials.py"))
113        file_xist_ns_strutshtml = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/struts_html.py"))
114        file_xist_ns_strutsconfig = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/struts_config.py"))
115        file_xist_ns_doc = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/doc.py"))
116        file_xist_ns_rng = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/rng.py"))
117        file_xist_ns_kid = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/kid.py"))
118        file_xist_ns_detox = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/ns/detox.py"))
119        file_xist_parsers = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/parsers.py"))
120        file_xist_converters = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/converters.py"))
121        file_xist_presenters = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/presenters.py"))
122        file_xist_publishers = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/publishers.py"))
123        file_xist_sims = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/sims.py"))
124        file_xist_xfind = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/xist/src/ll/xist/xfind.py"))
125        file_misc = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/misc.py"))
126        file_url = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/url.py"))
127        file_make = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/make.py"))
128        file_sisyphus = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/sisyphus.py"))
129        file_daemon = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/daemon.py"))
130        file_toxic = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/toxic/src/ll/toxic.py"))
131        file_orasql = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/orasql/src/ll/orasql/__init__.py"))
132        file_nightshade = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/nightshade/src/ll/nightshade.py"))
133        file_color = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/color.py"))
134        file_xpit = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/core/src/ll/xpit.py"))
135        file_pycoco = self.add(make.FileAction(here/repositorydir/"LivingLogic/Python/pycoco/src/pycoco/__init__.py"))
136
137        mod_xist_ns_html = make.ImportAction("ll.xist.ns.html")
138        mod_xist_ns_doc = make.ImportAction("ll.xist.ns.doc")
139
140        # Data for Additional dependencies (News & Install)
141        docdeps = {
142            "core/History": "LivingLogic/Python/core/NEWS.xml",
143            "core/OldHistory": "LivingLogic/Python/core/OLDNEWS.xml",
144            "core/Installation": "LivingLogic/Python/core/INSTALL.xml",
145            "core/Migration": "LivingLogic/Python/core/MIGRATION.xml",
146            "core/OldMigration": "LivingLogic/Python/core/OLDMIGRATION.xml",
147            "xist/History": "LivingLogic/Python/xist/NEWS.xml",
148            "xist/Installation": "LivingLogic/Python/xist/INSTALL.xml",
149            "xist/Howto": "LivingLogic/Python/xist/HOWTO.xml",
150            "xist/Examples": "LivingLogic/Python/xist/EXAMPLES.xml",
151            "xist/Migration": "LivingLogic/Python/xist/MIGRATION.xml",
152            "url/Howto": "LivingLogic/Python/core/URL_HOWTO.xml",
153            "orasql/History": "LivingLogic/Python/orasql/NEWS.xml",
154            "orasql/Installation": "LivingLogic/Python/orasql/INSTALL.xml",
155            "nightshade/History": "LivingLogic/Python/nightshade/NEWS.xml",
156            "nightshade/Installation": "LivingLogic/Python/nightshade/INSTALL.xml",
157            "toxic/History": "LivingLogic/Python/toxic/NEWS.xml",
158            "toxic/Installation": "LivingLogic/Python/toxic/INSTALL.xml",
159            "aplora/History": "LivingLogic/Python/aplora/NEWS.xml",
160            "aplora/Installation": "LivingLogic/Python/aplora/INSTALL.xml",
161            "pycoco/History": "LivingLogic/Python/pycoco/NEWS.xml",
162            "pycoco/Installation": "LivingLogic/Python/pycoco/INSTALL.xml",
163        }
164
165        # Docstring and module source dependencies
166        moddeps = {
167            "core/index": (file_core, file_xist_ns_doc),
168            "url/index": (file_url, file_xist_ns_doc),
169            "make/index": (file_make, file_xist_ns_doc),
170            "sisyphus/index": (file_sisyphus, file_xist_ns_doc),
171            "daemon/index": (file_daemon, file_xist_ns_doc),
172            "misc/index": (file_misc, file_xist_ns_doc),
173            "color/index": (file_color, file_xist_ns_doc),
174            "xpit/index": (file_xpit, file_xist_ns_doc),
175            "xist/index": (file_xist, file_xist_ns_doc),
176            "xist/xsc/index": (file_xist_xsc, file_xist_ns_doc),
177            "xist/ns/index": (file_xist_ns, file_xist_ns_doc),
178            "xist/ns/html/index": (file_xist_ns_html, file_xist_ns_doc),
179            "xist/ns/xml/index": (file_xist_ns_xml, file_xist_ns_doc),
180            "xist/ns/wml/index": (file_xist_ns_wml, file_xist_ns_doc),
181            "xist/ns/ihtml/index": (file_xist_ns_ihtml, file_xist_ns_doc),
182            "xist/ns/docbook/index": (file_xist_ns_docbook, file_xist_ns_doc),
183            "xist/ns/abbr/index": (file_xist_ns_abbr, file_xist_ns_doc),
184            "xist/ns/cond/index": (file_xist_ns_cond, file_xist_ns_doc),
185            "xist/ns/form/index": (file_xist_ns_form, file_xist_ns_doc),
186            "xist/ns/php/index": (file_xist_ns_php, file_xist_ns_doc),
187            "xist/ns/jsp/index": (file_xist_ns_jsp, file_xist_ns_doc),
188            "xist/ns/meta/index": (file_xist_ns_meta, file_xist_ns_doc),
189            "xist/ns/ruby/index": (file_xist_ns_ruby, file_xist_ns_doc),
190            "xist/ns/specials/index": (file_xist_ns_specials, file_xist_ns_doc),
191            "xist/ns/htmlspecials/index": (file_xist_ns_htmlspecials, file_xist_ns_doc),
192            "xist/ns/struts_html/index": (file_xist_ns_strutshtml, file_xist_ns_doc),
193            "xist/ns/struts_config/index": (file_xist_ns_strutsconfig, file_xist_ns_doc),
194            "xist/ns/doc/index": (file_xist_ns_doc, ),
195            "xist/ns/rng/index": (file_xist_ns_rng, file_xist_ns_doc),
196            "xist/ns/kid/index": (file_xist_ns_kid, file_xist_ns_doc),
197            "xist/ns/detox/index": (file_xist_ns_detox, file_xist_ns_doc),
198            "xist/parsers/index":  (file_xist_parsers, file_xist_ns_doc),
199            "xist/converters/index": (file_xist_converters, file_xist_ns_doc),
200            "xist/presenters/index": (file_xist_presenters, file_xist_ns_doc),
201            "xist/publishers/index":  (file_xist_publishers, file_xist_ns_doc),
202            "xist/sims/index":  (file_xist_sims, file_xist_ns_doc),
203            "xist/xfind/index":  (file_xist_xfind, file_xist_ns_doc),
204            "toxic/index": (file_toxic, file_xist_ns_doc),
205            "orasql/index": (file_orasql, file_xist_ns_doc),
206            "nightshade/index": (file_nightshade, file_xist_ns_doc),
207            "pycoco/index": (file_pycoco, file_xist_ns_doc),
208        }
209
210        for id in files:
211            ext = id.ext
212            if ext and ext.endswith("xsc"):
213                newid = id.withext(ext[:-3])
214
215                path = str(id.withoutext().path)
216
217                f = self.add(make.FileAction(here/srcdir/id))
218
219                collect = make.CollectAction()
220                collect.addinputs(*auxFiles)
221
222                if path in docdeps:
223                    docxml = self.add(make.FileAction(here/repositorydir/docdeps[path]))
224                    collect.addinputs(docxml)
225                if path in moddeps:
226                    mods = moddeps[path]
227                    collect.addinputs(*mods)
228                    mod2 = self.add(mods[0] / make.FileAction(here/builddir/(path + "_module.py")))
229                    mod3 = self.add(mod2 / make.FileAction(here/installdir/(path + "_module.py")) / make.ModeAction(0644))
230                    build.addinputs(mod2)
231                    install.addinputs(mod3)
232
233                f2 = self.add(
234                    f /
235                    collect /
236                    make.XISTParseAction(parser=xmlparser, base=root/newid).addinputs(pyns) /
237                    make.XISTConvertAction() /
238                    make.XISTPublishAction(publisher=publisher, base=root/newid) /
239                    make.FileAction(here/builddir/newid)
240                )
241                f3 = self.add(f2 / make.FileAction(here/installdir/newid))
242                build.addinputs(f2)
243                install.addinputs(f3)
244
245                # Build alternate versions of the page
246                # Source version of the page
247                pagesrcid = id
248                f2 = self.add(f / make.FileAction(here/builddir/pagesrcid))
249                f3 = self.add(f2 / make.FileAction(here/installdir/pagesrcid) / make.ModeAction(0644))
250                build.addinputs(f2)
251                install.addinputs(f3)
252
253                # Plain text version of the page
254                realf = f
255                if path in docdeps or path in moddeps:
256                    collect = make.CollectAction()
257                    if path in docdeps:
258                        collect.addinputs(docxml)
259                    if path in moddeps:
260                        mods = moddeps[path]
261                        collect.addinputs(*mods)
262                    realf /= collect
263
264                txtid = id.withext("txt")
265                t2 = self.add(
266                    realf /
267                    make.XISTParseAction(xmlparser, root/txtid).addinputs(pyns, mod_xist_ns_doc, mod_xist_ns_html) /
268                    make.XISTConvertAction(target=html) /
269                    ExtractContentAction() /
270                    make.XISTTextAction() /
271                    make.FileAction(here/builddir/txtid)
272                )
273                t3 = self.add(
274                    t2 /
275                    make.FileAction(here/installdir/txtid) /
276                    make.ModeAction(0644)
277                )
278                build.addinputs(t2)
279                install.addinputs(t3)
280
281                # XSL-FO version of the page
282                realf = f
283                if path in docdeps or path in moddeps:
284                    collect = make.CollectAction()
285                    if path in docdeps:
286                        collect.addinputs(docxml)
287                    if path in moddeps:
288                        mods = moddeps[path]
289                        collect.addinputs(*mods)
290                    realf /= collect
291
292                foid = id.withext("fo")
293                fot2 = self.add(
294                    realf /
295                    make.XISTParseAction(xmlparser, root/foid).addinputs(pyns, mod_xist_ns_doc) /
296                    XISTFOAction() /
297                    make.XISTConvertAction(target=fo) /
298                    make.XISTPublishAction(fopublisher, root/foid) /
299                    make.FileAction(here/builddir/foid)
300                )
301
302                fot3 = self.add(
303                    fot2 /
304                    make.FileAction(here/installdir/foid) /
305                    make.ModeAction(0644)
306                )
307                build.addinputs(fot2)
308                install.addinputs(fot3)
309
310                # PDF version of the page
311                pdfid = id.withext("pdf")
312                t2 = self.add(
313                    fot2 /
314                    make.FOPAction() /
315                    make.FileAction(here/builddir/pdfid)
316                )
317                t3 = self.add(
318                    t2 /
319                    make.FileAction(here/installdir/pdfid) /
320                    make.ModeAction(0644)
321                )
322                build.addinputs(t2)
323                install.addinputs(t3)
324
325        self.writecreatedone()
326
327
328p = Project()
329
330
331if __name__=="__main__":
332    (options, args) = p.parseoptions()
333    if args:
334        p.create()
335        p.build(*args)
336else:
337    p.create()
Note: See TracBrowser for help on using the browser.