From b2164cbdc6004b4ad0b174f85b31c9b4210839d6 Mon Sep 17 00:00:00 2001 From: Yoo Seung-jun Date: Sun, 4 Jan 2026 18:55:24 +0900 Subject: [PATCH] Fix emphasis not closing when followed by CJK character --- lib/rules_inline/state_inline.mjs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/rules_inline/state_inline.mjs b/lib/rules_inline/state_inline.mjs index 80cb3c5..7a529b2 100644 --- a/lib/rules_inline/state_inline.mjs +++ b/lib/rules_inline/state_inline.mjs @@ -3,6 +3,17 @@ import Token from '../token.mjs' import { isWhiteSpace, isPunctChar, isMdAsciiPunct } from '../common/utils.mjs' +// Check if the character is a CJK character. +// +// ranges: +// - 0x4E00 - 0x9FFF : CJK Unified Ideographs +// - 0xAC00 - 0xD7A3 : Hangul Syllables +// +function isCJK (code) { + return (code >= 0x4E00 && code <= 0x9FFF) || + (code >= 0xAC00 && code <= 0xD7A3) +} + function StateInline (src, md, env, outTokens) { this.src = src this.env = env @@ -106,10 +117,12 @@ StateInline.prototype.scanDelims = function (start, canSplitWord) { const isLastWhiteSpace = isWhiteSpace(lastChar) const isNextWhiteSpace = isWhiteSpace(nextChar) + const isNextCJK = isCJK(nextChar) + const left_flanking = !isNextWhiteSpace && (!isNextPunctChar || isLastWhiteSpace || isLastPunctChar) const right_flanking = - !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar) + !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar || isNextCJK) const can_open = left_flanking && (canSplitWord || !right_flanking || isLastPunctChar) const can_close = right_flanking && (canSplitWord || !left_flanking || isNextPunctChar)