10 #from jinja2 import Template
12 from pkg_resources import resource_filename, resource_listdir
14 import treecutter.constants as const
15 from treecutter.tools import mkdir_p
18 """Class representing a version of a webpage"""
19 def __init__(self,link,page):
27 self._rendered_article = None
33 return set(self._resources)
38 def set_article(self,art):
39 self._rendered_article = art
42 self._doc = etree.parse(self._file)
43 t = self._doc.xpath(u'/db:article/db:info/db:title',namespaces=const.XPATH)
45 self._title = unicode(t[0].text)
46 ta = self._doc.xpath(u'/db:article/db:info/db:titleabbrev',namespaces=const.XPATH)
48 self._menu = unicode(ta[0].text)
49 dirname = os.path.dirname(self._file)
51 code = self._doc.xpath(u"//xi:include[@parse='text']",namespaces=const.XPATH)
55 alang = c.get('accept-language')
56 xpointer = c.get('xpointer')
57 (p, ext) = os.path.splitext(href)
58 if ext in const.valid_scripts:
60 script = os.path.join(os.path.abspath(dirname)+'/'+href)
61 if os.path.isfile(script):
64 if href in resource_listdir('xinclude', ''):
65 script = resource_filename('xinclude', href)
68 print "Script "+href+" in "+self._file+" missing"
70 exe.append("lang="+alang)
72 exe.append("xptr="+xpointer)
73 print " executing %15s" % (href),
76 xml = subprocess.Popen(exe,stdout=subprocess.PIPE,
77 stderr=subprocess.PIPE)
78 (stdout, stderr) = xml.communicate()
80 print " ".join(exe)+" ERROR : [ "+stderr+" ]"
83 print " [%5.2f s] (%s)" % (round(te-ts,2),xpointer)
84 xstr = etree.fromstring(stdout)
85 # inserting the generated code and remove the xinclude reference
87 idp.insert(idp.index(c)+1,xstr)
90 for r in self._doc.xpath(u"//db:link[@xlink:href]",namespaces=const.XPATH):
91 rf = os.path.join(dirname,r.get(const.XLINK+'href'))
92 if os.path.isfile(rf):
93 if r.get('security')=='encrypt':
94 with open(rf, 'rb') as f:
96 status = gpg.encrypt_file(
97 f, None, passphrase=getpass.getpass(rf+' password:'), symmetric=True,
99 r.set(const.XLINK+'href', r.get(const.XLINK+'href')+'.gpg')
101 self._resources.append(rf)
102 for i in self._doc.xpath(u"//db:imagedata[@fileref]",namespaces=const.XPATH):
103 im = os.path.join(dirname,i.get('fileref'))
104 if os.path.isfile(im):
105 self._resources.append(im)
107 print "WARNING: File "+im+" is missing!"
108 for i in self._doc.xpath(u"//html:form[@action]",namespaces=const.XPATH):
109 pyscript = re.split('\.py',i.get('action'),1)[0]+'.py'
110 im = os.path.join(dirname,pyscript)
111 if os.path.isfile(im):
112 self._resources.append(im)
114 def render(self, style):
116 # xslt_root = etree.XML(open(style+"docbook.xsl", 'r').read())
117 # transform = etree.XSLT(xslt_root)
118 # result = etree.tostring(transform(xml_root))
121 dirname = os.path.dirname(self._file)
123 infile = os.path.basename(tempfile.mktemp())
124 outfile = tempfile.mktemp()
125 tfi = open(infile,'w')
126 tfi.write(etree.tostring(self._doc,encoding='UTF-8',pretty_print=False))
128 # cmd = ["saxon-xslt-xinclude","-o",outfile,infile,style_xslt]
129 cmd = ["xsltproc","--xinclude","--output",outfile,style+"docbook.xhtml5.xsl",infile]
130 retcode = subprocess.call(cmd)
132 print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']'
133 tfo = codecs.open(outfile, "r", "utf-8")
134 self._rendered_article = tfo.read()
140 def template(self,sitemap,style,tdir,subdir):
141 htmlmenu = sitemap.gen_menu(self._lang,None,"menu")
142 levelmenu = sitemap.gen_menu(self._lang,self,"tree")
143 langmenu = sitemap.lang_menu(self._lang,self._link)
144 article = self._rendered_article
145 templateLoader = jinja2.FileSystemLoader( searchpath="/" )
146 templateEnv = jinja2.Environment( loader=templateLoader )
148 templateVars = {'title':self._title,
151 'levelmenu':levelmenu,
155 s = unicode(style, "utf-8")
156 t = s+'index.'+self._lang+'.xhtml.tmpl'
157 template = templateEnv.get_template( t )
158 templateout = template.render( templateVars )
160 outfile = tdir+'xhtml'.join(self._file.rsplit('xml',1))
161 mkdir_p(os.path.dirname(outfile))
162 out = codecs.open(outfile, 'w', 'utf-8')
163 out.write(templateout)