From 89f4bd9cb6a8ac159176cb687872b48a873a66d7 Mon Sep 17 00:00:00 2001 From: Eumeryx Date: Mon, 9 May 2022 17:12:01 +0800 Subject: [PATCH 1/4] feat: add marked:extensions support --- lib/renderer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/renderer.js b/lib/renderer.js index 26a36e5..feb0f7c 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -213,6 +213,10 @@ module.exports = function(data, options) { const tokenizer = new Tokenizer(); this.execFilterSync('marked:tokenizer', tokenizer, {context: this}); + const extensions = []; + this.execFilterSync('marked:extensions', extensions, {context: this}); + marked.use({extensions}); + let postPath = ''; if (path && post_asset_folder && prependRoot && postAsset) { const Post = this.model('Post'); From adfa4019bbde3927be5964315322a08ea5eaaf50 Mon Sep 17 00:00:00 2001 From: Eumeryx Date: Mon, 9 May 2022 17:14:13 +0800 Subject: [PATCH 2/4] test: fix typo --- test/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.js b/test/index.js index 1205b0a..f1b6970 100644 --- a/test/index.js +++ b/test/index.js @@ -899,7 +899,7 @@ describe('Marked renderer', () => { ].join('\n')); }); - it('should execute filter registered to marked:renderer', () => { + it('should execute filter registered to marked:tokenizer', () => { const smartypants = str => { return str.replace(/---/g, '\u2014'); }; From afcf503c1c1448e20294fc48e05cedd6b4e129d2 Mon Sep 17 00:00:00 2001 From: Eumeryx Date: Mon, 9 May 2022 18:06:50 +0800 Subject: [PATCH 3/4] test(extensions): add marked:extensions test --- test/index.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/index.js b/test/index.js index f1b6970..96569e7 100644 --- a/test/index.js +++ b/test/index.js @@ -921,6 +921,38 @@ describe('Marked renderer', () => { const result = r({text: body}); result.should.eql(`

${smartypants(body)}

\n`); }); + + it('should execute filter registered to marked:extensions', () => { + hexo.extend.filter.register('marked:extensions', extensions => { + extensions.push({ + name: 'blockMath', + level: 'block', + tokenizer(src) { + const cap = /^\s{0,3}\$\$((?:[^\n]|\n[^\n])+?)\n{0,1}\$\$/.exec(src); + + if (cap !== null) { + return { + type: 'blockMath', + raw: cap[0], + math: cap[1] + }; + } + + return undefined; + }, + renderer(token) { + return `

${escapeHTML(token.math)}

\n`; + } + }); + }); + + const body = '$$E=mc^2$$'; + + const r = require('../lib/renderer').bind(hexo); + + const result = r({text: body}); + result.should.eql(`

${escapeHTML('E=mc^2')}

\n`); + }); }); describe('nunjucks', () => { From a50c060dafc619b1dac78af24bc3275738010c23 Mon Sep 17 00:00:00 2001 From: Eumeryx Date: Mon, 9 May 2022 18:29:41 +0800 Subject: [PATCH 4/4] docs(extensions): add extensions example --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index 8d88e87..6480ea6 100644 --- a/README.md +++ b/README.md @@ -233,6 +233,39 @@ hexo.extend.filter.register('marked:tokenizer', function(tokenizer) { }); ``` +#### Extensions + +It is also possible to customize the [extensions](https://marked.js.org/using_pro#extensions). +For example, use [KaTeX](https://katex.org/) to render block-level math: + +```js +const katex = require('katex'); + +hexo.extend.filter.register('marked:extensions', function(extensions) { + // Info: `extensions` is an array. + extensions.push({ + name: 'blockMath', + level: 'block', + tokenizer(src) { + const cap = /^\s{0,3}\$\$((?:[^\n]|\n[^\n])+?)\n{0,1}\$\$/.exec(src); + + if (cap !== null) { + return { + type: 'blockMath', + raw: cap[0], + math: cap[1] + }; + } + + return undefined; + }, + renderer(token) { + return `

${katex.renderToString(token.math, {displayMode: true})}

\n`; + } + }); +}); +``` + [Markdown]: https://daringfireball.net/projects/markdown/ [marked]: https://github.com/chjj/marked [PHP Markdown Extra]: https://michelf.ca/projects/php-markdown/extra/#def-list