diff --git a/README.md b/README.md index a0871454b..2ad12d29a 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,25 @@ engine.registerTag('upper', { See existing tag implementations here: +## Plugin API + +A pack of tags or filters can be encapsulated into a **plugin**, which will be typically installed via npm. + +```javascript +engine.plugin(require('./some-plugin')); + +// some-plugin.js +module.exports = function (Liquid) { + // here `this` refers to the engine instance + // `Liquid` provides facilities to implement tags and filters + this.registerFilter('foo', x => x); +} +``` + +Plugin List: + +* To add your plugin, contact me or simply send a PR. + [nunjucks]: http://mozilla.github.io/nunjucks/ [liquid-node]: https://github.com/sirlantis/liquid-node [shopify/liquid]: https://shopify.github.io/liquid/ diff --git a/src/index.js b/src/index.js index 403bf520f..2125e60a4 100644 --- a/src/index.js +++ b/src/index.js @@ -75,6 +75,9 @@ const _engine = { registerTag: function (name, tag) { return this.tag.register(name, tag) }, + plugin: function (plugin) { + return plugin.call(this, Liquid) + }, express: function (opts) { opts = opts || {} const self = this diff --git a/test/unit/index.js b/test/unit/index.js index e987c718c..cb8844ee7 100644 --- a/test/unit/index.js +++ b/test/unit/index.js @@ -12,6 +12,24 @@ describe('Liquid', function () { }).to.throw(/illegal root/) }) }) + describe('#plugin()', function () { + it('should call plugin on the instance', async function () { + const engine = new Liquid() + engine.plugin(function (Liquid) { + this.registerFilter('foo', x => `foo${x}foo`) + }) + const html = await engine.parseAndRender('{{"bar"|foo}}') + expect(html).to.equal('foobarfoo') + }) + it('should call plugin with Liquid', async function () { + const engine = new Liquid() + engine.plugin(function (Liquid) { + this.registerFilter('t', x => Liquid.isFalsy(x)) + }) + const html = await engine.parseAndRender('{{false|t}}') + expect(html).to.equal('true') + }) + }) describe('#express()', function () { const liquid = new Liquid({root: '/root'}) const render = liquid.express()