markdown-it-cjk-friendly 1.3.2 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -17
- package/dist/index.d.ts +4 -3
- package/dist/index.js +76 -83
- package/package.json +7 -9
package/README.md
CHANGED
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://npmjs.com/package/markdown-it-cjk-friendly)  [](https://npmjs.com/package/markdown-it-cjk-friendly) [](https://npmjs.com/package/markdown-it-cjk-friendly) [](https://socket.dev/npm/package/markdown-it-cjk-friendly) [](https://snyk.io/advisor/npm-package/markdown-it-cjk-friendly)
|
|
4
4
|
|
|
5
|
+
> [!NOTE]
|
|
6
|
+
> for Socket's diagnostics, please also refer to [that of markdown-it](https://socket.dev/npm/package/markdown-it).
|
|
7
|
+
|
|
5
8
|
A [markdown-it](https://github.com/markdown-it/markdown-it) plugin to make Markdown emphasis (`**`) in CommonMark compatible with Chinese, Japanese, and Korean (CJK).
|
|
6
9
|
|
|
7
10
|
<span lang="ja">CommonMarkの強調記号(`**`)を日本語・中国語・韓国語にきちんと対応させるための[markdown-it](https://github.com/markdown-it/markdown-it)プラグイン</span>
|
|
8
11
|
|
|
9
12
|
<span lang="zh-Hans-CN">一个 [markdown-it](https://github.com/markdown-it/markdown-it) 插件,用于使 CommonMark 的强调标记(`**`)能够正确支持中文、日语和韩语文本。</span>
|
|
10
13
|
|
|
11
|
-
<span lang="ko">CommonMark의 강조 표시(`**`) 를 한국어,
|
|
14
|
+
<span lang="ko">CommonMark의 강조 표시(`**`) 를 한국어, 일본어, 중국어와 호환되도록 만드는 [markdown-it](https://github.com/markdown-it/markdown-it) 플러그인</span>
|
|
12
15
|
|
|
13
|
-
## Problem / <span lang="ja">問題</span> / <span lang="zh-Hans-CN">问题</span> / <span lang="ko"
|
|
16
|
+
## Problem / <span lang="ja">問題</span> / <span lang="zh-Hans-CN">问题</span> / <span lang="ko">문제</span>
|
|
14
17
|
|
|
15
18
|
CommonMark has a problem that the following emphasis marks `**` are not recognized as emphasis marks in Japanese, Chinese, and Korean.
|
|
16
19
|
|
|
@@ -18,7 +21,7 @@ CommonMark has a problem that the following emphasis marks `**` are not recogniz
|
|
|
18
21
|
|
|
19
22
|
<span lang="zh-Hans-CN">CommonMark存在以下问题:在中文、日语和韩语文本中,强调标记`**`不会被识别为强调标记。</span>
|
|
20
23
|
|
|
21
|
-
<span lang="ko">CommonMark는
|
|
24
|
+
<span lang="ko">CommonMark는 한국어, 일본어, 중국어에서 다음과 같은 강조 표시 `**`가 강조 표시로 인식되지 않는 문제가 있습니다.</span>
|
|
22
25
|
|
|
23
26
|
```md
|
|
24
27
|
**このアスタリスクは強調記号として認識されず、そのまま表示されます。**この文のせいで。
|
|
@@ -66,7 +69,7 @@ Additionally, if you are creating Markdown-related software or services primaril
|
|
|
66
69
|
1. <span lang="ja">ユーザまたはAIが作成したコンテンツをそのまま表示する必要がある場合</span>
|
|
67
70
|
2. <span lang="ja">翻訳者に、このCommonMarkの仕様を理解していない人も多く、なおかつリアルタイムで本番同様の描画プレビューを提供できず、`<strong>`タグを許可していない場合</span>
|
|
68
71
|
- <span lang="ja">翻訳にCrowdin・Transifexなどの翻訳サービスを使っている場合</span>
|
|
69
|
-
- <span lang="ja">翻訳の品質に責任を負っている人が非エンジニアである、または
|
|
72
|
+
- <span lang="ja">翻訳の品質に責任を負っている人が非エンジニアである、またはCommonMarkのこの挙動を理解していない場合</span>
|
|
70
73
|
|
|
71
74
|
<span lang="ja">また、あなたが主に日本人・中国人・韓国人のいずれかまたは全てを対象としたMarkdown関連のソフトウェアやサービスを作成する場合も、このパッケージを使う(この仕様を採用する)ことを強く推奨します。</span>
|
|
72
75
|
|
|
@@ -79,24 +82,24 @@ Additionally, if you are creating Markdown-related software or services primaril
|
|
|
79
82
|
|
|
80
83
|
<span lang="zh-Hans-CN">此外,如果您正在创建主要面向中国人、日本人或韩国人(或全部)的Markdown相关软件或服务,也强烈建议采用此规范。</span>
|
|
81
84
|
|
|
82
|
-
<span lang="ko">엔지니어로서 완전히 감독할 수 없는 일본어, 중국어, 한국어 콘텐츠를 다뤄야 하는
|
|
85
|
+
<span lang="ko">엔지니어로서 완전히 감독할 수 없는 일본어, 중국어, 한국어 콘텐츠를 다뤄야 하는 경우 이 패키지를 사용(일반 CommonMark나 GFM 대신 이 사양을 채택)할 것을 강력히 권장합니다. '완전히 감독할 수 없는'이란 다음과 같은 상황을 의미합니다.</span>
|
|
83
86
|
|
|
84
87
|
1. <span lang="ko">사용자 또는 AI가 생성한 콘텐츠를 그대로 표시해야 하는 경우</span>
|
|
85
|
-
2. <span lang="ko">많은 번역자가
|
|
88
|
+
2. <span lang="ko">많은 번역자가 CommonMark 동작을 이해하지 못하고, 실시간으로 실제 환경과 유사한 렌더링 미리보기를 제공할 수 없으며, `<strong>` 태그가 허용되지 않는 경우</span>
|
|
86
89
|
- <span lang="ko">Crowdin이나 Transifex 같은 번역 서비스를 사용하는 경우</span>
|
|
87
|
-
- <span lang="ko">번역 품질에 책임을 지는 사람이 엔지니어가 아니거나
|
|
90
|
+
- <span lang="ko">번역 품질에 책임을 지는 사람이 엔지니어가 아니거나 CommonMark 동작을 이해하지 못하는 경우</span>
|
|
88
91
|
|
|
89
|
-
<span lang="ko">또한, 주로 일본어,
|
|
92
|
+
<span lang="ko">또한, 주로 한국어, 일본어, 중국어 사용자(또는 모두)를 대상으로 하는 Markdown 관련 소프트웨어나 서비스를 만들고 있다면 이 패키지를 사용(이 사양을 채택)할 것을 강력히 권장합니다.</span>
|
|
90
93
|
|
|
91
|
-
## Runtime Requirements / <span lang="ja">実行環境の要件</span> / <span lang="zh-Hans-CN">运行环境要求</span> / <span lang="ko"
|
|
94
|
+
## Runtime Requirements / <span lang="ja">実行環境の要件</span> / <span lang="zh-Hans-CN">运行环境要求</span> / <span lang="ko">런타임 요구 사항</span>
|
|
92
95
|
|
|
93
|
-
This package is ESM-only. It requires Node.js
|
|
96
|
+
This package is ESM-only. It requires Node.js 18 or later. (I have only tested it on 20 and later. There is no factor that would prevent it from working on 18, but I do not guarantee its operation on 18.)
|
|
94
97
|
|
|
95
|
-
<span lang="ja">本パッケージはESM専用です。Node.js
|
|
98
|
+
<span lang="ja">本パッケージはESM専用です。Node.js 18以上が必要です。(動作検証は20以降でのみ行っています。18での動作を妨げる要因はありませんが、動作の保証はありません)</span>
|
|
96
99
|
|
|
97
|
-
<span lang="zh-Hans-CN">此包仅支持ESM。需要Node.js
|
|
100
|
+
<span lang="zh-Hans-CN">此包仅支持ESM。需要Node.js 18或更高版本。(我只测试了20及以后的版本。没有因素会阻止它在18上工作,但我不保证在18上的操作。)</span>
|
|
98
101
|
|
|
99
|
-
<span lang="ko"
|
|
102
|
+
<span lang="ko">본 패키지는 ESM 전용입니다. Node.js 18 이상이 필요합니다. (동작 검증은 20 이후 버전에서만 수행했습니다. 18에서 동작을 방해하는 요인은 없으나, 동작을 보장하지는 않습니다)</span>
|
|
100
103
|
|
|
101
104
|
## Installation / <span lang="ja">インストール</span> / <span lang="zh-Hans-CN">安装</span> / <span lang="ko">설치</span>
|
|
102
105
|
|
|
@@ -118,7 +121,7 @@ If you use another package manager, please replace `npm install` with the comman
|
|
|
118
121
|
|
|
119
122
|
<span lang="zh-Hans-CN">如果使用其他包管理器,请将 `npm install` 替换为当时包管理器的命令(例如:`pnpm add`、`yarn add`)。</span>
|
|
120
123
|
|
|
121
|
-
<span lang="ko"
|
|
124
|
+
<span lang="ko">npm이 아닌 다른 패키지 매니저를 사용하는 경우 `npm install`을 해당 패키지 매니저의 명령어(예: `pnpm add`, `yarn add`)로 바꿔 주세요.</span>
|
|
122
125
|
|
|
123
126
|
## Usage / <span lang="ja">使い方</span> / <span lang="zh-Hans-CN">用法</span> / <span lang="ko">사용법</span>
|
|
124
127
|
|
|
@@ -128,7 +131,7 @@ Import `markdown-it` and `markdown-it-cjk-friendly`, and use the plugin as follo
|
|
|
128
131
|
|
|
129
132
|
<span lang="zh-Hans-CN">通过 `markdown-it` 和 `markdown-it-cjk-friendly` 导入,然后使用插件如下:</span>
|
|
130
133
|
|
|
131
|
-
<span lang="ko">`markdown-it`와 `markdown-it-cjk-friendly`를
|
|
134
|
+
<span lang="ko">`markdown-it`와 `markdown-it-cjk-friendly`를 가져오고 다음과 같이 플러그인을 사용하세요.</span>
|
|
132
135
|
|
|
133
136
|
```js
|
|
134
137
|
import MarkdownIt from "markdown-it";
|
|
@@ -146,9 +149,9 @@ This modification of the specification does not affect the other languages than
|
|
|
146
149
|
|
|
147
150
|
<span lang="zh-Hans-CN">除中文、日文和韩文外,建议的规范变更不会影响其他语言。请放心使用此软件包,因为如果您的应用程序或文档包含其他语言的翻译或内容,也不会受到影响。我保证,即使使用此软件包(修正建议),markdown-it 仍然会为 0.31.2 版本的所有 CommonMark 测试用例输出相同的 HTML。</span>
|
|
148
151
|
|
|
149
|
-
<span lang="ko"
|
|
152
|
+
<span lang="ko">이 사양 변경 제안은 한국어, 일본어, 중국어 이외의 언어에는 영향을 미치지 않습니다. 애플리케이션이나 문서에 다른 언어의 번역이나 콘텐츠가 포함되어 있어도 영향을 받지 않으므로 안심하고 본 패키지를 사용하시기 바랍니다. 본 패키지(수정안)를 사용해도 0.31.2 시점의 모든 CommonMark 테스트 케이스에서 markdown-it가 동일한 HTML을 출력하는 것을 보장합니다.</span>
|
|
150
153
|
|
|
151
|
-
## Specification / <span lang="ja">規格書</span> / <span lang="zh-Hans-CN">规范</span> / <span lang="ko"
|
|
154
|
+
## Specification / <span lang="ja">規格書</span> / <span lang="zh-Hans-CN">规范</span> / <span lang="ko">설명서</span>
|
|
152
155
|
|
|
153
156
|
https://github.com/tats-u/markdown-cjk-friendly/blob/main/specification.md (English)
|
|
154
157
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import MarkdownIt from
|
|
1
|
+
import MarkdownIt from "markdown-it";
|
|
2
2
|
|
|
3
|
+
//#region src/index.d.ts
|
|
3
4
|
declare function markdownItCjkFriendlyPlugin(md: MarkdownIt): void;
|
|
4
|
-
|
|
5
|
-
export { markdownItCjkFriendlyPlugin as default };
|
|
5
|
+
//#endregion
|
|
6
|
+
export { markdownItCjkFriendlyPlugin as default };
|
package/dist/index.js
CHANGED
|
@@ -1,98 +1,91 @@
|
|
|
1
|
-
// src/index.ts
|
|
2
1
|
import { eastAsianWidthType } from "get-east-asian-width";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
isWhiteSpace
|
|
7
|
-
} from "markdown-it/lib/common/utils.mjs";
|
|
2
|
+
import { isMdAsciiPunct, isPunctChar, isWhiteSpace } from "markdown-it/lib/common/utils.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/index.ts
|
|
8
5
|
function isEmoji(uc) {
|
|
9
|
-
|
|
6
|
+
return /^\p{Emoji_Presentation}/u.test(String.fromCodePoint(uc));
|
|
10
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Check if `uc` is CJK. Deferred (returns `null`) if IVS.
|
|
10
|
+
*
|
|
11
|
+
* @param uc code point
|
|
12
|
+
* @returns `true` if `uc` is CJK, `false` if not, `null` if IVS
|
|
13
|
+
*/
|
|
11
14
|
function isCjkBase(uc) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
case "narrow":
|
|
22
|
-
return false;
|
|
23
|
-
case "ambiguous":
|
|
24
|
-
return null;
|
|
25
|
-
case "neutral":
|
|
26
|
-
return /^\p{sc=Hangul}/u.test(String.fromCodePoint(uc));
|
|
27
|
-
}
|
|
15
|
+
if (uc < 4352) return false;
|
|
16
|
+
switch (eastAsianWidthType(uc)) {
|
|
17
|
+
case "fullwidth":
|
|
18
|
+
case "halfwidth": return true;
|
|
19
|
+
case "wide": return !isEmoji(uc);
|
|
20
|
+
case "narrow": return false;
|
|
21
|
+
case "ambiguous": return null;
|
|
22
|
+
case "neutral": return /^\p{sc=Hangul}/u.test(String.fromCodePoint(uc));
|
|
23
|
+
}
|
|
28
24
|
}
|
|
29
25
|
function is2PreviousCjk(uc, prev) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
return isCjkBase(uc) ?? (prev === 65025 && isQuotationMark(uc));
|
|
27
|
+
function isQuotationMark(uc$1) {
|
|
28
|
+
return uc$1 === 8216 || uc$1 === 8217 || uc$1 === 8220 || uc$1 === 8221;
|
|
29
|
+
}
|
|
34
30
|
}
|
|
35
31
|
function isPreviousCjk(uc) {
|
|
36
|
-
|
|
32
|
+
return isCjkBase(uc) ?? (917760 <= uc && uc <= 917999);
|
|
37
33
|
}
|
|
38
34
|
function isNextCjk(uc) {
|
|
39
|
-
|
|
35
|
+
return isCjkBase(uc) ?? false;
|
|
40
36
|
}
|
|
41
37
|
function nonEmojiGeneralUseVS(uc) {
|
|
42
|
-
|
|
38
|
+
return uc >= 65024 && uc <= 65038;
|
|
43
39
|
}
|
|
44
40
|
function markdownItCjkFriendlyPlugin(md) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
md.inline.State = CjFriendlyState;
|
|
41
|
+
const PreviousState = md.inline.State;
|
|
42
|
+
class CjkFriendlyState extends PreviousState {
|
|
43
|
+
scanDelims(start, canSplitWord) {
|
|
44
|
+
const max = this.posMax;
|
|
45
|
+
const marker = this.src.charCodeAt(start);
|
|
46
|
+
const [lastChar, lastCharPos] = getLastCharCode(this.src, start);
|
|
47
|
+
let lastMainChar = lastChar;
|
|
48
|
+
let twoPrevChar = null;
|
|
49
|
+
if (nonEmojiGeneralUseVS(lastChar)) {
|
|
50
|
+
twoPrevChar = getLastCharCode(this.src, lastCharPos)[0];
|
|
51
|
+
if (!/^\p{Zs}/u.test(String.fromCodePoint(twoPrevChar))) lastMainChar = twoPrevChar;
|
|
52
|
+
}
|
|
53
|
+
let pos = start;
|
|
54
|
+
while (pos < max && this.src.charCodeAt(pos) === marker) pos++;
|
|
55
|
+
const count = pos - start;
|
|
56
|
+
const nextChar = pos < max ? this.src.codePointAt(pos) : 32;
|
|
57
|
+
const isLastWhiteSpace = isWhiteSpace(lastMainChar);
|
|
58
|
+
const isNextWhiteSpace = isWhiteSpace(nextChar);
|
|
59
|
+
if (isLastWhiteSpace || isNextWhiteSpace) return {
|
|
60
|
+
can_open: !isNextWhiteSpace,
|
|
61
|
+
can_close: !isLastWhiteSpace,
|
|
62
|
+
length: count
|
|
63
|
+
};
|
|
64
|
+
const isLastPunctChar = isMdAsciiPunct(lastMainChar) || isPunctChar(String.fromCodePoint(lastMainChar));
|
|
65
|
+
const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCodePoint(nextChar));
|
|
66
|
+
let left_flanking = isLastPunctChar;
|
|
67
|
+
let right_flanking = isNextPunctChar;
|
|
68
|
+
if (canSplitWord) {
|
|
69
|
+
const isEitherCJKChar = isNextCjk(nextChar) || (twoPrevChar !== null ? is2PreviousCjk(twoPrevChar, lastChar) : isPreviousCjk(lastChar));
|
|
70
|
+
left_flanking ||= isEitherCJKChar || !isNextPunctChar;
|
|
71
|
+
right_flanking ||= isEitherCJKChar || !isLastPunctChar;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
can_open: left_flanking,
|
|
75
|
+
can_close: right_flanking,
|
|
76
|
+
length: count
|
|
77
|
+
};
|
|
78
|
+
function getLastCharCode(str, pos$1) {
|
|
79
|
+
if (pos$1 <= 0) return [32, -1];
|
|
80
|
+
const charCode = str.charCodeAt(pos$1 - 1);
|
|
81
|
+
if ((charCode & 64512) !== 56320) return [charCode, pos$1 - 1];
|
|
82
|
+
const codePoint = str.codePointAt(pos$1 - 2);
|
|
83
|
+
return codePoint > 65535 ? [codePoint, pos$1 - 2] : [charCode, pos$1 - 1];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
md.inline.State = CjkFriendlyState;
|
|
95
88
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
};
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { markdownItCjkFriendlyPlugin as default };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "markdown-it-cjk-friendly",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -46,18 +46,16 @@
|
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"get-east-asian-width": "^1.
|
|
49
|
+
"get-east-asian-width": "^1.4.0"
|
|
50
50
|
},
|
|
51
51
|
"engines": {
|
|
52
|
-
"node": ">=
|
|
52
|
+
"node": ">=18"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
|
-
"build": "
|
|
56
|
-
"build:lib": "
|
|
57
|
-
"
|
|
58
|
-
"dev": "
|
|
59
|
-
"dev:lib": "tsup --watch",
|
|
60
|
-
"dev:rslib": "rslib build --watch",
|
|
55
|
+
"build": "tsdown",
|
|
56
|
+
"build:lib": "tsdown",
|
|
57
|
+
"dev": "tsdown --watch",
|
|
58
|
+
"dev:lib": "tsdown --watch",
|
|
61
59
|
"test": "vitest run",
|
|
62
60
|
"test:lib": "vitest run",
|
|
63
61
|
"test:up": "vitest -u",
|