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