X-Git-Url: https://source.tree.se/git?p=treecutter.git;a=blobdiff_plain;f=treecutter%2Fpage.py;fp=treecutter%2Fpage.py;h=8843df975a45bf45204f5db7c1a3fe08b698341a;hp=dea69e6992a6d505ac5ccf448e0551f20aeb07f7;hb=b011c30d2ca867e3e68451c7a3bfced704216fc1;hpb=369be7201d9703391d90d488cca8862b903ef15e diff --git a/treecutter/page.py b/treecutter/page.py index dea69e6..8843df9 100644 --- a/treecutter/page.py +++ b/treecutter/page.py @@ -7,11 +7,12 @@ import getpass import gnupg import codecs from lxml import etree +from lxml.builder import ElementMaker #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.docbook import Docbook from treecutter.tools import mkdir_p class Page(): @@ -39,103 +40,17 @@ class Page(): self._rendered_article = art def prepare(self): - 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.xpath(u"//xi:include[@parse='text']",namespaces=const.XPATH) - if code: - for c in code: - 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)+'/'+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 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) + self._doc = Docbook(self._file) + (self._title, self._menu) = self._doc.title() +# self._doc.expand_imageobjects() + self._doc.parse_xincludes() + doc = self._doc.collect_links() + img = self._doc.collect_images() + form= self._doc.collect_forms() + self._resources = doc + img + form - 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.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) - 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): - -# 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(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.xhtml5.xsl",infile] - retcode = subprocess.call(cmd) - if retcode: - print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']' - tfo = codecs.open(outfile, "r", "utf-8") - self._rendered_article = tfo.read() - tfo.close() - os.remove(infile) - os.remove(outfile) - os.chdir(cwd) + def render(self, transform): + self._rendered_article = self._doc.xslt(transform['xhtml5']) def template(self,sitemap,style,tdir,subdir): htmlmenu = sitemap.gen_menu(self._lang,None,"menu")