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,230 @@
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
+
17
+ import { svg2img, getSvgString } from '@/utils/svgUtils';
18
+ import { copyTextByClipboard } from '@/utils/copy';
19
+ import MathBlock from '@/core/hooks/MathBlock';
20
+
21
+ export default class FormulaHandler {
22
+ /** @type{HTMLElement} */
23
+ bubbleContainer = null;
24
+ /**
25
+ * @param {string} trigger 触发方式
26
+ * @param {Element} target 目标dom
27
+ * @param {HTMLDivElement} container bubble容器
28
+ * @param {HTMLDivElement} previewerDom 预览器dom
29
+ * @param {import('../Editor').default} editor 编辑器实例
30
+ */
31
+ constructor(trigger, target, container, previewerDom, editor) {
32
+ this.trigger = trigger;
33
+ this.target = target;
34
+ this.container = container;
35
+ this.previewerDom = previewerDom;
36
+ this.editor = editor;
37
+ }
38
+
39
+ /**
40
+ * 触发事件
41
+ * @param {string} type 事件类型
42
+ * @param {Event} event 事件对象
43
+ */
44
+ // @ts-ignore
45
+ emit(type, event) {
46
+ switch (type) {
47
+ case 'remove':
48
+ case 'scroll':
49
+ return this.remove();
50
+ }
51
+ }
52
+
53
+ /**
54
+ * 绘制公式操作bubble容器
55
+ */
56
+ drawBubble() {
57
+ const bubbleContainer = document.createElement('div');
58
+ bubbleContainer.innerHTML = `<div class="formula-utils-btn formula-utils-img">
59
+ <button>输出图片</button>
60
+ <div class="formula-utils-submenu formula-utils-img-submenu">
61
+ <div class="formula-utils-submenu-btn formula-utils-img-svg">
62
+ <button data-name="svg">svg</button>
63
+ </div>
64
+ <div class="formula-utils-submenu-btn formula-utils-img-png">
65
+ <button data-name="png">png</button>
66
+ </div>
67
+ <div class="formula-utils-submenu-btn formula-utils-img-jpg">
68
+ <button data-name="jpg">jpg</button>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ <div class="formula-utils-btn formula-utils-code">
73
+ <button>输出代码</button>
74
+ <div class="formula-utils-submenu formula-utils-code-submenu">
75
+ <div class="formula-utils-submenu-btn formula-utils-code-latex">
76
+ <button data-name="latex">latex</button>
77
+ </div>
78
+ <div class="formula-utils-submenu-btn formula-utils-code-html">
79
+ <button data-name="html">html</button>
80
+ </div>
81
+ <div class="formula-utils-submenu-btn formula-utils-code-svgcode">
82
+ <button data-name="svgcode">svgcode</button>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ <div class="formula-utils-btn formula-utils-word">
87
+ <button>输出mathml</button>
88
+ <div class="formula-utils-submenu formula-utils-word-submenu">
89
+ <div class="formula-utils-submenu-btn formula-utils-word-mathml">
90
+ <button data-name="mathml">mathml</button>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ <div class="formula-utils-btn formula-utils-transfer">
95
+ <button>转义</button>
96
+ <div class="formula-utils-submenu formula-utils-transfer-submenu">
97
+ <div class="formula-utils-submenu-btn formula-utils-transfer-backslash">
98
+ <button data-name="\\">反斜杠</button>
99
+ </div>
100
+ <div class="formula-utils-submenu-btn formula-utils-transfer-dollar">
101
+ <button data-name="$">$包裹</button>
102
+ </div>
103
+ <div class="formula-utils-submenu-btn formula-utils-transfer-double-dollar">
104
+ <button data-name="$$">$$包裹</button>
105
+ </div>
106
+ </div>
107
+ </div>`;
108
+ bubbleContainer.id = 'formula-utils-bubble-container'; // 方便 namedItem 获取
109
+ bubbleContainer.className = ['formula-utils-bubble-container'].join(' ');
110
+ this.bubbleContainer = bubbleContainer;
111
+ this?.editor?.$cherry?.wrapperDom?.appendChild(bubbleContainer);
112
+ }
113
+
114
+ /**
115
+ * 显示bubble
116
+ * @param {number} x
117
+ * @param {number} y
118
+ */
119
+ showBubble(x, y) {
120
+ const bubbleContainer = this?.editor?.$cherry?.wrapperDom?.children?.namedItem('formula-utils-bubble-container');
121
+ const targetRect = this.target.getBoundingClientRect();
122
+ if (bubbleContainer instanceof HTMLElement) {
123
+ this.bubbleContainer = bubbleContainer;
124
+ } else {
125
+ this.drawBubble();
126
+ }
127
+ this.bubbleContainer.style.display = 'flex';
128
+ this.bubbleContainer.style.top = `${y || targetRect.top}px`;
129
+ this.bubbleContainer.style.left = `${x || targetRect.left}px`;
130
+ this.bubbleContainer.addEventListener('click', this.bubbleClickHandler.bind(this), { once: true });
131
+ this.collectFormulaCode();
132
+ }
133
+
134
+ collectFormulaCode() {
135
+ const formulaCode = [];
136
+ // @ts-ignore
137
+ this.editor.editor.getValue().replace(/(\$+)\s*([\w\W]*?)\s*(\1)/g, (whole, start, content, end, offset) => {
138
+ formulaCode.push({
139
+ code: content,
140
+ offset,
141
+ });
142
+ });
143
+ this.formulaCode = formulaCode;
144
+ }
145
+
146
+ remove() {
147
+ if (this.bubbleContainer) {
148
+ this.bubbleContainer.style.display = 'none';
149
+ }
150
+ }
151
+
152
+ /**
153
+ * bubble 上的点击事件
154
+ * @param {Event} e
155
+ */
156
+ bubbleClickHandler(e) {
157
+ e.preventDefault();
158
+ e.stopPropagation();
159
+ const { target } = e;
160
+ if (target instanceof HTMLButtonElement) {
161
+ const { name = '' } = target.dataset;
162
+ switch (name) {
163
+ case 'svg':
164
+ case 'png':
165
+ case 'jpg':
166
+ // 涉及到图片的操作
167
+ if (this.target instanceof SVGSVGElement) {
168
+ svg2img(this.target, { format: name });
169
+ }
170
+ break;
171
+ case 'html':
172
+ case 'svgcode':
173
+ // 涉及到代码的操作
174
+ if (this.target instanceof SVGSVGElement) {
175
+ if (name === 'svgcode') {
176
+ copyTextByClipboard(getSvgString(this.target));
177
+ } else {
178
+ const mathElement = this.target.parentElement.querySelector('math');
179
+ mathElement.setAttribute('xmlns', 'http://www.w3.org/1998/Math/MathML');
180
+ copyTextByClipboard(mathElement.outerHTML);
181
+ }
182
+ }
183
+ break;
184
+ case '\\':
185
+ case '$':
186
+ case '$$':
187
+ case 'latex':
188
+ case 'mathml':
189
+ case 'docx':
190
+ // 涉及到公式API的操作
191
+ {
192
+ const allMjx = this.previewerDom.querySelectorAll('mjx-container');
193
+ let mjxIndex = -1;
194
+ allMjx.forEach((mjx, index) => {
195
+ if (mjx === this.target.parentElement) {
196
+ mjxIndex = index;
197
+ }
198
+ });
199
+ if (mjxIndex >= 0 && this.formulaCode[mjxIndex]) {
200
+ const { code } = this.formulaCode[mjxIndex];
201
+ if (name === 'mathml' || name === 'docx') {
202
+ /** @type {MathBlock} */
203
+ // @ts-ignore
204
+ const hook = this.editor.$cherry.engine.hooks.paragraph.find((hook) => hook instanceof MathBlock);
205
+ if (hook) {
206
+ window.MathJax?.texReset();
207
+ window.MathJax?.tex2mmlPromise?.(code, { display: true }).then((mml) => {
208
+ if (name === 'mathml') {
209
+ copyTextByClipboard(mml);
210
+ }
211
+ });
212
+ }
213
+ // TODO: other engine
214
+ } else if (name === 'latex') {
215
+ copyTextByClipboard(code);
216
+ } else if (name === '$') {
217
+ copyTextByClipboard(`${name}${code}${name}`);
218
+ } else if (name === '$$') {
219
+ copyTextByClipboard(`${name}\n${code}\n${name}`);
220
+ } else if (name === '\\') {
221
+ copyTextByClipboard(`\\${code}`);
222
+ }
223
+ }
224
+ }
225
+ break;
226
+ }
227
+ }
228
+ this.remove();
229
+ }
230
+ }