cherry-muse 1.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/LICENSE +162 -0
- package/README.md +139 -0
- package/dist/addons/cherry-code-block-card-plugin.js +1 -0
- package/dist/addons/cherry-code-block-echarts-plugin.js +1 -0
- package/dist/addons/cherry-code-block-mermaid-plugin.js +1 -0
- package/dist/cherry-markdown.core.common.js +1 -0
- package/dist/cherry-markdown.core.js +1 -0
- package/dist/cherry-markdown.css +4089 -0
- package/dist/cherry-markdown.engine.core.common.js +1 -0
- package/dist/cherry-markdown.engine.core.esm.js +1 -0
- package/dist/cherry-markdown.engine.core.js +1 -0
- package/dist/cherry-markdown.esm.js +1 -0
- package/dist/cherry-markdown.js +70837 -0
- package/dist/cherry-markdown.js.map +1 -0
- package/dist/cherry-markdown.min.css +1 -0
- package/dist/cherry-markdown.min.js +1 -0
- package/dist/stats.html +4838 -0
- package/examples/scripts/pinyin/README.md +53 -0
- package/package.json +167 -0
- package/src/Cherry.config.js +411 -0
- package/src/Cherry.js +788 -0
- package/src/CherryStatic.js +70 -0
- package/src/Editor.js +746 -0
- package/src/Engine.js +334 -0
- package/src/Event.js +74 -0
- package/src/Factory.js +180 -0
- package/src/Logger.js +31 -0
- package/src/Previewer.js +1147 -0
- package/src/Sanitizer.js +4 -0
- package/src/Sanitizer.node.js +7 -0
- package/src/Stats.js +101 -0
- package/src/Theme.js +46 -0
- package/src/UrlCache.js +98 -0
- package/src/addons/cherry-code-block-card-plugin.js +213 -0
- package/src/addons/cherry-code-block-echarts-plugin.js +161 -0
- package/src/addons/cherry-code-block-mermaid-plugin.js +118 -0
- package/src/core/HookCenter.js +303 -0
- package/src/core/HooksConfig.js +106 -0
- package/src/core/ParagraphBase.js +314 -0
- package/src/core/SentenceBase.js +65 -0
- package/src/core/SyntaxBase.js +197 -0
- package/src/core/hooks/AutoLink.js +251 -0
- package/src/core/hooks/BackgroundColor.js +46 -0
- package/src/core/hooks/Badge.js +100 -0
- package/src/core/hooks/Blockquote.js +113 -0
- package/src/core/hooks/Br.js +85 -0
- package/src/core/hooks/CodeBlock.js +876 -0
- package/src/core/hooks/Color.js +78 -0
- package/src/core/hooks/CommentReference.js +96 -0
- package/src/core/hooks/Detail.js +138 -0
- package/src/core/hooks/Emoji.config.js +9388 -0
- package/src/core/hooks/Emoji.js +223 -0
- package/src/core/hooks/Emphasis.js +113 -0
- package/src/core/hooks/Footnote.js +125 -0
- package/src/core/hooks/FrontMatter.js +52 -0
- package/src/core/hooks/FrontMatterVars.js +82 -0
- package/src/core/hooks/Header.js +229 -0
- package/src/core/hooks/HighLight.js +37 -0
- package/src/core/hooks/Hr.js +52 -0
- package/src/core/hooks/HtmlBlock.js +159 -0
- package/src/core/hooks/Iframe.js +80 -0
- package/src/core/hooks/Image.js +276 -0
- package/src/core/hooks/InlineCode.js +45 -0
- package/src/core/hooks/InlineMath.js +142 -0
- package/src/core/hooks/Link.js +169 -0
- package/src/core/hooks/List.js +260 -0
- package/src/core/hooks/Mark.js +55 -0
- package/src/core/hooks/MathBlock.js +97 -0
- package/src/core/hooks/Panel.js +170 -0
- package/src/core/hooks/Paragraph.js +84 -0
- package/src/core/hooks/Ruby.js +34 -0
- package/src/core/hooks/Size.js +84 -0
- package/src/core/hooks/Strikethrough.js +54 -0
- package/src/core/hooks/Sub.js +47 -0
- package/src/core/hooks/SuggestList.js +317 -0
- package/src/core/hooks/Suggester.js +759 -0
- package/src/core/hooks/Sup.js +47 -0
- package/src/core/hooks/Table.js +315 -0
- package/src/core/hooks/Toc.js +290 -0
- package/src/core/hooks/Transfer.js +47 -0
- package/src/core/hooks/Underline.js +37 -0
- package/src/index.core.js +29 -0
- package/src/index.engine.core.js +62 -0
- package/src/index.engine.js +30 -0
- package/src/index.js +28 -0
- package/src/locales/index.js +21 -0
- package/src/locales/zh_CN.js +170 -0
- package/src/sass/cherry.scss +122 -0
- package/src/sass/components/bubble.scss +122 -0
- package/src/sass/components/codemirror.scss +628 -0
- package/src/sass/components/dropdown.scss +37 -0
- package/src/sass/components/editor.scss +78 -0
- package/src/sass/components/preview.scss +71 -0
- package/src/sass/components/prism.scss +142 -0
- package/src/sass/components/stats.scss +32 -0
- package/src/sass/components/toc.scss +184 -0
- package/src/sass/components/toolbar.scss +117 -0
- package/src/sass/core/AutoLink.scss +20 -0
- package/src/sass/core/BackgroundColor.scss +0 -0
- package/src/sass/core/Badge.scss +116 -0
- package/src/sass/core/Blockquote.scss +12 -0
- package/src/sass/core/Br.scss +0 -0
- package/src/sass/core/Card.scss +219 -0
- package/src/sass/core/CodeBlock.scss +205 -0
- package/src/sass/core/Color.scss +37 -0
- package/src/sass/core/CommentReference.scss +0 -0
- package/src/sass/core/Detail.scss +107 -0
- package/src/sass/core/Emoji.scss +127 -0
- package/src/sass/core/Emphasis.scss +9 -0
- package/src/sass/core/Footnote.scss +21 -0
- package/src/sass/core/FrontMatterVars.scss +19 -0
- package/src/sass/core/Header.scss +103 -0
- package/src/sass/core/HighLight.scss +0 -0
- package/src/sass/core/Hr.scss +10 -0
- package/src/sass/core/HtmlBlock.scss +0 -0
- package/src/sass/core/Iframe.scss +36 -0
- package/src/sass/core/Image.scss +59 -0
- package/src/sass/core/InlineCode.scss +10 -0
- package/src/sass/core/InlineMath.scss +11 -0
- package/src/sass/core/Link.scss +16 -0
- package/src/sass/core/List.scss +61 -0
- package/src/sass/core/Mark.scss +15 -0
- package/src/sass/core/MathBlock.scss +0 -0
- package/src/sass/core/Panel.scss +150 -0
- package/src/sass/core/Paragraph.scss +6 -0
- package/src/sass/core/Ruby.scss +0 -0
- package/src/sass/core/Size.scss +8 -0
- package/src/sass/core/Strikethrough.scss +0 -0
- package/src/sass/core/Sub.scss +5 -0
- package/src/sass/core/Suggester.scss +62 -0
- package/src/sass/core/Sup.scss +5 -0
- package/src/sass/core/Table.scss +127 -0
- package/src/sass/core/Toc.scss +28 -0
- package/src/sass/core/Transfer.scss +0 -0
- package/src/sass/core/Underline.scss +0 -0
- package/src/sass/google-fonts.scss +34 -0
- package/src/sass/index.scss +3 -0
- package/src/sass/prism/dark.scss +131 -0
- package/src/sass/prism/light.scss +143 -0
- package/src/sass/variables/colors.scss +96 -0
- package/src/toolbars/Bubble.js +232 -0
- package/src/toolbars/BubbleTable.js +147 -0
- package/src/toolbars/HookCenter.js +185 -0
- package/src/toolbars/MenuBase.js +357 -0
- package/src/toolbars/PreviewerBubble.js +558 -0
- package/src/toolbars/Toc.js +246 -0
- package/src/toolbars/Toolbar.js +401 -0
- package/src/toolbars/hooks/Audio.js +53 -0
- package/src/toolbars/hooks/Badge.js +80 -0
- package/src/toolbars/hooks/BarTable.js +41 -0
- package/src/toolbars/hooks/Bold.js +70 -0
- package/src/toolbars/hooks/Br.js +34 -0
- package/src/toolbars/hooks/Card.js +64 -0
- package/src/toolbars/hooks/CheckList.js +41 -0
- package/src/toolbars/hooks/Code.js +46 -0
- package/src/toolbars/hooks/Color.js +285 -0
- package/src/toolbars/hooks/Copy.js +139 -0
- package/src/toolbars/hooks/Detail.js +70 -0
- package/src/toolbars/hooks/ECharts.js +303 -0
- package/src/toolbars/hooks/Emoji.js +303 -0
- package/src/toolbars/hooks/Export.js +47 -0
- package/src/toolbars/hooks/File.js +54 -0
- package/src/toolbars/hooks/Formula.js +36 -0
- package/src/toolbars/hooks/FullScreen.js +55 -0
- package/src/toolbars/hooks/Graph.js +281 -0
- package/src/toolbars/hooks/H1.js +71 -0
- package/src/toolbars/hooks/H2.js +71 -0
- package/src/toolbars/hooks/H3.js +71 -0
- package/src/toolbars/hooks/Header.js +100 -0
- package/src/toolbars/hooks/Hr.js +35 -0
- package/src/toolbars/hooks/Iframe.js +35 -0
- package/src/toolbars/hooks/Image.js +60 -0
- package/src/toolbars/hooks/Insert.js +36 -0
- package/src/toolbars/hooks/Italic.js +70 -0
- package/src/toolbars/hooks/LineTable.js +41 -0
- package/src/toolbars/hooks/Link.js +46 -0
- package/src/toolbars/hooks/List.js +55 -0
- package/src/toolbars/hooks/Ol.js +41 -0
- package/src/toolbars/hooks/Panel.js +155 -0
- package/src/toolbars/hooks/Quote.js +45 -0
- package/src/toolbars/hooks/Redo.js +33 -0
- package/src/toolbars/hooks/Ruby.js +59 -0
- package/src/toolbars/hooks/Size.js +100 -0
- package/src/toolbars/hooks/Split.js +37 -0
- package/src/toolbars/hooks/Strikethrough.js +65 -0
- package/src/toolbars/hooks/Sub.js +58 -0
- package/src/toolbars/hooks/Sup.js +58 -0
- package/src/toolbars/hooks/SwitchModel.js +78 -0
- package/src/toolbars/hooks/Table.js +56 -0
- package/src/toolbars/hooks/Toc.js +35 -0
- package/src/toolbars/hooks/TogglePreview.js +79 -0
- package/src/toolbars/hooks/Ul.js +41 -0
- package/src/toolbars/hooks/Underline.js +65 -0
- package/src/toolbars/hooks/Undo.js +30 -0
- package/src/toolbars/hooks/Video.js +53 -0
- package/src/utils/LazyLoadImg.js +341 -0
- package/src/utils/autoindent.js +58 -0
- package/src/utils/codeBlockContentHandler.js +351 -0
- package/src/utils/config.js +98 -0
- package/src/utils/copy.js +55 -0
- package/src/utils/dialog.js +196 -0
- package/src/utils/dom.js +162 -0
- package/src/utils/downloadUtil.js +23 -0
- package/src/utils/env.js +22 -0
- package/src/utils/error.js +61 -0
- package/src/utils/event.js +38 -0
- package/src/utils/export.js +115 -0
- package/src/utils/file.js +121 -0
- package/src/utils/formulaUtilsHandler.js +230 -0
- package/src/utils/htmlparser.js +977 -0
- package/src/utils/image.js +99 -0
- package/src/utils/imgSizeHandler.js +279 -0
- package/src/utils/jsonUtils.js +17 -0
- package/src/utils/lineFeed.js +49 -0
- package/src/utils/listContentHandler.js +227 -0
- package/src/utils/lookbehind-replace.js +81 -0
- package/src/utils/mathjax.js +89 -0
- package/src/utils/myersDiff.js +211 -0
- package/src/utils/pasteHelper.js +253 -0
- package/src/utils/recount-pos.js +59 -0
- package/src/utils/regexp.js +295 -0
- package/src/utils/sanitize.js +477 -0
- package/src/utils/selection.js +50 -0
- package/src/utils/svgUtils.js +96 -0
- package/src/utils/tableContentHandler.js +592 -0
- package/tools/README.md +3 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2021 THL A29 Limited, a Tencent company.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export function compileRegExp(obj, flags, allowExtendedFlags) {
|
|
17
|
+
let source = obj.begin + obj.content + obj.end;
|
|
18
|
+
if (allowExtendedFlags) {
|
|
19
|
+
// Extend \h for horizontal whitespace
|
|
20
|
+
source = source.replace(/\[\\h\]/g, HORIZONTAL_WHITESPACE).replace(/\\h/g, HORIZONTAL_WHITESPACE);
|
|
21
|
+
}
|
|
22
|
+
return new RegExp(source, flags || 'g');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function isLookbehindSupported() {
|
|
26
|
+
try {
|
|
27
|
+
new RegExp('(?<=.)');
|
|
28
|
+
return true;
|
|
29
|
+
} catch (ignore) {}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const HORIZONTAL_WHITESPACE = '[ \\t\\u00a0]';
|
|
34
|
+
|
|
35
|
+
// 仅适用非多行模式的正则
|
|
36
|
+
export const ALLOW_WHITESPACE_MULTILINE = '(?:.*?)(?:(?:\\n.*?)*?)';
|
|
37
|
+
export const DO_NOT_STARTS_AND_END_WITH_SPACES = '(?:\\S|(?:\\S.*?\\S))';
|
|
38
|
+
export const DO_NOT_STARTS_AND_END_WITH_SPACES_MULTILINE =
|
|
39
|
+
'(?:(?:\\S|(?:\\S[^\\n]*?\\S))(?:\\n(?:\\S|(?:\\S[^\\n]*?\\S)))*?)';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated
|
|
43
|
+
*
|
|
44
|
+
* 存在严重性能问题,应弃用
|
|
45
|
+
*/
|
|
46
|
+
export const DO_NOT_STARTS_AND_END_WITH_SPACES_MULTILINE_ALLOW_EMPTY = '(?:(?:\\S|(?:\\S.*?\\S))(?:[ \\t]*\\n.*?)*?)';
|
|
47
|
+
|
|
48
|
+
export const NOT_ALL_WHITE_SPACES_INLINE = '(?:[^\\n]*?\\S[^\\n]*?)';
|
|
49
|
+
|
|
50
|
+
export const NORMAL_INDENT = '[ ]{0, 3}|\\t';
|
|
51
|
+
export const NO_BACKSLASH_BEFORE_CAPTURE = '[^\\\\]';
|
|
52
|
+
|
|
53
|
+
// https://spec.commonmark.org/0.29/#ascii-punctuation-character
|
|
54
|
+
// !, ", #, $, %, &, ', (, ), *, +, ,, -, ., / (U+0021–2F),
|
|
55
|
+
// :, ;, <, =, >, ?, @ (U+003A–0040),
|
|
56
|
+
// [, \, ], ^, _, ` (U+005B–0060),
|
|
57
|
+
// {, |, }, or ~ (U+007B–007E).
|
|
58
|
+
export const PUNCTUATION = '[\\u0021-\\u002F\\u003a-\\u0040\\u005b-\\u0060\\u007b-\\u007e]';
|
|
59
|
+
|
|
60
|
+
// extra punctuations
|
|
61
|
+
export const CHINESE_PUNCTUATION = '[!“”¥‘’(),。—:;《》?【】「」·~|]';
|
|
62
|
+
|
|
63
|
+
// 下划线强调语法允许的边界符号
|
|
64
|
+
export const UNDERSCORE_EMPHASIS_BOUNDARY =
|
|
65
|
+
'[' +
|
|
66
|
+
'\\u0021-\\u002F\\u003a-\\u0040\\u005b\\u005d\\u005e\\u0060\\u007b-\\u007e' + // punctuations defined in commonmark
|
|
67
|
+
' ' +
|
|
68
|
+
'\\t\\n' +
|
|
69
|
+
'!“”¥‘’(),。—:;《》?【】「」·~|' + // chinese punctuations
|
|
70
|
+
']';
|
|
71
|
+
|
|
72
|
+
// https://html.spec.whatwg.org/multipage/input.html#e-mail-state-(type%3Demail)
|
|
73
|
+
export const EMAIL_INLINE = new RegExp(
|
|
74
|
+
[
|
|
75
|
+
/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+/.source,
|
|
76
|
+
'@',
|
|
77
|
+
/[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/.source,
|
|
78
|
+
].join(''),
|
|
79
|
+
);
|
|
80
|
+
export const EMAIL = new RegExp(`^${EMAIL_INLINE.source}$`);
|
|
81
|
+
|
|
82
|
+
// https://gist.github.com/dperini/729294
|
|
83
|
+
// [USERNAME[:PASSWORD]@](IP|HOST)[:PORT][/SOURCE_PATH?QUERY_PARAMS#HASH]
|
|
84
|
+
export const URL_INLINE_NO_SLASH = new RegExp(
|
|
85
|
+
'' + // 针对eslint的特殊处理
|
|
86
|
+
'(?:\\S+(?::\\S*)?@)?' +
|
|
87
|
+
'(?:' +
|
|
88
|
+
// IP address exclusion
|
|
89
|
+
// IP address dotted notation octets
|
|
90
|
+
// excludes loopback network 0.0.0.0
|
|
91
|
+
// excludes reserved space >= 224.0.0.0
|
|
92
|
+
// excludes network & broadcast addresses
|
|
93
|
+
// (first & last IP address of each class)
|
|
94
|
+
'(?:1\\d\\d|2[01]\\d|22[0-3]|[1-9]\\d?)' +
|
|
95
|
+
'(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}' +
|
|
96
|
+
'(?:\\.(?:1\\d\\d|2[0-4]\\d|25[0-4]|[1-9]\\d?))' +
|
|
97
|
+
'|' +
|
|
98
|
+
// host & domain names, may end with dot
|
|
99
|
+
'(?![-_])(?:[-\\w\\xa1-\\xff]{0,63}[^-_]\\.)+' +
|
|
100
|
+
// TLD identifier name, may end with dot
|
|
101
|
+
'(?:[a-zA-Z\\xa1-\\xff]{2,}\\.?)' +
|
|
102
|
+
')' +
|
|
103
|
+
// port number (optional)
|
|
104
|
+
'(?::\\d{2,5})?' +
|
|
105
|
+
// resource path (optional)
|
|
106
|
+
'(?:[/?#][^\\s<>\\x00-\\x1f"\\(\\)]*)?',
|
|
107
|
+
);
|
|
108
|
+
export const URL_INLINE = new RegExp(
|
|
109
|
+
// eslint特殊处理
|
|
110
|
+
// protocol identifier (optional)
|
|
111
|
+
// short syntax // still required
|
|
112
|
+
// '(?:(?:(?:https?|ftp):)?\\/\\/)' +
|
|
113
|
+
`(?:\\/\\/)${URL_INLINE_NO_SLASH.source}`,
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
export const URL_NO_SLASH = new RegExp(`^${URL_INLINE_NO_SLASH.source}$`);
|
|
117
|
+
|
|
118
|
+
export const URL = new RegExp(`^${URL_INLINE.source}$`);
|
|
119
|
+
|
|
120
|
+
// 正则结果[全部, 判定符之前的空格或者tab, 判定符, checkbox内容(没有就是undefined), 列表内容]
|
|
121
|
+
export const LIST_CONTENT =
|
|
122
|
+
/^([ \t]*)([*+-][ ](\[[ x]\])?|[0-9一二三四五六七八九十零]+\.|[a-z]\.|\b(?:M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))\b\.)([^\r\n]*)/;
|
|
123
|
+
|
|
124
|
+
export function getTableRule(merge = false) {
|
|
125
|
+
// ^(\|[^\n]+\|\r?\n)((?:\|:?[-]+:?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$
|
|
126
|
+
// (\\|?[^\\n|]+\\|?\\n)(?:\\|?[\\s]*:?[-]{2,}:?[\\s]*
|
|
127
|
+
// (?:\\|[\\s]*:?[-]{2,}:?[\\s]*)+\\|?)(\\n\\|?(\\|[^\\n|]+)*\\|?)?
|
|
128
|
+
/**
|
|
129
|
+
* (\|[^\n]+\|\n) Headers
|
|
130
|
+
* ((\|[\s]*:?[-]{2,}:?[\s]*)+\|) Column Options
|
|
131
|
+
* ((?:\n\|[^\n]+\|)*) Rows
|
|
132
|
+
*/
|
|
133
|
+
const strict = {
|
|
134
|
+
begin: '(?:^|\\n)(\\n*)',
|
|
135
|
+
content: [
|
|
136
|
+
'(\\h*\\|[^\\n]+\\|?\\h*)', // Header
|
|
137
|
+
'\\n',
|
|
138
|
+
'(?:(?:\\h*\\|\\h*:?[-]{1,}:?\\h*)+\\|?\\h*)', // Column Options
|
|
139
|
+
'((\\n\\h*\\|[^\\n]+\\|?\\h*)*)', // Rows
|
|
140
|
+
].join(''),
|
|
141
|
+
end: '(?=$|\\n)',
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
strict.reg = compileRegExp(strict, 'g', true);
|
|
145
|
+
|
|
146
|
+
const loose = {
|
|
147
|
+
begin: '(?:^|\\n)(\\n*)',
|
|
148
|
+
content: [
|
|
149
|
+
'(\\|?[^\\n|]+(\\|[^\\n|]+)+\\|?)', // Header
|
|
150
|
+
'\\n',
|
|
151
|
+
'(?:\\|?\\h*:?[-]{1,}:?[\\h]*(?:\\|[\\h]*:?[-]{1,}:?\\h*)+\\|?)', // Column Options
|
|
152
|
+
'((\\n\\|?([^\\n|]+(\\|[^\\n|]*)+)\\|?)*)', // Rows
|
|
153
|
+
].join(''),
|
|
154
|
+
end: '(?=$|\\n)',
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
loose.reg = compileRegExp(loose, 'g', true);
|
|
158
|
+
|
|
159
|
+
if (merge === false) {
|
|
160
|
+
return { strict, loose };
|
|
161
|
+
}
|
|
162
|
+
const regStr = `(?:${strict.begin + strict.content + strict.end}|${loose.begin + loose.content + loose.end})`;
|
|
163
|
+
return compileRegExp({ begin: '', content: regStr, end: '' }, 'g', true);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function getCodeBlockRule() {
|
|
167
|
+
const codeBlock = {
|
|
168
|
+
/**
|
|
169
|
+
* (?:^|\n)是区块的通用开头
|
|
170
|
+
* (\n*)捕获区块前的所有换行
|
|
171
|
+
* ((?:>\s*)*) 捕获代码块前面的引用("> > > " 这种东西)
|
|
172
|
+
* (?:[^\S\n]*)捕获```前置的空格字符
|
|
173
|
+
* 只要有连续3个及以上`并且前后`的数量相等,则认为是代码快语法
|
|
174
|
+
*/
|
|
175
|
+
begin: /(?:^|\n)(\n*((?:>[\t ]*)*)(?:[^\S\n]*))(`{3,})([^`]*?)\n/,
|
|
176
|
+
content: /([\w\W]*?)/, // '([\\w\\W]*?)',
|
|
177
|
+
end: /[^\S\n]*\3[ \t]*(?=$|\n+)/, // '\\s*```[ \\t]*(?=$|\\n+)',
|
|
178
|
+
reg: new RegExp(''),
|
|
179
|
+
};
|
|
180
|
+
codeBlock.reg = new RegExp(codeBlock.begin.source + codeBlock.content.source + codeBlock.end.source, 'g');
|
|
181
|
+
return {
|
|
182
|
+
...codeBlock,
|
|
183
|
+
begin: codeBlock.begin.source,
|
|
184
|
+
content: codeBlock.content.source,
|
|
185
|
+
end: codeBlock.end.source,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* 从selection里获取列表语法
|
|
191
|
+
* @param {*} selection
|
|
192
|
+
* @param {('ol'|'ul'|'checklist')} type 列表类型
|
|
193
|
+
* @returns {String}
|
|
194
|
+
*/
|
|
195
|
+
export function getListFromStr(selection, type) {
|
|
196
|
+
let $selection = selection ? selection : 'Item 1\n Item 1.1\nItem 2';
|
|
197
|
+
$selection = $selection.replace(/^\n+/, '').replace(/\n+$/, '');
|
|
198
|
+
let pre = '1.';
|
|
199
|
+
switch (type) {
|
|
200
|
+
case 'ol':
|
|
201
|
+
pre = '1.';
|
|
202
|
+
break;
|
|
203
|
+
case 'ul':
|
|
204
|
+
pre = '-';
|
|
205
|
+
break;
|
|
206
|
+
case 'checklist':
|
|
207
|
+
pre = '- [x]';
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
$selection = $selection.replace(/^(\s*)([0-9a-zA-Z]+\.|- \[x\]|- \[ \]|-) /gm, '$1');
|
|
211
|
+
// 对有序列表进行序号自增处理
|
|
212
|
+
if (pre === '1.') {
|
|
213
|
+
const listNum = {};
|
|
214
|
+
$selection = $selection.replace(/^(\s*)(\S[\s\S]*?)$/gm, (match, p1, p2) => {
|
|
215
|
+
const space = p1.match(/[ \t]/g)?.length || 0;
|
|
216
|
+
listNum[space] = listNum[space] ? listNum[space] + 1 : 1;
|
|
217
|
+
return `${p1}${listNum[space]}. ${p2}`;
|
|
218
|
+
});
|
|
219
|
+
} else {
|
|
220
|
+
$selection = $selection.replace(/^(\s*)(\S[\s\S]*?)$/gm, `$1${pre} $2`);
|
|
221
|
+
}
|
|
222
|
+
return $selection;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* 信息面板的识别正则
|
|
227
|
+
* @returns {object}
|
|
228
|
+
*/
|
|
229
|
+
export function getPanelRule() {
|
|
230
|
+
const ret = {
|
|
231
|
+
begin: /(?:^|\n)(\n*(?:[^\S\n]*)):::([^:][^\n]+?)\s*\n/,
|
|
232
|
+
content: /([\w\W]*?)/,
|
|
233
|
+
end: /\n[ \t]*:::[ \t]*(?=$|\n+)/,
|
|
234
|
+
};
|
|
235
|
+
ret.reg = new RegExp(ret.begin.source + ret.content.source + ret.end.source, 'g');
|
|
236
|
+
return ret;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* 手风琴/detail语法的识别正则
|
|
241
|
+
* 例:
|
|
242
|
+
* +++(-) 点击查看详情
|
|
243
|
+
* body
|
|
244
|
+
* body
|
|
245
|
+
* ++ 标题(默认收起内容)
|
|
246
|
+
* 内容
|
|
247
|
+
* ++- 标题(默认展开内容)
|
|
248
|
+
* 内容2
|
|
249
|
+
* +++
|
|
250
|
+
* @returns {object}
|
|
251
|
+
*/
|
|
252
|
+
export function getDetailRule() {
|
|
253
|
+
const ret = {
|
|
254
|
+
begin: /(?:^|\n)(\n*[^\S\n]*)\+\+([+-]?)\s+([^\n]+)\n/,
|
|
255
|
+
content: /([\w\W]+?)/,
|
|
256
|
+
end: /\n[ \t]*\+\+\+[ \t]*(?=$|\n+)/,
|
|
257
|
+
};
|
|
258
|
+
ret.reg = new RegExp(ret.begin.source + ret.content.source + ret.end.source, 'g');
|
|
259
|
+
return ret;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// 匹配图片URL里的base64,[name](data:image/png;base64,xxx) 和  这两种形式的都处理
|
|
263
|
+
export const imgBase64Reg = /(\[[^\n]*?\]\(data:image\/[a-z]{1,10};base64,)([^)]+)\)/g;
|
|
264
|
+
|
|
265
|
+
// 匹配base64数据
|
|
266
|
+
export const base64Reg = /(data:image\/[a-z]{1,10};base64,)([0-9a-zA-Z+/]+)/g;
|
|
267
|
+
|
|
268
|
+
// 匹配内容非常多的单行文本,为了避免表格的场景,所以特意避免表格的识别
|
|
269
|
+
export const longTextReg = /([^\n]{100})([^\n|`\s]{5900,})/g;
|
|
270
|
+
|
|
271
|
+
// 匹配图片{}里的data-xml属性
|
|
272
|
+
export const imgDrawioXmlReg = /(!\[[^\n]*?\]\([^)]+\)\{[^}]* data-xml=)([^}]+)\}/g;
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* 匹配draw.io的图片语法
|
|
276
|
+
* 图片的语法为 {data-type=drawio data-xml=${xml}}
|
|
277
|
+
*/
|
|
278
|
+
export const imgDrawioReg =
|
|
279
|
+
/(!\[[^\n]*?\]\(data:image\/[a-z]{1,10};base64,[^)]+\)\{data-type=drawio data-xml=[^}]+\})/g;
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* 从编辑器里的内容中获取没有代码块的内容
|
|
283
|
+
* @param {string} value
|
|
284
|
+
* @returns {string}
|
|
285
|
+
*/
|
|
286
|
+
export const getValueWithoutCode = (value = '') =>
|
|
287
|
+
value
|
|
288
|
+
.replace(getCodeBlockRule().reg, (whole) => {
|
|
289
|
+
// 把代码块里的内容干掉
|
|
290
|
+
return whole.replace(/^.*$/gm, '/n');
|
|
291
|
+
})
|
|
292
|
+
.replace(/(`+)(.+?(?:\n.+?)*?)\1/g, (whole) => {
|
|
293
|
+
// 把行内代码的符号去掉
|
|
294
|
+
return whole.replace(/[![\]()]/g, '.');
|
|
295
|
+
});
|