X-Git-Url: https://source.tree.se/git?a=blobdiff_plain;f=treecutter%2Fpage.py;h=53eeb0d40baa357f18c7f76d98404b8ed1206518;hb=870b74488439f6c30974eb759d5032fc06cb8c14;hp=54ed95768959790d8d61874da1bc5fb1a436d7a6;hpb=e528907257ce0fb5b990cbaa7ed644ceb7085836;p=treecutter.git diff --git a/treecutter/page.py b/treecutter/page.py index 54ed957..53eeb0d 100644 --- a/treecutter/page.py +++ b/treecutter/page.py @@ -2,9 +2,13 @@ import os import subprocess import tempfile -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 @@ -35,79 +39,99 @@ class Page(): self._rendered_article = art def prepare(self): - self._doc = bindery.parse(self._file, prefixes=const.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) cwd = os.getcwd() - code = self._doc.xml_select(u"//xi:include[@parse='text']") + 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) + 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 = [] - script = os.path.join(os.path.abspath(dirname)+'/'+c.href) + script = os.path.join(os.path.abspath(dirname)+'/'+href) if os.path.isfile(script): exe.append(script) else: - if c.href in resource_listdir('xinclude', ''): - script = resource_filename('xinclude', c.href) + if href in resource_listdir('xinclude', ''): + script = resource_filename('xinclude', href) exe.append(script) else: - print "Script "+c.href+" in "+self._file+" missing" - if c.xml_select(u"//xi:include[@accept-language]"): - alang = c.xml_attributes[None, "accept-language"] + 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) - print " executing %15s" % (c.href), + if xpointer: + exe.append("xptr="+xpointer) + print " executing %15s" % (href), ts = time() os.chdir(dirname) - xml = subprocess.Popen(exe,stdout=subprocess.PIPE) + xml = subprocess.Popen(exe,stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + (stdout, stderr) = xml.communicate() + if stderr: + print " ".join(exe)+" ERROR : [ "+stderr+" ]" os.chdir(cwd) - xmlblock = str(xml.stdout.read()) te = time() - print " [%5.2f s] (%s)" % (round(te-ts,2),c.xpointer) - xstr = bindery.parse(xmlblock) - 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) + 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, style): - # amara can not handle the docbook stylesheets - # xmlarticle = transform(doc,style_xslt) + +# 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+"docbook.xsl",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) @@ -118,14 +142,23 @@ class Page(): 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=style+'index.'+self._lang+'.html.tmpl', - searchList=[{'title':self._title}, - {'menu':htmlmenu}, - {'article':self._rendered_article}, - {'levelmenu':levelmenu}, - {'langmenu':langmenu}]) - outfile = tdir+'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()