diff --git a/lib/renderer/md.js b/lib/renderer/md.js index a58a577..a2b0ee2 100644 --- a/lib/renderer/md.js +++ b/lib/renderer/md.js @@ -3,6 +3,26 @@ import { marked } from 'marked'; // なんか増えたらココに追記 import code from './md/code.js'; +// CJK約物()など)の直後にある closing ** が認識されない CommonMark 由来の問題を修正する。 +// emStrongRDelimAst の group1 lookahead に \p{L} を追加し、 +// 約物 + ** + 文字(CJK含む)の並びも closing delimiter と見なすようにする。 +let _cjkFixed = false; +marked.use({ + tokenizer: { + emStrong(src, maskedSrc, prevChar = '') { + if (!_cjkFixed) { + const orig = this.rules.inline.emStrongRDelimAst; + this.rules.inline.emStrongRDelimAst = new RegExp( + orig.source.replace('(?=[\\s]|$)', '(?=[\\s\\p{L}]|$)'), + orig.flags + ); + _cjkFixed = true; + } + return false; + } + } +}); + const renderFunc = { code, }; diff --git a/test/cgmd/renderer/md.js b/test/cgmd/renderer/md.js index 739e38b..3e5d625 100644 --- a/test/cgmd/renderer/md.js +++ b/test/cgmd/renderer/md.js @@ -22,6 +22,14 @@ describe('#renderToken', function() { }); }); +describe('#render (CJK punctuation)', function() { + it('CJK約物の直後の closing ** が正しく認識されること', function() { + const res = renderer.render('**foo(bar)**baz**qux**'); + assert(res.includes('foo(bar)'), 'CJK約物で閉じるboldが壊れている'); + assert(res.includes('qux'), '2つ目のboldが壊れている'); + }); +}); + describe('#render', function() { it('markedと同じ内容でふつうのMarkdownをレンダリングできること', function() { const res1 = renderer.render('- foo\n- bar');