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