@@ -42,6 +42,44 @@ class MarkingsPlugin(TextyPlugin): | |||
with | |||
{% endmark %} or equivalent | |||
""" | |||
text = super(MarkingsPlugin, self).text_to_tag(match, start) | |||
print text | |||
return text | |||
return super(MarkingsPlugin, self).text_to_tag(match, start) | |||
class ReferencePlugin(TextyPlugin): | |||
""" | |||
The plugin class for reference text replacement. | |||
""" | |||
def __init__(self, site): | |||
super(ReferencePlugin, self).__init__(site) | |||
@property | |||
def tag_name(self): | |||
""" | |||
The refer tag. | |||
""" | |||
return 'refer to' | |||
@property | |||
def default_open_pattern(self): | |||
""" | |||
The default pattern for mark open text. | |||
""" | |||
return u'^※\s*([^\s]+)\s*as\s*([A-Za-z0-9_\-]+)\s*$' | |||
@property | |||
def default_close_pattern(self): | |||
""" | |||
No close pattern. | |||
""" | |||
return None | |||
def text_to_tag(self, match, start=True): | |||
""" | |||
Replace open pattern (default: ※ inc.md as inc) | |||
with | |||
{% refer to "inc.md" as inc %} or equivalent. | |||
""" | |||
if not match.lastindex: | |||
return '' | |||
params = '"%s" as %s' % (match.groups(1)[0], match.groups(1)[1]) | |||
return self.template.get_open_tag(self.tag_name, params) |
@@ -25,7 +25,6 @@ class TextyPlugin(Plugin): | |||
def __init__(self, site): | |||
super(TextyPlugin, self).__init__(site) | |||
self.open_pattern = self.default_open_pattern | |||
self.close_pattern = self.default_close_pattern | |||
self.template = None | |||
@@ -34,8 +33,8 @@ class TextyPlugin(Plugin): | |||
if config and hasattr(config, 'open_pattern'): | |||
self.open_pattern = config.open_pattern | |||
if config and hasattr(config, 'close_pattern'): | |||
self.open_pattern = config.close_pattern | |||
if self.close_pattern and config and hasattr(config, 'close_pattern'): | |||
self.close_pattern = config.close_pattern | |||
@property | |||
def plugin_name(self): | |||
@@ -89,10 +88,10 @@ class TextyPlugin(Plugin): | |||
""" | |||
Replace a text base pattern with a template statement. | |||
""" | |||
text_open = re.compile(self.open_pattern, re.MULTILINE) | |||
text_close = re.compile(self.close_pattern, re.MULTILINE) | |||
text_open = re.compile(self.open_pattern, re.UNICODE|re.MULTILINE) | |||
text = text_open.sub(self.text_to_tag, text) | |||
text = text_close.sub( | |||
if self.close_pattern: | |||
text_close = re.compile(self.close_pattern, re.UNICODE|re.MULTILINE) | |||
text = text_close.sub( | |||
partial(self.text_to_tag, start=False), text) | |||
return text |
@@ -5,6 +5,8 @@ Jinja template utilties | |||
from hyde.fs import File, Folder | |||
from hyde.template import HtmlWrap, Template | |||
from hyde.util import getLoggerWithNullHandler | |||
from jinja2 import contextfunction, Environment, FileSystemLoader | |||
from jinja2 import environmentfilter, Markup, Undefined, nodes | |||
from jinja2.ext import Extension | |||
@@ -215,6 +217,9 @@ class HydeLoader(FileSystemLoader): | |||
""" | |||
Calls the plugins to preprocess prior to returning the source. | |||
""" | |||
print "Loading Template %s" % template | |||
logger = getLoggerWithNullHandler('HydeLoader') | |||
logger.debug("Loading template [%s] and preprocessing" % template) | |||
(contents, | |||
filename, | |||
date) = super(HydeLoader, self).get_source( | |||
@@ -37,12 +37,15 @@ class Generator(object): | |||
def __getattr__(self, method_name): | |||
if hasattr(Plugin, method_name): | |||
def __call_plugins__(*args): | |||
#logger.debug("Calling plugin method [%s]", method_name) | |||
res = None | |||
if self.site.plugins: | |||
for plugin in self.site.plugins: | |||
if hasattr(plugin, method_name): | |||
#logger.debug( | |||
# "\tCalling plugin [%s]", | |||
# plugin.__class__.__name__) | |||
function = getattr(plugin, method_name) | |||
res = function(*args) | |||
if res: | |||
@@ -264,7 +267,13 @@ class Generator(object): | |||
text = self.events.begin_text_resource(resource, text) or text | |||
if resource.uses_template: | |||
logger.debug("Rendering [%s]", resource) | |||
text = self.template.render(text, context) | |||
try: | |||
text = self.template.render(text, context) | |||
except Exception: | |||
logger.error("Error occurred when" | |||
" processing template:[%s]" % resource) | |||
raise | |||
text = self.events.text_resource_complete( | |||
resource, text) or text | |||
target = File(self.site.config.deploy_root_path.child( | |||
@@ -12,6 +12,16 @@ from pyquery import PyQuery | |||
TEST_SITE = File(__file__).parent.parent.child_folder('_test') | |||
def assert_valid_conversion(html): | |||
assert html | |||
q = PyQuery(html) | |||
assert "is_processable" not in html | |||
assert q("h1") | |||
assert "This is a" in q("h1").text() | |||
assert "heading" in q("h1").text() | |||
assert q(".amp").length == 1 | |||
assert "mark" not in html | |||
assert "reference" not in html | |||
class TestMarkings(object): | |||
@@ -23,7 +33,9 @@ class TestMarkings(object): | |||
def tearDown(self): | |||
TEST_SITE.delete() | |||
def test_markings(self): | |||
def test_mark(self): | |||
text = u""" | |||
=== | |||
is_processable: False | |||
@@ -57,13 +69,48 @@ Hyde & Jinja. | |||
site.load() | |||
gen = Generator(site) | |||
gen.load_template_if_needed() | |||
template = gen.template | |||
html = template.render(text2, {}).strip() | |||
assert html | |||
q = PyQuery(html) | |||
assert "is_processable" not in html | |||
assert "This is a" in q("h1").text() | |||
assert "heading" in q("h1").text() | |||
assert q(".amp").length == 1 | |||
assert "mark" not in html | |||
assert "reference" not in html | |||
assert_valid_conversion(html) | |||
def test_reference(self): | |||
text = u""" | |||
=== | |||
is_processable: False | |||
=== | |||
{% filter markdown|typogrify %} | |||
§§ heading | |||
This is a heading | |||
================= | |||
§§ heading. | |||
§§ content | |||
Hyde & Jinja. | |||
§§ . | |||
{% endfilter %} | |||
""" | |||
text2 = u""" | |||
※ inc.md as inc | |||
{% filter markdown|typogrify %} | |||
{{ inc.heading }} | |||
{{ inc.content }} | |||
{% endfilter %} | |||
""" | |||
site = Site(TEST_SITE) | |||
site.config.plugins = [ | |||
'hyde.ext.plugins.meta.MetaPlugin', | |||
'hyde.ext.plugins.markings.MarkingsPlugin', | |||
'hyde.ext.plugins.markings.ReferencePlugin'] | |||
inc = File(site.content.source_folder.child('inc.md')) | |||
inc.write(text.strip()) | |||
src = File(site.content.source_folder.child('src.html')) | |||
src.write(text2.strip()) | |||
gen = Generator(site) | |||
gen.generate_all() | |||
f = File(site.config.deploy_root_path.child(src.name)) | |||
assert f.exists | |||
html = f.read_all() | |||
assert_valid_conversion(html) |