From bb54141566b093cfc3bcc6ee481faa4b1b6b590f Mon Sep 17 00:00:00 2001 From: Masataka Yakura Date: Tue, 28 Apr 2026 18:11:16 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20CJK=E7=B4=84=E7=89=A9=E9=9A=A3?= =?UTF-8?q?=E6=8E=A5=E3=81=AE=20bold/em=20=E3=81=8C=E5=A3=8A=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit marked の emStrongRDelimAst regex は CommonMark 由来の制限により、 約物(`)` など)直後の `**` を closing delimiter として認識しない。 `marked.use()` で emStrong をオーバーライドし、group1 の lookahead に `\p{L}` を追加することで、約物 + ** + 文字(CJK含む)の並びも closing delimiter と見なすよう修正した。 Co-Authored-By: Claude Sonnet 4.6 --- lib/renderer/md.js | 19 +++++++++++++++++++ test/cgmd/renderer/md.js | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/lib/renderer/md.js b/lib/renderer/md.js index a58a577..7192757 100644 --- a/lib/renderer/md.js +++ b/lib/renderer/md.js @@ -3,6 +3,25 @@ import { marked } from 'marked'; // なんか増えたらココに追記 import code from './md/code.js'; +// CJK約物()など)の直後にある closing ** が認識されない CommonMark 由来の問題を修正する。 +// emStrongRDelimAst の group1 lookahead に \p{L} を追加し、 +// 約物 + ** + 文字(CJK含む)の並びも closing delimiter と見なすようにする。 +marked.use({ + tokenizer: { + emStrong(src, maskedSrc, prevChar = '') { + if (!this._cjkFixed) { + const orig = this.rules.inline.emStrongRDelimAst; + this.rules.inline.emStrongRDelimAst = new RegExp( + orig.source.replace('(?=[\\s]|$)', '(?=[\\s\\p{L}]|$)'), + orig.flags + ); + this._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'); From 2c5e2faf96e0281dbbe9833f7929aacfbdef80f7 Mon Sep 17 00:00:00 2001 From: Masataka Yakura Date: Tue, 28 Apr 2026 18:44:11 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=5FcjkFixed=20=E3=83=95?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=82=92=E3=83=A2=E3=82=B8=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=82=B9=E3=82=B3=E3=83=BC=E3=83=97=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `this` はパース毎に新しいインスタンスになるため、インスタンスプロパティとして 設定した `_cjkFixed` は毎回 `undefined` になり意図通りに機能しない。 モジュールスコープの変数に移動することで、最初のパースでのみパッチを適用する という本来の意図を正しく実現する。 Co-Authored-By: Claude Sonnet 4.6 --- lib/renderer/md.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/renderer/md.js b/lib/renderer/md.js index 7192757..a2b0ee2 100644 --- a/lib/renderer/md.js +++ b/lib/renderer/md.js @@ -6,16 +6,17 @@ 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 (!this._cjkFixed) { + if (!_cjkFixed) { const orig = this.rules.inline.emStrongRDelimAst; this.rules.inline.emStrongRDelimAst = new RegExp( orig.source.replace('(?=[\\s]|$)', '(?=[\\s\\p{L}]|$)'), orig.flags ); - this._cjkFixed = true; + _cjkFixed = true; } return false; }