summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/plugin.js5
-rw-r--r--lib/template.js12
-rw-r--r--test/plugins.js27
-rw-r--r--test/plugins/filters/index.js3
4 files changed, 40 insertions, 7 deletions
diff --git a/lib/plugin.js b/lib/plugin.js
index fa38e20..79da7d7 100644
--- a/lib/plugin.js
+++ b/lib/plugin.js
@@ -115,7 +115,10 @@ Plugin.prototype.getFilters = function() {
return [
key,
function() {
- var ctx = this;
+ var ctx = {
+ ctx: this.ctx,
+ book: that.book
+ };
var args = Array.prototype.slice.apply(arguments);
var callback = _.last(args);
diff --git a/lib/template.js b/lib/template.js
index 69a1bd5..4b3fdbe 100644
--- a/lib/template.js
+++ b/lib/template.js
@@ -69,14 +69,16 @@ var TemplateEngine = function(book) {
// Add filter
-TemplateEngine.prototype.addFilter = function(key, filter) {
- if (this.env.getFilter(filterName)) {
+TemplateEngine.prototype.addFilter = function(filterName, func) {
+ try {
+ this.env.getFilter(filterName);
this.log.warn.ln("conflict in filters, '"+filterName+"' is already set");
return false;
+ } catch(e) {
+ this.log.debug.ln("add filter '"+filterName+"'");
+ this.env.addFilter(filterName, func, true);
+ return true;
}
- this.log.debug.ln("add filter '"+key+"'");
- this.env.addFilter(key, func, true);
- return true;
};
// Render a string from the book
diff --git a/test/plugins.js b/test/plugins.js
index cd46246..266596b 100644
--- a/test/plugins.js
+++ b/test/plugins.js
@@ -40,14 +40,39 @@ describe('Plugins', function () {
var plugin = new Plugin(books[0], "filters");
plugin.load("./filters", PLUGINS_ROOT);
+ before(function(done) {
+ qdone(books[0].plugins.load(plugin), done);
+ });
+
it('should valid a plugin', function() {
assert(plugin.isValid());
});
it('should return a map of filters', function() {
var filters = plugin.getFilters();
- assert.equal(_.size(filters), 1);
+ assert.equal(_.size(filters), 2);
assert(filters["hello"]);
+ assert(filters["helloCtx"]);
+ });
+
+ it('should correctly extend template filters', function(done) {
+ qdone(
+ books[0].template.renderString('{{ "World"|hello }}')
+ .then(function(content) {
+ assert.equal(content, "Hello World");
+ }),
+ done
+ );
+ });
+
+ it('should correctly set book as context', function(done) {
+ qdone(
+ books[0].template.renderString('{{ "root"|helloCtx }}')
+ .then(function(content) {
+ assert.equal(content, "root:"+books[0].root);
+ }),
+ done
+ );
});
});
});
diff --git a/test/plugins/filters/index.js b/test/plugins/filters/index.js
index 0087ba1..0e2f1a2 100644
--- a/test/plugins/filters/index.js
+++ b/test/plugins/filters/index.js
@@ -2,6 +2,9 @@ module.exports = {
filters: {
hello: function(text) {
return "Hello "+text;
+ },
+ helloCtx: function(text) {
+ return text+":"+this.book.root;
}
}
}; \ No newline at end of file