@@ -42,6 +42,44 @@ class MarkingsPlugin(TextyPlugin): | |||||
with | with | ||||
{% endmark %} or equivalent | {% 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): | def __init__(self, site): | ||||
super(TextyPlugin, self).__init__(site) | super(TextyPlugin, self).__init__(site) | ||||
self.open_pattern = self.default_open_pattern | self.open_pattern = self.default_open_pattern | ||||
self.close_pattern = self.default_close_pattern | self.close_pattern = self.default_close_pattern | ||||
self.template = None | self.template = None | ||||
@@ -34,8 +33,8 @@ class TextyPlugin(Plugin): | |||||
if config and hasattr(config, 'open_pattern'): | if config and hasattr(config, 'open_pattern'): | ||||
self.open_pattern = 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 | @property | ||||
def plugin_name(self): | def plugin_name(self): | ||||
@@ -89,10 +88,10 @@ class TextyPlugin(Plugin): | |||||
""" | """ | ||||
Replace a text base pattern with a template statement. | 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_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) | partial(self.text_to_tag, start=False), text) | ||||
return text | return text |
@@ -5,6 +5,8 @@ Jinja template utilties | |||||
from hyde.fs import File, Folder | from hyde.fs import File, Folder | ||||
from hyde.template import HtmlWrap, Template | from hyde.template import HtmlWrap, Template | ||||
from hyde.util import getLoggerWithNullHandler | |||||
from jinja2 import contextfunction, Environment, FileSystemLoader | from jinja2 import contextfunction, Environment, FileSystemLoader | ||||
from jinja2 import environmentfilter, Markup, Undefined, nodes | from jinja2 import environmentfilter, Markup, Undefined, nodes | ||||
from jinja2.ext import Extension | from jinja2.ext import Extension | ||||
@@ -215,6 +217,9 @@ class HydeLoader(FileSystemLoader): | |||||
""" | """ | ||||
Calls the plugins to preprocess prior to returning the source. | 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, | (contents, | ||||
filename, | filename, | ||||
date) = super(HydeLoader, self).get_source( | date) = super(HydeLoader, self).get_source( | ||||
@@ -37,12 +37,15 @@ class Generator(object): | |||||
def __getattr__(self, method_name): | def __getattr__(self, method_name): | ||||
if hasattr(Plugin, method_name): | if hasattr(Plugin, method_name): | ||||
def __call_plugins__(*args): | def __call_plugins__(*args): | ||||
#logger.debug("Calling plugin method [%s]", method_name) | |||||
res = None | res = None | ||||
if self.site.plugins: | if self.site.plugins: | ||||
for plugin in self.site.plugins: | for plugin in self.site.plugins: | ||||
if hasattr(plugin, method_name): | if hasattr(plugin, method_name): | ||||
#logger.debug( | |||||
# "\tCalling plugin [%s]", | |||||
# plugin.__class__.__name__) | |||||
function = getattr(plugin, method_name) | function = getattr(plugin, method_name) | ||||
res = function(*args) | res = function(*args) | ||||
if res: | if res: | ||||
@@ -264,7 +267,13 @@ class Generator(object): | |||||
text = self.events.begin_text_resource(resource, text) or text | text = self.events.begin_text_resource(resource, text) or text | ||||
if resource.uses_template: | if resource.uses_template: | ||||
logger.debug("Rendering [%s]", resource) | 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( | text = self.events.text_resource_complete( | ||||
resource, text) or text | resource, text) or text | ||||
target = File(self.site.config.deploy_root_path.child( | 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') | 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): | class TestMarkings(object): | ||||
@@ -23,7 +33,9 @@ class TestMarkings(object): | |||||
def tearDown(self): | def tearDown(self): | ||||
TEST_SITE.delete() | TEST_SITE.delete() | ||||
def test_markings(self): | |||||
def test_mark(self): | |||||
text = u""" | text = u""" | ||||
=== | === | ||||
is_processable: False | is_processable: False | ||||
@@ -57,13 +69,48 @@ Hyde & Jinja. | |||||
site.load() | site.load() | ||||
gen = Generator(site) | gen = Generator(site) | ||||
gen.load_template_if_needed() | gen.load_template_if_needed() | ||||
template = gen.template | template = gen.template | ||||
html = template.render(text2, {}).strip() | 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) |