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.
Files changed (226) hide show
  1. package/LICENSE +162 -0
  2. package/README.md +139 -0
  3. package/dist/addons/cherry-code-block-card-plugin.js +1 -0
  4. package/dist/addons/cherry-code-block-echarts-plugin.js +1 -0
  5. package/dist/addons/cherry-code-block-mermaid-plugin.js +1 -0
  6. package/dist/cherry-markdown.core.common.js +1 -0
  7. package/dist/cherry-markdown.core.js +1 -0
  8. package/dist/cherry-markdown.css +4089 -0
  9. package/dist/cherry-markdown.engine.core.common.js +1 -0
  10. package/dist/cherry-markdown.engine.core.esm.js +1 -0
  11. package/dist/cherry-markdown.engine.core.js +1 -0
  12. package/dist/cherry-markdown.esm.js +1 -0
  13. package/dist/cherry-markdown.js +70837 -0
  14. package/dist/cherry-markdown.js.map +1 -0
  15. package/dist/cherry-markdown.min.css +1 -0
  16. package/dist/cherry-markdown.min.js +1 -0
  17. package/dist/stats.html +4838 -0
  18. package/examples/scripts/pinyin/README.md +53 -0
  19. package/package.json +167 -0
  20. package/src/Cherry.config.js +411 -0
  21. package/src/Cherry.js +788 -0
  22. package/src/CherryStatic.js +70 -0
  23. package/src/Editor.js +746 -0
  24. package/src/Engine.js +334 -0
  25. package/src/Event.js +74 -0
  26. package/src/Factory.js +180 -0
  27. package/src/Logger.js +31 -0
  28. package/src/Previewer.js +1147 -0
  29. package/src/Sanitizer.js +4 -0
  30. package/src/Sanitizer.node.js +7 -0
  31. package/src/Stats.js +101 -0
  32. package/src/Theme.js +46 -0
  33. package/src/UrlCache.js +98 -0
  34. package/src/addons/cherry-code-block-card-plugin.js +213 -0
  35. package/src/addons/cherry-code-block-echarts-plugin.js +161 -0
  36. package/src/addons/cherry-code-block-mermaid-plugin.js +118 -0
  37. package/src/core/HookCenter.js +303 -0
  38. package/src/core/HooksConfig.js +106 -0
  39. package/src/core/ParagraphBase.js +314 -0
  40. package/src/core/SentenceBase.js +65 -0
  41. package/src/core/SyntaxBase.js +197 -0
  42. package/src/core/hooks/AutoLink.js +251 -0
  43. package/src/core/hooks/BackgroundColor.js +46 -0
  44. package/src/core/hooks/Badge.js +100 -0
  45. package/src/core/hooks/Blockquote.js +113 -0
  46. package/src/core/hooks/Br.js +85 -0
  47. package/src/core/hooks/CodeBlock.js +876 -0
  48. package/src/core/hooks/Color.js +78 -0
  49. package/src/core/hooks/CommentReference.js +96 -0
  50. package/src/core/hooks/Detail.js +138 -0
  51. package/src/core/hooks/Emoji.config.js +9388 -0
  52. package/src/core/hooks/Emoji.js +223 -0
  53. package/src/core/hooks/Emphasis.js +113 -0
  54. package/src/core/hooks/Footnote.js +125 -0
  55. package/src/core/hooks/FrontMatter.js +52 -0
  56. package/src/core/hooks/FrontMatterVars.js +82 -0
  57. package/src/core/hooks/Header.js +229 -0
  58. package/src/core/hooks/HighLight.js +37 -0
  59. package/src/core/hooks/Hr.js +52 -0
  60. package/src/core/hooks/HtmlBlock.js +159 -0
  61. package/src/core/hooks/Iframe.js +80 -0
  62. package/src/core/hooks/Image.js +276 -0
  63. package/src/core/hooks/InlineCode.js +45 -0
  64. package/src/core/hooks/InlineMath.js +142 -0
  65. package/src/core/hooks/Link.js +169 -0
  66. package/src/core/hooks/List.js +260 -0
  67. package/src/core/hooks/Mark.js +55 -0
  68. package/src/core/hooks/MathBlock.js +97 -0
  69. package/src/core/hooks/Panel.js +170 -0
  70. package/src/core/hooks/Paragraph.js +84 -0
  71. package/src/core/hooks/Ruby.js +34 -0
  72. package/src/core/hooks/Size.js +84 -0
  73. package/src/core/hooks/Strikethrough.js +54 -0
  74. package/src/core/hooks/Sub.js +47 -0
  75. package/src/core/hooks/SuggestList.js +317 -0
  76. package/src/core/hooks/Suggester.js +759 -0
  77. package/src/core/hooks/Sup.js +47 -0
  78. package/src/core/hooks/Table.js +315 -0
  79. package/src/core/hooks/Toc.js +290 -0
  80. package/src/core/hooks/Transfer.js +47 -0
  81. package/src/core/hooks/Underline.js +37 -0
  82. package/src/index.core.js +29 -0
  83. package/src/index.engine.core.js +62 -0
  84. package/src/index.engine.js +30 -0
  85. package/src/index.js +28 -0
  86. package/src/locales/index.js +21 -0
  87. package/src/locales/zh_CN.js +170 -0
  88. package/src/sass/cherry.scss +122 -0
  89. package/src/sass/components/bubble.scss +122 -0
  90. package/src/sass/components/codemirror.scss +628 -0
  91. package/src/sass/components/dropdown.scss +37 -0
  92. package/src/sass/components/editor.scss +78 -0
  93. package/src/sass/components/preview.scss +71 -0
  94. package/src/sass/components/prism.scss +142 -0
  95. package/src/sass/components/stats.scss +32 -0
  96. package/src/sass/components/toc.scss +184 -0
  97. package/src/sass/components/toolbar.scss +117 -0
  98. package/src/sass/core/AutoLink.scss +20 -0
  99. package/src/sass/core/BackgroundColor.scss +0 -0
  100. package/src/sass/core/Badge.scss +116 -0
  101. package/src/sass/core/Blockquote.scss +12 -0
  102. package/src/sass/core/Br.scss +0 -0
  103. package/src/sass/core/Card.scss +219 -0
  104. package/src/sass/core/CodeBlock.scss +205 -0
  105. package/src/sass/core/Color.scss +37 -0
  106. package/src/sass/core/CommentReference.scss +0 -0
  107. package/src/sass/core/Detail.scss +107 -0
  108. package/src/sass/core/Emoji.scss +127 -0
  109. package/src/sass/core/Emphasis.scss +9 -0
  110. package/src/sass/core/Footnote.scss +21 -0
  111. package/src/sass/core/FrontMatterVars.scss +19 -0
  112. package/src/sass/core/Header.scss +103 -0
  113. package/src/sass/core/HighLight.scss +0 -0
  114. package/src/sass/core/Hr.scss +10 -0
  115. package/src/sass/core/HtmlBlock.scss +0 -0
  116. package/src/sass/core/Iframe.scss +36 -0
  117. package/src/sass/core/Image.scss +59 -0
  118. package/src/sass/core/InlineCode.scss +10 -0
  119. package/src/sass/core/InlineMath.scss +11 -0
  120. package/src/sass/core/Link.scss +16 -0
  121. package/src/sass/core/List.scss +61 -0
  122. package/src/sass/core/Mark.scss +15 -0
  123. package/src/sass/core/MathBlock.scss +0 -0
  124. package/src/sass/core/Panel.scss +150 -0
  125. package/src/sass/core/Paragraph.scss +6 -0
  126. package/src/sass/core/Ruby.scss +0 -0
  127. package/src/sass/core/Size.scss +8 -0
  128. package/src/sass/core/Strikethrough.scss +0 -0
  129. package/src/sass/core/Sub.scss +5 -0
  130. package/src/sass/core/Suggester.scss +62 -0
  131. package/src/sass/core/Sup.scss +5 -0
  132. package/src/sass/core/Table.scss +127 -0
  133. package/src/sass/core/Toc.scss +28 -0
  134. package/src/sass/core/Transfer.scss +0 -0
  135. package/src/sass/core/Underline.scss +0 -0
  136. package/src/sass/google-fonts.scss +34 -0
  137. package/src/sass/index.scss +3 -0
  138. package/src/sass/prism/dark.scss +131 -0
  139. package/src/sass/prism/light.scss +143 -0
  140. package/src/sass/variables/colors.scss +96 -0
  141. package/src/toolbars/Bubble.js +232 -0
  142. package/src/toolbars/BubbleTable.js +147 -0
  143. package/src/toolbars/HookCenter.js +185 -0
  144. package/src/toolbars/MenuBase.js +357 -0
  145. package/src/toolbars/PreviewerBubble.js +558 -0
  146. package/src/toolbars/Toc.js +246 -0
  147. package/src/toolbars/Toolbar.js +401 -0
  148. package/src/toolbars/hooks/Audio.js +53 -0
  149. package/src/toolbars/hooks/Badge.js +80 -0
  150. package/src/toolbars/hooks/BarTable.js +41 -0
  151. package/src/toolbars/hooks/Bold.js +70 -0
  152. package/src/toolbars/hooks/Br.js +34 -0
  153. package/src/toolbars/hooks/Card.js +64 -0
  154. package/src/toolbars/hooks/CheckList.js +41 -0
  155. package/src/toolbars/hooks/Code.js +46 -0
  156. package/src/toolbars/hooks/Color.js +285 -0
  157. package/src/toolbars/hooks/Copy.js +139 -0
  158. package/src/toolbars/hooks/Detail.js +70 -0
  159. package/src/toolbars/hooks/ECharts.js +303 -0
  160. package/src/toolbars/hooks/Emoji.js +303 -0
  161. package/src/toolbars/hooks/Export.js +47 -0
  162. package/src/toolbars/hooks/File.js +54 -0
  163. package/src/toolbars/hooks/Formula.js +36 -0
  164. package/src/toolbars/hooks/FullScreen.js +55 -0
  165. package/src/toolbars/hooks/Graph.js +281 -0
  166. package/src/toolbars/hooks/H1.js +71 -0
  167. package/src/toolbars/hooks/H2.js +71 -0
  168. package/src/toolbars/hooks/H3.js +71 -0
  169. package/src/toolbars/hooks/Header.js +100 -0
  170. package/src/toolbars/hooks/Hr.js +35 -0
  171. package/src/toolbars/hooks/Iframe.js +35 -0
  172. package/src/toolbars/hooks/Image.js +60 -0
  173. package/src/toolbars/hooks/Insert.js +36 -0
  174. package/src/toolbars/hooks/Italic.js +70 -0
  175. package/src/toolbars/hooks/LineTable.js +41 -0
  176. package/src/toolbars/hooks/Link.js +46 -0
  177. package/src/toolbars/hooks/List.js +55 -0
  178. package/src/toolbars/hooks/Ol.js +41 -0
  179. package/src/toolbars/hooks/Panel.js +155 -0
  180. package/src/toolbars/hooks/Quote.js +45 -0
  181. package/src/toolbars/hooks/Redo.js +33 -0
  182. package/src/toolbars/hooks/Ruby.js +59 -0
  183. package/src/toolbars/hooks/Size.js +100 -0
  184. package/src/toolbars/hooks/Split.js +37 -0
  185. package/src/toolbars/hooks/Strikethrough.js +65 -0
  186. package/src/toolbars/hooks/Sub.js +58 -0
  187. package/src/toolbars/hooks/Sup.js +58 -0
  188. package/src/toolbars/hooks/SwitchModel.js +78 -0
  189. package/src/toolbars/hooks/Table.js +56 -0
  190. package/src/toolbars/hooks/Toc.js +35 -0
  191. package/src/toolbars/hooks/TogglePreview.js +79 -0
  192. package/src/toolbars/hooks/Ul.js +41 -0
  193. package/src/toolbars/hooks/Underline.js +65 -0
  194. package/src/toolbars/hooks/Undo.js +30 -0
  195. package/src/toolbars/hooks/Video.js +53 -0
  196. package/src/utils/LazyLoadImg.js +341 -0
  197. package/src/utils/autoindent.js +58 -0
  198. package/src/utils/codeBlockContentHandler.js +351 -0
  199. package/src/utils/config.js +98 -0
  200. package/src/utils/copy.js +55 -0
  201. package/src/utils/dialog.js +196 -0
  202. package/src/utils/dom.js +162 -0
  203. package/src/utils/downloadUtil.js +23 -0
  204. package/src/utils/env.js +22 -0
  205. package/src/utils/error.js +61 -0
  206. package/src/utils/event.js +38 -0
  207. package/src/utils/export.js +115 -0
  208. package/src/utils/file.js +121 -0
  209. package/src/utils/formulaUtilsHandler.js +230 -0
  210. package/src/utils/htmlparser.js +977 -0
  211. package/src/utils/image.js +99 -0
  212. package/src/utils/imgSizeHandler.js +279 -0
  213. package/src/utils/jsonUtils.js +17 -0
  214. package/src/utils/lineFeed.js +49 -0
  215. package/src/utils/listContentHandler.js +227 -0
  216. package/src/utils/lookbehind-replace.js +81 -0
  217. package/src/utils/mathjax.js +89 -0
  218. package/src/utils/myersDiff.js +211 -0
  219. package/src/utils/pasteHelper.js +253 -0
  220. package/src/utils/recount-pos.js +59 -0
  221. package/src/utils/regexp.js +295 -0
  222. package/src/utils/sanitize.js +477 -0
  223. package/src/utils/selection.js +50 -0
  224. package/src/utils/svgUtils.js +96 -0
  225. package/src/utils/tableContentHandler.js +592 -0
  226. 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) 和 ![alt](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
+ * 图片的语法为 ![alt](${base64}){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
+ });