def render_template(self, jinja_template, page_title, **context): from ferenda import DocumentRepository repo = DocumentRepository(config=self.repo.config) jinja_template = """ <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>%(page_title)s</title></head> <body> <div> %(jinja_template)s </div> </body> </html> """ % (locals()) t = Template(jinja_template, autoescape=True) text = t.render(context).encode("utf-8") try: xhtml = etree.parse(BytesIO(text)) except XMLSyntaxError as e: raise ValueError("invalid xhtml from template: %s\n%s" % (e, text.decode("utf-8"))) conffile = os.sep.join([repo.config.datadir, 'rsrc', 'resources.xml']) transformer = Transformer('XSLT', "xsl/generic.xsl", "xsl", resourceloader=repo.resourceloader, config=conffile) urltransform = None if 'develurl' in repo.config and repo.config.develurl: urltransform = repo.get_url_transform_func( develurl=repo.config.develurl) depth = 2 # len(doc.uri.split("/")) - 3 tree = transformer.transform(xhtml, depth, uritransform=urltransform) data = etree.tostring(tree, encoding="utf-8") return Response(data, mimetype="text/html")
def test_doctype(self): base = self.datadir+os.sep util.ensure_dir(base+"teststyle-doctype.xslt") with open(base+"teststyle-doctype.xslt","w") as fp: fp.write("""<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" doctype-system="about:legacy-compat" omit-xml-declaration="yes" encoding='utf-8' indent="yes"/> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="/doc/title"/></title> </head> <body> <h1>hello world</h1> </body> </html> </xsl:template> </xsl:stylesheet> """) with open(base+"infile.xml","w") as fp: fp.write("""<doc><title>Document title</title></doc>""") t = Transformer("XSLT", base+"teststyle-doctype.xslt", "xsl", None, "") t.transform_file(base+"infile.xml", base+"outfile.xml") self.assertTrue(util.readfile(base+"outfile.xml").startswith('<!DOCTYPE html SYSTEM "about:legacy-compat">'))
def test_depth(self): xsltfile = self.datadir+os.sep+"notused.xslt" util.writefile(xsltfile, '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>') t = Transformer("XSLT", xsltfile, "xsl", None, "data") self.assertEqual(0, t._depth("data", "data/index.html")) self.assertEqual(1, t._depth("data/repo", "data/index.html")) self.assertEqual(3, t._depth("data/repo/toc/title", "data/index.html"))
def _transform(self, title, body, environ, template="xsl/error.xsl"): fakerepo = self.repos[0] doc = fakerepo.make_document() doc.uri = request_uri(environ) doc.meta.add((URIRef(doc.uri), DCTERMS.title, Literal(title, lang="sv"))) doc.body = body xhtml = fakerepo.render_xhtml_tree(doc) conffile = os.sep.join([self.config.datadir, 'rsrc', 'resources.xml']) transformer = Transformer('XSLT', template, "xsl", resourceloader=fakerepo.resourceloader, config=conffile) urltransform = None if 'develurl' in self.config: urltransform = fakerepo.get_url_transform_func( repos=self.repos, develurl=self.config.develurl, wsgiapp=self) depth = len(doc.uri.split("/")) - 3 tree = transformer.transform(xhtml, depth, uritransform=urltransform) return etree.tostring(tree, encoding="utf-8")
def _setup_files(self, paramfile): base = self.datadir+os.sep util.ensure_dir(base+"teststyle.xslt") with open(base+"teststyle.xslt","w") as fp: fp.write("""<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="value"/> <xsl:param name="file"/> <xsl:variable name="content" select="document($file)/root/*"/> <xsl:template match="/"> <output> <paramvalue><xsl:value-of select="$value"/></paramvalue> <paramfile><xsl:copy-of select="$content"/></paramfile> <infile><xsl:value-of select="/doc/title"/></infile> </output> </xsl:template> </xsl:stylesheet> """) with open(base+paramfile,"w") as fp: fp.write("""<root><node key='value'><subnode>textnode</subnode></node></root>""") with open(base+"infile.xml","w") as fp: fp.write("""<doc><title>Document title</title></doc>""") return Transformer("XSLT", base+"teststyle.xslt", "xsl", None, "")