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,78 @@
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
+ import SyntaxBase from '@/core/SyntaxBase';
17
+ import { isLookbehindSupported } from '@/utils/regexp';
18
+ import { replaceLookbehind } from '@/utils/lookbehind-replace';
19
+
20
+ export default class Color extends SyntaxBase {
21
+ static HOOK_NAME = 'fontColor';
22
+ // constructor() {
23
+ // super();
24
+ // }
25
+
26
+ toHtml(whole, leadingChar, m1, m2) {
27
+ return `${leadingChar}<span style="color:${m1}">${m2}</span>`;
28
+ }
29
+
30
+ makeHtml(str) {
31
+ if (isLookbehindSupported()) {
32
+ return str.replace(this.RULE.reg, this.toHtml);
33
+ }
34
+ return replaceLookbehind(str, this.RULE.reg, this.toHtml, true, 1);
35
+ }
36
+
37
+ rule() {
38
+ const ret = {
39
+ begin: isLookbehindSupported() ? '((?<!\\\\))!!' : '(^|[^\\\\])!!',
40
+ end: '!!',
41
+ content: '(#[0-9a-zA-Z]{3,6}|[a-z]{3,20})[\\s]([\\w\\W]+?)',
42
+ };
43
+ ret.reg = new RegExp(ret.begin + ret.content + ret.end, 'g');
44
+ return ret;
45
+ }
46
+ overlayMode() {
47
+ return {
48
+ name: 'color',
49
+ inSizeContainer: false,
50
+ countTotal: 0,
51
+ token(stream, state) {
52
+ // 前景色
53
+ if (stream.match(/!!#\w+\s.*?!!/) || stream.match(/!!!#\w+\s.*?!!!/)) {
54
+ stream.backUp(stream.current().length); // 回退以单独处理
55
+ this.inSizeContainer = true;
56
+ this.countTotal = 0;
57
+ }
58
+
59
+ if (this.inSizeContainer) {
60
+ if (stream.match(/!+/) && stream.peek() !== '!') {
61
+ this.countTotal += 1;
62
+ if (this.countTotal === 2) {
63
+ this.inSizeContainer = false;
64
+ this.countTotal = 0;
65
+ }
66
+ return 'size-container'; // 自定义样式类名
67
+ }
68
+ if (stream.match(/#\w+/)) {
69
+ return 'size-number'; // 自定义样式类名
70
+ }
71
+ }
72
+
73
+ stream.next(); // 前进到下一个字符
74
+ return null; // 默认返回 null
75
+ },
76
+ };
77
+ }
78
+ }
@@ -0,0 +1,96 @@
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
+ import ParagraphBase from '@/core/ParagraphBase';
17
+ import { compileRegExp } from '@/utils/regexp';
18
+ import UrlCache from '@/UrlCache';
19
+ /**
20
+ * 脚注和引用语法
21
+ * 示例:
22
+ * 这里需要一个脚注[^脚注别名1],另外这里也需要一个脚注[^another]。
23
+ * [^脚注别名1]: 无论脚注内容写在哪里,脚注的内容总会显示在页面最底部
24
+ * 以两次回车结束
25
+ *
26
+ * [^another]: 另外,脚注里也可以使用一些简单的markdown语法
27
+ * >比如 !!#ff0000 这里!!有一段**引用**
28
+ */
29
+ export default class CommentReference extends ParagraphBase {
30
+ static HOOK_NAME = 'commentReference';
31
+
32
+ constructor({ externals, config }) {
33
+ super();
34
+ this.commentCache = {};
35
+ }
36
+
37
+ $cleanCache() {
38
+ this.commentCache = {};
39
+ }
40
+
41
+ pushCommentReferenceCache(key, cache) {
42
+ const [url, ...args] = cache.split(/[ ]+/g);
43
+ const innerUrl = UrlCache.set(url);
44
+ this.commentCache[`${key}`.toLowerCase()] = [innerUrl, ...args].join(' ');
45
+ }
46
+
47
+ getCommentReferenceCache(key) {
48
+ return this.commentCache[`${key}`.toLowerCase()] || null;
49
+ }
50
+
51
+ beforeMakeHtml(str) {
52
+ let $str = str;
53
+ if (this.test($str)) {
54
+ $str = $str.replace(this.RULE.reg, (match, leading, key, content) => {
55
+ this.pushCommentReferenceCache(key, content);
56
+ const lineFeeds = match.match(/\n/g) ?? [];
57
+ return lineFeeds.join('');
58
+ });
59
+ // 替换实际引用
60
+ const refRegex = /(\[[^\]\n]+?\])?(?:\[([^\]\n]+?)\])/g; // 匹配[xxx][ref]形式的内容,不严格大小写
61
+ $str = $str.replace(refRegex, (match, leadingContent, key) => {
62
+ const cache = this.getCommentReferenceCache(key);
63
+ if (cache) {
64
+ if (leadingContent) {
65
+ return `${leadingContent}(${cache})`; // 替换为[xx](cache)形式,交给Link或多媒体标签处理
66
+ }
67
+ return `[${key}](${cache})`; // 替换为[ref](cache)形式,交给Link或多媒体标签处理
68
+ }
69
+ return match;
70
+ });
71
+ this.$cleanCache();
72
+ }
73
+ return $str;
74
+ }
75
+
76
+ makeHtml(str, sentenceMakeFunc) {
77
+ return str;
78
+ }
79
+
80
+ afterMakeHtml(str) {
81
+ return UrlCache.restoreAll(str);
82
+ }
83
+
84
+ rule() {
85
+ const ret = {
86
+ begin: '(^|\\n)[ \t]*',
87
+ content: [
88
+ '\\[([^^][^\\]]*?)\\]:\\h*', // comment key
89
+ '([^\\n]+?)', // comment content
90
+ ].join(''),
91
+ end: '(?=$|\\n)',
92
+ };
93
+ ret.reg = compileRegExp(ret, 'g', true);
94
+ return ret;
95
+ }
96
+ }
@@ -0,0 +1,138 @@
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
+ import ParagraphBase from '@/core/ParagraphBase';
17
+ import { prependLineFeedForParagraph } from '@/utils/lineFeed';
18
+ import { getDetailRule } from '@/utils/regexp';
19
+ import { blockNames } from '@/utils/sanitize';
20
+
21
+ /**
22
+ * +++(-) 点击查看详情
23
+ * body
24
+ * body
25
+ * ++ 标题(默认收起内容)
26
+ * 内容
27
+ * ++- 标题(默认展开内容)
28
+ * 内容2
29
+ * +++
30
+ */
31
+ export default class Detail extends ParagraphBase {
32
+ static HOOK_NAME = 'detail';
33
+
34
+ constructor() {
35
+ super({ needCache: true });
36
+ }
37
+
38
+ makeHtml(str, sentenceMakeFunc) {
39
+ return str.replace(this.RULE.reg, (match, preLines, isOpen, title, content) => {
40
+ const lineCount = this.getLineCount(match, preLines);
41
+ const sign = this.$engine.md5(match);
42
+ const { type, html } = this.$getDetailInfo(isOpen, title, content, sentenceMakeFunc);
43
+ const ret = this.pushCache(
44
+ `<div class="cherry-detail cherry-detail__${type}" data-sign="${sign}" data-lines="${lineCount}" >${html}</div>`,
45
+ sign,
46
+ lineCount,
47
+ );
48
+ return prependLineFeedForParagraph(match, ret);
49
+ });
50
+ }
51
+
52
+ $getDetailInfo(isOpen, title, str, sentenceMakeFunc) {
53
+ const type = /\n\s*(\+\+|\+\+-)\s*[^\n]+\n/.test(str) ? 'multiple' : 'single';
54
+ const arr = str.split(/\n\s*(\+\+-?\s*[^\n]+)\n/);
55
+ let defaultOpen = isOpen === '-';
56
+ let currentTitle = title;
57
+ let html = '';
58
+ if (type === 'multiple') {
59
+ arr.forEach((item) => {
60
+ if (/^\s*\+\+/.test(item)) {
61
+ defaultOpen = /^\s*\+\+-/.test(item);
62
+ currentTitle = item.replace(/\+\+-?\s*([^\n]+)$/, '$1');
63
+ return true;
64
+ }
65
+ html += this.$getDetailHtml(defaultOpen, currentTitle, item, sentenceMakeFunc);
66
+ });
67
+ } else {
68
+ html = this.$getDetailHtml(defaultOpen, currentTitle, str, sentenceMakeFunc);
69
+ }
70
+ return { type, html };
71
+ }
72
+
73
+ $getDetailHtml(defaultOpen, title, str, sentenceMakeFunc) {
74
+ let ret = `<details ${defaultOpen ? 'open' : ''}>`;
75
+ const paragraphProcessor = (str) => {
76
+ if (str.trim() === '') {
77
+ return '';
78
+ }
79
+ // 调用行内语法,获得段落的签名和对应html内容
80
+ const { html } = sentenceMakeFunc(str);
81
+ let domName = 'p';
82
+ // 如果包含html块级标签(比如div、blockquote等),则当前段落外层用div包裹,反之用p包裹
83
+ const isContainBlockTest = new RegExp(`<(${blockNames})[^>]*>`, 'i');
84
+ if (isContainBlockTest.test(html)) {
85
+ domName = 'div';
86
+ }
87
+ return `<${domName}>${this.$cleanParagraph(html)}</${domName}>`;
88
+ };
89
+ ret += `<summary>${sentenceMakeFunc(title).html}</summary>`;
90
+ let $body = '';
91
+ if (this.isContainsCache(str)) {
92
+ $body = this.makeExcludingCached(str, paragraphProcessor);
93
+ } else {
94
+ $body = paragraphProcessor(str);
95
+ }
96
+ ret += `<div class="cherry-detail-body">${$body}</div>`;
97
+ ret += `</details>`;
98
+ return ret;
99
+ }
100
+
101
+ rule() {
102
+ return getDetailRule();
103
+ }
104
+
105
+ overlayMode() {
106
+ return {
107
+ inDetailContainer: false,
108
+ name: 'detail',
109
+ token(stream, state) {
110
+ // 检查行的开头是否有 ':::'
111
+ if (stream.sol() && stream.match('+++')) {
112
+ this.inDetailContainer = stream.peek() !== null;
113
+ return 'detail-container';
114
+ }
115
+
116
+ if (stream.sol() && stream.match('++-')) {
117
+ this.inDetailContainer = true;
118
+ return 'detail-container';
119
+ }
120
+
121
+ if (stream.sol() && stream.match('++')) {
122
+ this.inDetailContainer = true;
123
+ return 'detail-container';
124
+ }
125
+
126
+ const rule = /\s.*$/;
127
+ // 尝试匹配规则
128
+ if (this.inDetailContainer && stream.match(rule)) {
129
+ this.inDetailContainer = false;
130
+ return 'detail-title';
131
+ }
132
+ this.inDetailContainer = false;
133
+ stream.next(); // 前进到下一个字符
134
+ return null; // 默认返回 null
135
+ },
136
+ };
137
+ }
138
+ }