Rough in Genshi support
This commit is contained in:
parent
3e1c9bcb3e
commit
c71fa3823f
30
filters/addsearch.genshi
Normal file
30
filters/addsearch.genshi
Normal file
@ -0,0 +1,30 @@
|
||||
<html xmlns:py="http://genshi.edgewall.org/" py:strip="">
|
||||
|
||||
<!--! insert search form -->
|
||||
<div py:match="div[@id='sidebar']" py:attrs="select('@*')">
|
||||
${select('*')}
|
||||
<h2>Search</h2>
|
||||
<form><input name="q"/></form>
|
||||
</div>
|
||||
|
||||
<?python from urlparse import urljoin ?>
|
||||
|
||||
<!--! insert opensearch autodiscovery link -->
|
||||
<head py:match="head" py:attrs="select('@*')">
|
||||
${select('*')}
|
||||
<link rel="search" type="application/opensearchdescription+xml"
|
||||
href="${urljoin(str(select('link[@rel=\'alternate\']/@href')),
|
||||
'opensearchdescription.xml')}"
|
||||
title="${select('link[@rel=\'alternate\']/@title')} search"/>
|
||||
</head>
|
||||
|
||||
<!--! ensure that scripts don't use empty tag syntax -->
|
||||
<script py:match="script" py:attrs="select('@*')">
|
||||
${select('*')}
|
||||
</script>
|
||||
|
||||
<!--! Include the original stream, which will be processed by the rules
|
||||
defined above -->
|
||||
${input}
|
||||
|
||||
</html>
|
63
filters/addsearch.xslt
Normal file
63
filters/addsearch.xslt
Normal file
@ -0,0 +1,63 @@
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
exclude-result-prefixes="xhtml">
|
||||
|
||||
<!-- insert search form -->
|
||||
<xsl:template match="xhtml:div[@id='sidebar']">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="@*|node()"/>
|
||||
<xhtml:h2>Search</xhtml:h2>
|
||||
<xhtml:form><xhtml:input name="q"/></xhtml:form>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<!-- function to return baseuri of a given string -->
|
||||
<xsl:template name="baseuri">
|
||||
<xsl:param name="string" />
|
||||
<xsl:if test="contains($string, '/')">
|
||||
<xsl:value-of select="substring-before($string, '/')"/>
|
||||
<xsl:text>/</xsl:text>
|
||||
<xsl:call-template name="baseuri">
|
||||
<xsl:with-param name="string">
|
||||
<xsl:value-of select="substring-after($string, '/')"/>
|
||||
</xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<!-- insert opensearch autodiscovery link -->
|
||||
<xsl:template match="xhtml:head">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="@*|node()"/>
|
||||
<xhtml:link rel="search" type="application/opensearchdescription+xml" title="{xhtml:link[@rel='alternate']/@title} search">
|
||||
<xsl:attribute name="href">
|
||||
<xsl:call-template name="baseuri">
|
||||
<xsl:with-param name="string">
|
||||
<xsl:value-of select="xhtml:link[@rel='alternate']/@href"/>
|
||||
</xsl:with-param>
|
||||
</xsl:call-template>
|
||||
<xsl:text>opensearchdescription.xml</xsl:text>
|
||||
</xsl:attribute>
|
||||
</xhtml:link>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<!-- ensure that scripts don't use empty tag syntax -->
|
||||
<xsl:template match="xhtml:script">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="@*|node()"/>
|
||||
<xsl:if test="not(node())">
|
||||
<xsl:comment><!--HTML Compatibility--></xsl:comment>
|
||||
</xsl:if>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<!-- pass through everything else -->
|
||||
<xsl:template match="@*|node()">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="@*|node()"/>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
@ -30,7 +30,7 @@ def run(template_file, doc, mode='template'):
|
||||
if not mode in logged_modes:
|
||||
log.info("%s search path:", mode)
|
||||
for template_dir in dirs:
|
||||
log.error(" %s", os.path.realpath(template_dir))
|
||||
log.info(" %s", os.path.realpath(template_dir))
|
||||
logged_modes.append(mode)
|
||||
return
|
||||
template_resolved = os.path.realpath(template_resolved)
|
||||
@ -44,7 +44,10 @@ def run(template_file, doc, mode='template'):
|
||||
base,ext = os.path.splitext(os.path.basename(template_resolved))
|
||||
module_name = ext[1:]
|
||||
try:
|
||||
module = __import__(module_name)
|
||||
try:
|
||||
module = __import__("_" + module_name)
|
||||
except:
|
||||
module = __import__(module_name)
|
||||
except Exception, inst:
|
||||
return log.error("Skipping %s '%s' after failing to load '%s': %s",
|
||||
mode, template_resolved, module_name, inst)
|
||||
|
23
planet/shell/_genshi.py
Normal file
23
planet/shell/_genshi.py
Normal file
@ -0,0 +1,23 @@
|
||||
from StringIO import StringIO
|
||||
|
||||
from genshi.input import XMLParser
|
||||
from genshi.template import Context, MarkupTemplate
|
||||
|
||||
def run(script, doc, output_file=None, options={}):
|
||||
""" process an Genshi template """
|
||||
|
||||
context = Context(**options)
|
||||
|
||||
tmpl_fileobj = open(script)
|
||||
tmpl = MarkupTemplate(tmpl_fileobj, script)
|
||||
tmpl_fileobj.close()
|
||||
|
||||
context.push({'input':XMLParser(StringIO(doc))})
|
||||
output=tmpl.generate(context).render('xml')
|
||||
|
||||
if output_file:
|
||||
out_file = open(output_file,'w')
|
||||
out_file.write(output)
|
||||
out_file.close()
|
||||
else:
|
||||
return output
|
18
tests/data/filter/index.html
Normal file
18
tests/data/filter/index.html
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<head><link rel="stylesheet" href="default.css" type="text/css"/><title>Planet Intertwingly</title><meta name="robots" content="noindex,nofollow"/><meta name="generator" content="Venus"/><link rel="alternate" href="http://planet.intertwingly.net/atom.xml" title="Planet Intertwingly" type="application/atom+xml"/><link rel="shortcut icon" href="/favicon.ico"/><script type="text/javascript" src="personalize.js"/></head>
|
||||
|
||||
<body>
|
||||
<h1>Planet Intertwingly</h1>
|
||||
|
||||
<div id="body">
|
||||
|
||||
<h2 class="date">April 14, 2007</h2>
|
||||
|
||||
</div><h1>Footnotes</h1>
|
||||
|
||||
<div id="sidebar"><h2>Info</h2><dl><dt>Last updated:</dt><dd><span class="date" title="GMT">April 14, 2007 02:01 PM</span></dd><dt>Powered by:</dt><dd><a href="http://intertwingly.net/code/venus/"><img src="images/venus.png" width="80" height="15" alt="Venus" border="0"/></a></dd><dt>Export:</dt><dd><ul><li><a href="opml.xml"><img src="images/opml.png" alt="OPML"/></a></li><li><a href="foafroll.xml"><img src="images/foaf.png" alt="FOAF"/></a></li></ul></dd></dl></div>
|
||||
|
||||
</body></html>
|
22
tests/test_filter_genshi.py
Normal file
22
tests/test_filter_genshi.py
Normal file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import unittest, xml.dom.minidom
|
||||
from planet import shell, config, logger
|
||||
|
||||
class GenshiFilterTests(unittest.TestCase):
|
||||
|
||||
def test_addsearch_filter(self):
|
||||
testfile = 'tests/data/filter/index.html'
|
||||
filter = 'addsearch.genshi'
|
||||
output = shell.run(filter, open(testfile).read(), mode="filter")
|
||||
self.assertTrue(output.find('<h2>Search</h2>')>=0)
|
||||
self.assertTrue(output.find('<form><input name="q"/></form>')>=0)
|
||||
self.assertTrue(output.find(' href="http://planet.intertwingly.net/opensearchdescription.xml"')>=0)
|
||||
self.assertTrue(output.find('</script>')>=0)
|
||||
|
||||
try:
|
||||
import genshi
|
||||
except:
|
||||
logger.warn("genshi is not available => can't test genshi filters")
|
||||
for method in dir(GenshiFilterTests):
|
||||
if method.startswith('test_'): delattr(GenshiFilterTests,method)
|
@ -15,6 +15,15 @@ class XsltFilterTests(unittest.TestCase):
|
||||
catterm = dom.getElementsByTagName('category')[0].getAttribute('term')
|
||||
self.assertEqual('OnE', catterm)
|
||||
|
||||
def test_addsearch_filter(self):
|
||||
testfile = 'tests/data/filter/index.html'
|
||||
filter = 'addsearch.xslt'
|
||||
output = shell.run(filter, open(testfile).read(), mode="filter")
|
||||
self.assertTrue(output.find('<h2>Search</h2>')>=0)
|
||||
self.assertTrue(output.find('<form><input name="q"/></form>')>=0)
|
||||
self.assertTrue(output.find(' href="http://planet.intertwingly.net/opensearchdescription.xml"')>=0)
|
||||
self.assertTrue(output.find('</script>')>=0)
|
||||
|
||||
try:
|
||||
import libxslt
|
||||
except:
|
||||
@ -26,3 +35,4 @@ except:
|
||||
except:
|
||||
logger.warn("libxslt is not available => can't test xslt filters")
|
||||
del XsltFilterTests.test_xslt_filter
|
||||
del XsltFilterTests.test_addsearch_filter
|
||||
|
Loading…
Reference in New Issue
Block a user