X-Git-Url: https://source.tree.se/git?a=blobdiff_plain;f=treecutter%2Fpage.py;h=53eeb0d40baa357f18c7f76d98404b8ed1206518;hb=870b74488439f6c30974eb759d5032fc06cb8c14;hp=a6c55025a59ac4b0fe223d0c05625065411bc300;hpb=cbc71d935810a88200aeeff34d0d7aaa56c81a71;p=treecutter.git diff --git a/treecutter/page.py b/treecutter/page.py old mode 100755 new mode 100644 index a6c5502..53eeb0d --- a/treecutter/page.py +++ b/treecutter/page.py @@ -1,21 +1,18 @@ #!/usr/bin/python import os -import fnmatch import subprocess -import amara -import re import tempfile -import errno -import time -import argparse -import shutil -import pygraphviz as pgv -import glob -import gettext -import shutil -from amara import bindery -from amara.xslt import transform -from Cheetah.Template import Template +import re +import getpass +import gnupg +import codecs +from lxml import etree +#from jinja2 import Template +import jinja2 +from pkg_resources import resource_filename, resource_listdir +from time import time +import treecutter.constants as const +from treecutter.tools import mkdir_p class Page(): """Class representing a version of a webpage""" @@ -42,81 +39,126 @@ class Page(): self._rendered_article = art def prepare(self): - self._doc = bindery.parse(self._file, prefixes=PREFIXES) - if self._doc.xml_select(u'/db:article/db:info/db:title'): - self._title = unicode(self._doc.article.info.title) - if self._doc.xml_select(u'/db:article/db:info/db:titleabbrev'): - self._menu = unicode(self._doc.article.info.titleabbrev) + self._doc = etree.parse(self._file) + t = self._doc.xpath(u'/db:article/db:info/db:title',namespaces=const.XPATH) + if t: + self._title = unicode(t[0].text) + ta = self._doc.xpath(u'/db:article/db:info/db:titleabbrev',namespaces=const.XPATH) + if ta: + self._menu = unicode(ta[0].text) dirname = os.path.dirname(self._file) - code = self._doc.xml_select(u"//xi:include[@parse='text']") + cwd = os.getcwd() + code = self._doc.xpath(u"//xi:include[@parse='text']",namespaces=const.XPATH) if code: for c in code: - (p, ext) = os.path.splitext(c.href) - if ext in valid_scripts: + href = c.get('href') + alang = c.get('accept-language') + xpointer = c.get('xpointer') + (p, ext) = os.path.splitext(href) + if ext in const.valid_scripts: exe = [] - exe.append(os.path.join(os.path.abspath(dirname)+'/'+c.href)) - if c.xml_select(u"//xi:include[@accept-language]"): - alang = c.xml_attributes[None, "accept-language"] + script = os.path.join(os.path.abspath(dirname)+'/'+href) + if os.path.isfile(script): + exe.append(script) + else: + if href in resource_listdir('xinclude', ''): + script = resource_filename('xinclude', href) + exe.append(script) + else: + print "Script "+href+" in "+self._file+" missing" + if alang: exe.append("lang="+alang) - if c.xml_select(u"//xi:include[@xpointer]"): - exe.append("xptr="+c.xpointer) - xml = subprocess.Popen(exe,stdout=subprocess.PIPE) - xstr = bindery.parse(str(xml.stdout.read())) - idp = c.xml_index_on_parent - for x in xstr.xml_children: - c.xml_parent.xml_insert(idp,x) - c.xml_parent.xml_remove(c) + if xpointer: + exe.append("xptr="+xpointer) + print " executing %15s" % (href), + ts = time() + os.chdir(dirname) + xml = subprocess.Popen(exe,stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + (stdout, stderr) = xml.communicate() + if stderr: + print " ".join(exe)+" ERROR : [ "+stderr+" ]" + os.chdir(cwd) + te = time() + print " [%5.2f s] (%s)" % (round(te-ts,2),xpointer) + xstr = etree.fromstring(stdout) +# inserting the generated code and remove the xinclude reference + idp = c.getparent() + idp.insert(idp.index(c)+1,xstr) + idp.remove(c) - for r in self._doc.xml_select(u"//db:link[@xl:href]"): - rf = os.path.join(dirname,r.href) + for r in self._doc.xpath(u"//db:link[@xlink:href]",namespaces=const.XPATH): + rf = os.path.join(dirname,r.get(const.XLINK+'href')) if os.path.isfile(rf): + if r.get('security')=='encrypt': + with open(rf, 'rb') as f: + gpg = gnupg.GPG() + status = gpg.encrypt_file( + f, None, passphrase=getpass.getpass(rf+' password:'), symmetric=True, + output=rf+'.gpg') + r.set(const.XLINK+'href', r.get(const.XLINK+'href')+'.gpg') + rf=rf+'.gpg' self._resources.append(rf) - for i in self._doc.xml_select(u"//db:imagedata[@fileref]"): - im = os.path.join(dirname,i.fileref) + for i in self._doc.xpath(u"//db:imagedata[@fileref]",namespaces=const.XPATH): + im = os.path.join(dirname,i.get('fileref')) if os.path.isfile(im): self._resources.append(im) - for i in self._doc.xml_select(u"//html:form[@action]"): - pyscript = re.split('\.py',i.action,1)[0]+'.py' + else: + print "WARNING: File "+im+" is missing!" + for i in self._doc.xpath(u"//html:form[@action]",namespaces=const.XPATH): + pyscript = re.split('\.py',i.get('action'),1)[0]+'.py' im = os.path.join(dirname,pyscript) if os.path.isfile(im): self._resources.append(im) - def render(self): - # amara can not handle the docbook stylesheets - # xmlarticle = transform(doc,style_xslt) + def render(self, style): + +# xslt_root = etree.XML(open(style+"docbook.xsl", 'r').read()) +# transform = etree.XSLT(xslt_root) +# result = etree.tostring(transform(xml_root)) + cwd = os.getcwd() dirname = os.path.dirname(self._file) os.chdir(dirname) infile = os.path.basename(tempfile.mktemp()) outfile = tempfile.mktemp() tfi = open(infile,'w') - tfi.write(self._doc.xml_encode(omit_xml_declaration=True)) + tfi.write(etree.tostring(self._doc,encoding='UTF-8',pretty_print=False)) tfi.close() # cmd = ["saxon-xslt-xinclude","-o",outfile,infile,style_xslt] - cmd = ["xsltproc","--xinclude","--output",outfile,style_xslt,infile] + cmd = ["xsltproc","--xinclude","--output",outfile,style+"docbook.xhtml5.xsl",infile] retcode = subprocess.call(cmd) if retcode: print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']' - tfo = open(outfile,'r') + tfo = codecs.open(outfile, "r", "utf-8") self._rendered_article = tfo.read() tfo.close() os.remove(infile) os.remove(outfile) os.chdir(cwd) - def template(self,sitemap): + def template(self,sitemap,style,tdir): htmlmenu = sitemap.gen_menu(self._lang,None,"menu") levelmenu = sitemap.gen_menu(self._lang,self,"tree") langmenu = sitemap.lang_menu(self._lang,self._link) - template = Template(file=args.style+'index.'+self._lang+'.html.tmpl', - searchList=[{'title':self._title}, - {'menu':htmlmenu}, - {'article':self._rendered_article}, - {'levelmenu':levelmenu}, - {'langmenu':langmenu}]) - outfile = tmptarget+'html'.join(self._file.rsplit('xml',1)) + article = self._rendered_article + templateLoader = jinja2.FileSystemLoader( searchpath="/" ) + templateEnv = jinja2.Environment( loader=templateLoader ) + + templateVars = {'title':self._title, + 'menu':htmlmenu, + 'article':article, + 'levelmenu':levelmenu, + 'langmen':langmenu} + + s = unicode(style, "utf-8") + t = s+'index.'+self._lang+'.xhtml.tmpl' + template = templateEnv.get_template( t ) + templateout = template.render( templateVars ) + + outfile = tdir+'xhtml'.join(self._file.rsplit('xml',1)) mkdir_p(os.path.dirname(outfile)) - out = open(outfile, 'w') - out.write(str(template)) + out = codecs.open(outfile, 'w', 'utf-8') + out.write(templateout) out.close()