a6c55025a59ac4b0fe223d0c05625065411bc300
[treecutter.git] / treecutter / page.py
1 #!/usr/bin/python
2 import os
3 import fnmatch
4 import subprocess
5 import amara
6 import re
7 import tempfile
8 import errno
9 import time
10 import argparse
11 import shutil
12 import pygraphviz as pgv
13 import glob
14 import gettext
15 import shutil
16 from amara import bindery
17 from amara.xslt import transform
18 from Cheetah.Template import Template
19
20 class Page():
21     """Class representing a version of a webpage"""
22     def __init__(self,link,page):
23         self._link = link
24         self._file = page[1]
25         self._lang = page[0]
26         self._doc = None
27         self._resources = []
28         self._title = None
29         self._menu = None
30         self._rendered_article = None
31
32     def language(self):
33         return self._lang
34
35     def resources(self):
36         return set(self._resources)
37
38     def menu(self):
39         return self._menu
40
41     def set_article(self,art):
42         self._rendered_article = art
43
44     def prepare(self):
45         self._doc = bindery.parse(self._file, prefixes=PREFIXES)
46         if self._doc.xml_select(u'/db:article/db:info/db:title'):
47             self._title = unicode(self._doc.article.info.title)
48         if self._doc.xml_select(u'/db:article/db:info/db:titleabbrev'):
49             self._menu = unicode(self._doc.article.info.titleabbrev)
50
51         dirname = os.path.dirname(self._file)
52         code  = self._doc.xml_select(u"//xi:include[@parse='text']")
53         if code:
54             for c in code:
55                 (p, ext) = os.path.splitext(c.href)
56                 if ext in valid_scripts:
57                     exe = []
58                     exe.append(os.path.join(os.path.abspath(dirname)+'/'+c.href))
59                     if c.xml_select(u"//xi:include[@accept-language]"):
60                         alang = c.xml_attributes[None, "accept-language"]
61                         exe.append("lang="+alang)
62                     if c.xml_select(u"//xi:include[@xpointer]"):
63                         exe.append("xptr="+c.xpointer)
64                     xml = subprocess.Popen(exe,stdout=subprocess.PIPE)
65                     xstr = bindery.parse(str(xml.stdout.read()))
66                     idp = c.xml_index_on_parent
67                     for x in xstr.xml_children:
68                         c.xml_parent.xml_insert(idp,x)
69                         c.xml_parent.xml_remove(c)
70
71         for r in self._doc.xml_select(u"//db:link[@xl:href]"):
72             rf = os.path.join(dirname,r.href)
73             if os.path.isfile(rf):
74                 self._resources.append(rf)
75         for i in self._doc.xml_select(u"//db:imagedata[@fileref]"):
76             im = os.path.join(dirname,i.fileref)
77             if os.path.isfile(im):
78                 self._resources.append(im)
79         for i in self._doc.xml_select(u"//html:form[@action]"):
80             pyscript = re.split('\.py',i.action,1)[0]+'.py'
81             im = os.path.join(dirname,pyscript)
82             if os.path.isfile(im):
83                 self._resources.append(im)
84
85     def render(self):
86         #  amara can not handle the docbook stylesheets
87         #  xmlarticle = transform(doc,style_xslt)
88         cwd = os.getcwd()
89         dirname = os.path.dirname(self._file)
90         os.chdir(dirname)
91         infile  = os.path.basename(tempfile.mktemp())
92         outfile = tempfile.mktemp()
93         tfi = open(infile,'w')
94         tfi.write(self._doc.xml_encode(omit_xml_declaration=True))
95         tfi.close()
96 #  cmd = ["saxon-xslt-xinclude","-o",outfile,infile,style_xslt]
97         cmd = ["xsltproc","--xinclude","--output",outfile,style_xslt,infile]
98         retcode = subprocess.call(cmd)
99         if retcode:
100             print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']'
101         tfo = open(outfile,'r')
102         self._rendered_article = tfo.read()
103         tfo.close()
104         os.remove(infile)
105         os.remove(outfile)
106         os.chdir(cwd)
107
108     def template(self,sitemap):
109         htmlmenu =  sitemap.gen_menu(self._lang,None,"menu")
110         levelmenu = sitemap.gen_menu(self._lang,self,"tree")
111         langmenu = sitemap.lang_menu(self._lang,self._link)
112         template = Template(file=args.style+'index.'+self._lang+'.html.tmpl',
113                             searchList=[{'title':self._title},
114                                         {'menu':htmlmenu},
115                                         {'article':self._rendered_article},
116                                         {'levelmenu':levelmenu},
117                                         {'langmenu':langmenu}])
118         outfile = tmptarget+'html'.join(self._file.rsplit('xml',1))
119         mkdir_p(os.path.dirname(outfile))
120         out = open(outfile, 'w')
121         out.write(str(template))
122         out.close()