diff --git a/lib/renderer.js b/lib/renderer.js index 78b2b92..69ac0f1 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -132,7 +132,11 @@ module.exports = function(data, options) { } }); + // exec filter to extend renderer. + const renderer = new Renderer(); + this.execFilterSync('marked:renderer', renderer, {context: this}); + return marked(data.text, Object.assign({ - renderer: new Renderer() + renderer }, this.config.marked, options, siteCfg)); }; diff --git a/package.json b/package.json index 54243be..e5d25f6 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "chai": "^4.2.0", "eslint": "^6.0.1", "eslint-config-hexo": "^4.0.0", + "hexo": "^4.2.0", "mocha": "^6.1.4", "nyc": "^14.1.1" }, diff --git a/test/index.js b/test/index.js index 5095593..50a287e 100644 --- a/test/index.js +++ b/test/index.js @@ -2,15 +2,17 @@ require('chai').should(); const { highlight, encodeURL } = require('hexo-util'); +const Hexo = require('hexo'); describe('Marked renderer', () => { - const ctx = { + const hexo = new Hexo(__dirname, {silent: true}); + const ctx = Object.assign(hexo, { config: { marked: {} } - }; + }); - const r = require('../lib/renderer').bind(ctx); + const r = require('../lib/renderer').bind(hexo); it('default', () => { const code = 'console.log("Hello world");'; @@ -140,13 +142,14 @@ describe('Marked renderer', () => { }); describe('autolink option tests', () => { - const ctx = { + const hexo = new Hexo(__dirname, {silent: true}); + const ctx = Object.assign(hexo, { config: { marked: { autolink: true } } - }; + }); const renderer = require('../lib/renderer'); @@ -192,13 +195,14 @@ describe('Marked renderer', () => { }); describe('sanitizeUrl option tests', () => { - const ctx = { + const hexo = new Hexo(__dirname, {silent: true}); + const ctx = Object.assign(hexo, { config: { marked: { sanitizeUrl: true } } - }; + }); const renderer = require('../lib/renderer'); @@ -239,13 +243,14 @@ describe('Marked renderer', () => { const renderer = require('../lib/renderer'); - const ctx = { + const hexo = new Hexo(__dirname, {silent: true}); + const ctx = Object.assign(hexo, { config: { marked: { modifyAnchors: '' } } - }; + }); it('should not modify anchors with default options', () => { const r = renderer.bind(ctx); @@ -294,7 +299,8 @@ describe('Marked renderer', () => { const renderer = require('../lib/renderer'); - const ctx = { + const hexo = new Hexo(__dirname, {silent: true}); + const ctx = Object.assign(hexo, { config: { marked: { prependRoot: false @@ -303,7 +309,7 @@ describe('Marked renderer', () => { root: '/blog/', relative_link: false } - }; + }); it('should not modify image path with default option', () => { const r = renderer.bind(ctx); @@ -344,7 +350,8 @@ describe('Marked renderer', () => { describe('external_link', () => { const renderer = require('../lib/renderer'); - const ctx = { + const hexo = new Hexo(__dirname, {silent: true}); + const ctx = Object.assign(hexo, { config: { marked: { external_link: { @@ -353,7 +360,7 @@ describe('Marked renderer', () => { }, url: 'http://example.com' } - }; + }); it('disable', () => { const body = '[foo](http://bar.com/)'; @@ -422,7 +429,8 @@ describe('Marked renderer', () => { describe('nofollow', () => { const renderer = require('../lib/renderer'); - const ctx = { + const hexo = new Hexo(__dirname, {silent: true}); + const ctx = Object.assign(hexo, { config: { marked: { external_link: { @@ -433,7 +441,7 @@ describe('Marked renderer', () => { }, url: 'http://example.com' } - }; + }); const body = [ '[foo](http://foo.com/)', @@ -560,4 +568,33 @@ describe('Marked renderer', () => { 'a"b

\n' ].join('\n')); }); + + describe('exec filter to extend', () => { + it('should execute filter registered to marked:renderer', () => { + const hexo = new Hexo(__dirname, {silent: true}); + hexo.extend.filter.register('marked:renderer', renderer => { + renderer.image = function(href, title, text) { + return ``; + }; + }); + + const urlA = '/foo/bár.jpg'; + const urlB = 'http://fóo.com/bar.jpg'; + + const body = [ + `![](${urlA})`, + `![](${urlB})` + ].join('\n'); + + const renderer = require('../lib/renderer'); + const r = renderer.bind(hexo); + + const result = r({text: body}); + + result.should.eql([ + `

`, + `

\n` + ].join('\n')); + }); + }); });