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');