@celhive/tool.js 0.0.9 → 0.0.11
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/lib/markdown-patch.d.ts +12 -1
- package/lib/markdown-patch.js +80 -39
- package/package.json +1 -1
package/lib/markdown-patch.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* markdownPatch 配置选项
|
|
3
|
+
*/
|
|
4
|
+
export interface MarkdownPatchConfig {
|
|
5
|
+
/**
|
|
6
|
+
* 是否删除所有 emoji 表情符号
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
removeEmoji?: boolean;
|
|
10
|
+
}
|
|
1
11
|
/**
|
|
2
12
|
* 修复 markdown 格式缺失问题
|
|
3
13
|
* @param md - 需要修复的 markdown 字符串
|
|
14
|
+
* @param config - 可选配置项
|
|
4
15
|
* @returns string 修复后的 markdown 字符串
|
|
5
16
|
*/
|
|
6
|
-
export declare const markdownPatch: (md: string) => string;
|
|
17
|
+
export declare const markdownPatch: (md: string, config?: MarkdownPatchConfig) => string;
|
package/lib/markdown-patch.js
CHANGED
|
@@ -2,19 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.markdownPatch = void 0;
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
* @param md - 需要修复的 markdown 字符串
|
|
7
|
-
* @returns string 修复后的 markdown 字符串
|
|
5
|
+
* 在标题 # 和内容之间添加空格(跳过代码块)
|
|
8
6
|
*/
|
|
9
|
-
const
|
|
7
|
+
const fixHeadingSpaces = (md) => {
|
|
10
8
|
const lines = md.split('\n');
|
|
11
9
|
let inCodeBlock = false;
|
|
12
|
-
|
|
10
|
+
return lines
|
|
13
11
|
.map((line) => {
|
|
14
12
|
// 检查是否是代码块的开始或结束
|
|
15
13
|
if (line.trim().startsWith('```')) {
|
|
16
|
-
inCodeBlock = !inCodeBlock;
|
|
17
|
-
return line;
|
|
14
|
+
inCodeBlock = !inCodeBlock;
|
|
15
|
+
return line;
|
|
18
16
|
}
|
|
19
17
|
// 如果在代码块内,跳过处理
|
|
20
18
|
if (inCodeBlock) {
|
|
@@ -33,42 +31,85 @@ const markdownPatch = (md) => {
|
|
|
33
31
|
return line;
|
|
34
32
|
})
|
|
35
33
|
.join('\n');
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* 去除首尾空白字符
|
|
37
|
+
*/
|
|
38
|
+
const trimWhitespace = (md) => md.trim();
|
|
39
|
+
/**
|
|
40
|
+
* 将包含中文符号的粗体文本转换为 HTML bold 标签
|
|
41
|
+
*/
|
|
42
|
+
const convertBoldToHtml = (md) => {
|
|
43
|
+
return md.replace(/\*\*(.*?)\*\*/g, (match, p1) => {
|
|
38
44
|
return (p1.includes('(') && p1.includes(')')) || p1.includes(':')
|
|
39
45
|
? `<b>${p1}</b>`
|
|
40
46
|
: match;
|
|
41
47
|
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (hashes.length > 0 &&
|
|
64
|
-
spaces.length === 0 &&
|
|
65
|
-
!content.startsWith('#')) {
|
|
66
|
-
return `${leadingSpaces}${hashes} ${content}`;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return line;
|
|
70
|
-
})
|
|
71
|
-
.join('\n');
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 在 mermaid 代码块前添加额外换行符
|
|
51
|
+
*/
|
|
52
|
+
const fixMermaidSpacing = (md) => {
|
|
53
|
+
return md.replace(/(\n)```mermaid/g, '$1\n```mermaid');
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* 在连续的 # 符号前添加换行符(不处理行首的 #)
|
|
57
|
+
*/
|
|
58
|
+
const addNewlineBeforeHeadings = (md) => {
|
|
59
|
+
return md.replace(/([^\n#])(#{2,})/g, '$1\n$2');
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 确保 <video> 标签前至少有 2 个换行符(空行分隔)
|
|
63
|
+
*/
|
|
64
|
+
const addNewlineBeforeVideoTags = (md) => {
|
|
65
|
+
// 先处理没有换行符的情况:text<video> -> text\n\n<video>
|
|
66
|
+
let result = md.replace(/([^\n])(<video\b[^>]*>)/g, '$1\n\n$2');
|
|
67
|
+
// 再处理只有一个换行符的情况:text\n<video> -> text\n\n<video>
|
|
68
|
+
result = result.replace(/([^\n])\n(<video\b[^>]*>)/g, '$1\n\n$2');
|
|
72
69
|
return result;
|
|
73
70
|
};
|
|
71
|
+
/**
|
|
72
|
+
* 删除所有 emoji 表情符号
|
|
73
|
+
*/
|
|
74
|
+
const removeEmojis = (md) => {
|
|
75
|
+
// 匹配所有 emoji 字符,包括:
|
|
76
|
+
// - 基础 emoji 字符 (\u{1F300}-\u{1F9FF})
|
|
77
|
+
// - 补充符号和象形文字 (\u{1FA00}-\u{1FAFF})
|
|
78
|
+
// - 传统 emoji 符号 (\u{2600}-\u{26FF}, \u{2700}-\u{27BF})
|
|
79
|
+
// - 杂项符号 (\u{2300}-\u{23FF})
|
|
80
|
+
// - 装饰符号 (\u{FE00}-\u{FE0F})
|
|
81
|
+
// - 组合字符和肤色修饰符 (\u{1F3FB}-\u{1F3FF})
|
|
82
|
+
// - 其他常见 emoji 范围
|
|
83
|
+
const emojiRegex = /[\u{1F300}-\u{1F9FF}\u{1FA00}-\u{1FAFF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{2300}-\u{23FF}\u{FE00}-\u{FE0F}\u{1F1E0}-\u{1F1FF}\u{1F900}-\u{1F9FF}\u{1F600}-\u{1F64F}\u{1F680}-\u{1F6FF}\u{2190}-\u{21FF}\u{2B50}\u{231A}-\u{231B}\u{23E9}-\u{23FA}\u{25AA}-\u{25FE}\u{2934}-\u{2935}\u{2B05}-\u{2B07}\u{3030}\u{303D}\u{3297}\u{3299}\u{1F004}\u{1F0CF}\u{1F170}-\u{1F171}\u{1F17E}-\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}-\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}-\u{1F251}\u{1F3FB}-\u{1F3FF}][\u{FE00}-\u{FE0F}]?/gu;
|
|
84
|
+
// 删除 emoji 并清理多余的连续空格
|
|
85
|
+
return md.replace(emojiRegex, '').replace(/ {2,}/g, ' ');
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* 修复 markdown 格式缺失问题
|
|
89
|
+
* @param md - 需要修复的 markdown 字符串
|
|
90
|
+
* @param config - 可选配置项
|
|
91
|
+
* @returns string 修复后的 markdown 字符串
|
|
92
|
+
*/
|
|
93
|
+
const markdownPatch = (md, config) => {
|
|
94
|
+
const { removeEmoji = false } = config || {};
|
|
95
|
+
// 构建处理函数数组
|
|
96
|
+
const processors = [
|
|
97
|
+
fixHeadingSpaces,
|
|
98
|
+
trimWhitespace,
|
|
99
|
+
convertBoldToHtml,
|
|
100
|
+
fixMermaidSpacing,
|
|
101
|
+
addNewlineBeforeHeadings,
|
|
102
|
+
addNewlineBeforeVideoTags,
|
|
103
|
+
// 再次修复标题空格,处理新插入的换行符后的标题
|
|
104
|
+
fixHeadingSpaces,
|
|
105
|
+
];
|
|
106
|
+
// 如果需要删除 emoji,添加到处理流程中
|
|
107
|
+
if (removeEmoji) {
|
|
108
|
+
processors.push(removeEmojis);
|
|
109
|
+
// 删除 emoji 后再次 trim,清理可能留下的首尾空格
|
|
110
|
+
processors.push(trimWhitespace);
|
|
111
|
+
}
|
|
112
|
+
// 依次执行所有处理函数
|
|
113
|
+
return processors.reduce((result, fn) => fn(result), md);
|
|
114
|
+
};
|
|
74
115
|
exports.markdownPatch = markdownPatch;
|