@cherry-markdown/cherry-markdown-dev 0.9.0-dev.202504110650.834443a → 0.9.0-dev.202504160300.d23d141

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 (327) hide show
  1. package/README.md +2 -2
  2. package/dist/addons/advance/cherry-table-echarts-plugin.js +1 -1
  3. package/dist/addons/cherry-code-block-mermaid-plugin.js +1 -1
  4. package/dist/cherry-markdown.core.common.js +1 -1
  5. package/dist/cherry-markdown.core.js +1 -1
  6. package/dist/cherry-markdown.engine.core.common.js +1 -1
  7. package/dist/cherry-markdown.engine.core.esm.js +1 -1
  8. package/dist/cherry-markdown.engine.core.js +1 -1
  9. package/dist/cherry-markdown.esm.js +1 -1
  10. package/dist/cherry-markdown.js +1 -1
  11. package/dist/cherry-markdown.min.js +1 -1
  12. package/dist/fonts/ch-icon.eot +0 -0
  13. package/dist/fonts/ch-icon.ttf +0 -0
  14. package/dist/fonts/ch-icon.woff +0 -0
  15. package/dist/fonts/ch-icon.woff2 +0 -0
  16. package/package.json +1 -3
  17. package/src/Cherry.config.js +0 -634
  18. package/src/Cherry.js +0 -1104
  19. package/src/CherryStatic.js +0 -70
  20. package/src/Editor.js +0 -748
  21. package/src/Engine.js +0 -402
  22. package/src/Event.js +0 -140
  23. package/src/Factory.js +0 -180
  24. package/src/Logger.js +0 -31
  25. package/src/Previewer.js +0 -1192
  26. package/src/Sanitizer.js +0 -4
  27. package/src/Sanitizer.node.js +0 -7
  28. package/src/UrlCache.js +0 -98
  29. package/src/addons/advance/cherry-table-echarts-plugin.js +0 -170
  30. package/src/addons/cherry-code-block-mermaid-plugin.js +0 -158
  31. package/src/addons/cherry-code-block-plantuml-plugin.js +0 -106
  32. package/src/core/HookCenter.js +0 -297
  33. package/src/core/HooksConfig.js +0 -105
  34. package/src/core/ParagraphBase.js +0 -332
  35. package/src/core/SentenceBase.js +0 -65
  36. package/src/core/SyntaxBase.js +0 -194
  37. package/src/core/hooks/AutoLink.js +0 -232
  38. package/src/core/hooks/BackgroundColor.js +0 -46
  39. package/src/core/hooks/Blockquote.js +0 -70
  40. package/src/core/hooks/Br.js +0 -85
  41. package/src/core/hooks/CodeBlock.js +0 -456
  42. package/src/core/hooks/Color.js +0 -46
  43. package/src/core/hooks/CommentReference.js +0 -96
  44. package/src/core/hooks/Detail.js +0 -108
  45. package/src/core/hooks/Emoji.config.js +0 -1825
  46. package/src/core/hooks/Emoji.js +0 -119
  47. package/src/core/hooks/Emphasis.js +0 -113
  48. package/src/core/hooks/Footnote.js +0 -125
  49. package/src/core/hooks/FrontMatter.js +0 -51
  50. package/src/core/hooks/Header.js +0 -234
  51. package/src/core/hooks/HighLight.js +0 -37
  52. package/src/core/hooks/Hr.js +0 -52
  53. package/src/core/hooks/HtmlBlock.js +0 -199
  54. package/src/core/hooks/Image.js +0 -174
  55. package/src/core/hooks/InlineCode.js +0 -48
  56. package/src/core/hooks/InlineMath.js +0 -108
  57. package/src/core/hooks/Link.js +0 -160
  58. package/src/core/hooks/List.js +0 -264
  59. package/src/core/hooks/MathBlock.js +0 -104
  60. package/src/core/hooks/Panel.js +0 -145
  61. package/src/core/hooks/Paragraph.js +0 -84
  62. package/src/core/hooks/Ruby.js +0 -34
  63. package/src/core/hooks/Size.js +0 -51
  64. package/src/core/hooks/Strikethrough.js +0 -54
  65. package/src/core/hooks/Sub.js +0 -47
  66. package/src/core/hooks/SuggestList.js +0 -333
  67. package/src/core/hooks/Suggester.js +0 -707
  68. package/src/core/hooks/Sup.js +0 -47
  69. package/src/core/hooks/Table.js +0 -275
  70. package/src/core/hooks/Toc.js +0 -292
  71. package/src/core/hooks/Transfer.js +0 -47
  72. package/src/core/hooks/Underline.js +0 -37
  73. package/src/index.core.js +0 -29
  74. package/src/index.engine.core.js +0 -68
  75. package/src/index.engine.js +0 -28
  76. package/src/index.js +0 -32
  77. package/src/libs/mermaidAPI.8.4.8.js +0 -1
  78. package/src/libs/mermaidAPI.8.5.2.js +0 -42
  79. package/src/libs/rawdeflate.js +0 -1663
  80. package/src/locales/en_US.js +0 -139
  81. package/src/locales/index.js +0 -25
  82. package/src/locales/ru_RU.js +0 -139
  83. package/src/locales/zh_CN.js +0 -142
  84. package/src/sass/base.scss +0 -26
  85. package/src/sass/bubble_formula.scss +0 -166
  86. package/src/sass/ch-icon.scss +0 -118
  87. package/src/sass/cherry.scss +0 -1116
  88. package/src/sass/components/bubble.scss +0 -173
  89. package/src/sass/components/shortcut_key_config.scss +0 -108
  90. package/src/sass/formula_utils_bubble.scss +0 -82
  91. package/src/sass/icon_template.scss +0 -24
  92. package/src/sass/icons/uEA03-list.svg +0 -19
  93. package/src/sass/icons/uEA04-check.svg +0 -14
  94. package/src/sass/icons/uEA09-square.svg +0 -10
  95. package/src/sass/icons/uEA0A-bold.svg +0 -20
  96. package/src/sass/icons/uEA0B-code.svg +0 -18
  97. package/src/sass/icons/uEA0C-color.svg +0 -13
  98. package/src/sass/icons/uEA0D-header.svg +0 -8
  99. package/src/sass/icons/uEA0E-image.svg +0 -15
  100. package/src/sass/icons/uEA0F-italic.svg +0 -8
  101. package/src/sass/icons/uEA10-link.svg +0 -16
  102. package/src/sass/icons/uEA11-ol.svg +0 -21
  103. package/src/sass/icons/uEA12-size.svg +0 -11
  104. package/src/sass/icons/uEA13-strike.svg +0 -16
  105. package/src/sass/icons/uEA14-table.svg +0 -12
  106. package/src/sass/icons/uEA15-ul.svg +0 -17
  107. package/src/sass/icons/uEA16-underline.svg +0 -13
  108. package/src/sass/icons/uEA17-word.svg +0 -16
  109. package/src/sass/icons/uEA18-blockquote.svg +0 -11
  110. package/src/sass/icons/uEA19-font.svg +0 -10
  111. package/src/sass/icons/uEA1F-insertClass.svg +0 -39
  112. package/src/sass/icons/uEA20-insertFlow.svg +0 -8
  113. package/src/sass/icons/uEA21-insertFormula.svg +0 -23
  114. package/src/sass/icons/uEA22-insertGantt.svg +0 -13
  115. package/src/sass/icons/uEA23-insertGraph.svg +0 -13
  116. package/src/sass/icons/uEA24-insertPie.svg +0 -19
  117. package/src/sass/icons/uEA25-insertSeq.svg +0 -20
  118. package/src/sass/icons/uEA26-insertState.svg +0 -35
  119. package/src/sass/icons/uEA27-line.svg +0 -11
  120. package/src/sass/icons/uEA28-preview.svg +0 -18
  121. package/src/sass/icons/uEA29-previewClose.svg +0 -24
  122. package/src/sass/icons/uEA2A-toc.svg +0 -24
  123. package/src/sass/icons/uEA2D-sub.svg +0 -15
  124. package/src/sass/icons/uEA2E-sup.svg +0 -15
  125. package/src/sass/icons/uEA2F-h1.svg +0 -16
  126. package/src/sass/icons/uEA30-h2.svg +0 -20
  127. package/src/sass/icons/uEA31-h3.svg +0 -23
  128. package/src/sass/icons/uEA32-h4.svg +0 -16
  129. package/src/sass/icons/uEA33-h5.svg +0 -20
  130. package/src/sass/icons/uEA34-h6.svg +0 -17
  131. package/src/sass/icons/uEA35-video.svg +0 -20
  132. package/src/sass/icons/uEA36-insert.svg +0 -25
  133. package/src/sass/icons/uEA37-little_table.svg +0 -30
  134. package/src/sass/icons/uEA38-pdf.svg +0 -27
  135. package/src/sass/icons/uEA39-checklist.svg +0 -22
  136. package/src/sass/icons/uEA40-close.svg +0 -12
  137. package/src/sass/icons/uEA41-fullscreen.svg +0 -81
  138. package/src/sass/icons/uEA42-minscreen.svg +0 -77
  139. package/src/sass/icons/uEA43-insertChart.svg +0 -23
  140. package/src/sass/icons/uEA44-question.svg +0 -25
  141. package/src/sass/icons/uEA45-settings.svg +0 -32
  142. package/src/sass/icons/uEA46-ok.svg +0 -7
  143. package/src/sass/icons/uEA47-br.svg +0 -22
  144. package/src/sass/icons/uEA48-normal.svg +0 -15
  145. package/src/sass/icons/uEA49-undo.svg +0 -19
  146. package/src/sass/icons/uEA50-redo.svg +0 -21
  147. package/src/sass/icons/uEA51-copy.svg +0 -6
  148. package/src/sass/icons/uEA52-phone.svg +0 -5
  149. package/src/sass/icons/uEA53-cherry-table-delete.svg +0 -17
  150. package/src/sass/icons/uEA54-cherry-table-insert-bottom.svg +0 -16
  151. package/src/sass/icons/uEA55-cherry-table-insert-left.svg +0 -15
  152. package/src/sass/icons/uEA56-cherry-table-insert-right.svg +0 -16
  153. package/src/sass/icons/uEA57-cherry-table-insert-top.svg +0 -16
  154. package/src/sass/icons/uEA58-sort-s.svg +0 -13
  155. package/src/sass/icons/uEA59-pinyin.svg +0 -1
  156. package/src/sass/icons/uEA5A-create.svg +0 -24
  157. package/src/sass/icons/uEA5B-download.svg +0 -34
  158. package/src/sass/icons/uEA5C-edit.svg +0 -3
  159. package/src/sass/icons/uEA5D-export.svg +0 -53
  160. package/src/sass/icons/uEA5E-folder-open.svg +0 -3
  161. package/src/sass/icons/uEA5F-folder.svg +0 -3
  162. package/src/sass/icons/uEA60-help.svg +0 -5
  163. package/src/sass/icons/uEA61-pen-fill.svg +0 -13
  164. package/src/sass/icons/uEA62-pen.svg +0 -3
  165. package/src/sass/icons/uEA64-tips.svg +0 -5
  166. package/src/sass/icons/uEA65-warn.svg +0 -5
  167. package/src/sass/icons/uEA66-mistake.svg +0 -4
  168. package/src/sass/icons/uEA67-success.svg +0 -4
  169. package/src/sass/icons/uEA68-danger.svg +0 -4
  170. package/src/sass/icons/uEA69-info.svg +0 -5
  171. package/src/sass/icons/uEA6A-primary.svg +0 -5
  172. package/src/sass/icons/uEA6B-warning.svg +0 -5
  173. package/src/sass/icons/uEA6C-justify.svg +0 -19
  174. package/src/sass/icons/uEA6D-justifyCenter.svg +0 -19
  175. package/src/sass/icons/uEA6E-justifyLeft.svg +0 -19
  176. package/src/sass/icons/uEA6F-justifyRight.svg +0 -19
  177. package/src/sass/icons/uEA70-chevronsLeft.svg +0 -1
  178. package/src/sass/icons/uEA71-chevronsRight.svg +0 -1
  179. package/src/sass/icons/uEA72-trendingUp.svg +0 -1
  180. package/src/sass/icons/uEA74-codeBlock.svg +0 -1
  181. package/src/sass/icons/uEA75-expand.svg +0 -3
  182. package/src/sass/icons/uEA76-unExpand.svg +0 -3
  183. package/src/sass/icons/uEA77-swap-vert.svg +0 -1
  184. package/src/sass/icons/uEA78-swap.svg +0 -1
  185. package/src/sass/icons/uEA79-keyboard.svg +0 -1
  186. package/src/sass/icons/uEA7A-command.svg +0 -1
  187. package/src/sass/icons/uEA7B-search.svg +0 -1
  188. package/src/sass/index.scss +0 -3
  189. package/src/sass/markdown.scss +0 -668
  190. package/src/sass/markdown_pure.scss +0 -9
  191. package/src/sass/prettyprint/prettyprint.scss +0 -118
  192. package/src/sass/previewer.scss +0 -179
  193. package/src/sass/print.scss +0 -13
  194. package/src/sass/prism/coy.scss +0 -220
  195. package/src/sass/prism/dark.scss +0 -132
  196. package/src/sass/prism/default.scss +0 -143
  197. package/src/sass/prism/funky.scss +0 -133
  198. package/src/sass/prism/okaidia.scss +0 -126
  199. package/src/sass/prism/one-dark.scss +0 -440
  200. package/src/sass/prism/one-light.scss +0 -428
  201. package/src/sass/prism/solarized-light.scss +0 -153
  202. package/src/sass/prism/tomorrow-night.scss +0 -125
  203. package/src/sass/prism/twilight.scss +0 -202
  204. package/src/sass/prism/vs-dark.scss +0 -275
  205. package/src/sass/prism/vs-light.scss +0 -168
  206. package/src/sass/themes/blue.scss +0 -411
  207. package/src/sass/themes/dark.scss +0 -517
  208. package/src/sass/themes/default.scss +0 -255
  209. package/src/sass/themes/green.scss +0 -395
  210. package/src/sass/themes/light.scss +0 -368
  211. package/src/sass/themes/red.scss +0 -397
  212. package/src/sass/themes/violet.scss +0 -410
  213. package/src/sass/variable.scss +0 -84
  214. package/src/toolbars/Bubble.js +0 -234
  215. package/src/toolbars/BubbleFormula.js +0 -298
  216. package/src/toolbars/BubbleTable.js +0 -147
  217. package/src/toolbars/FloatMenu.js +0 -131
  218. package/src/toolbars/HiddenToolbar.js +0 -36
  219. package/src/toolbars/HookCenter.js +0 -231
  220. package/src/toolbars/MenuBase.js +0 -569
  221. package/src/toolbars/PreviewerBubble.js +0 -608
  222. package/src/toolbars/ShortcutKeyConfigPanel.js +0 -345
  223. package/src/toolbars/Sidebar.js +0 -36
  224. package/src/toolbars/Toc.js +0 -242
  225. package/src/toolbars/Toolbar.js +0 -449
  226. package/src/toolbars/ToolbarRight.js +0 -37
  227. package/src/toolbars/hooks/Audio.js +0 -79
  228. package/src/toolbars/hooks/BarTable.js +0 -41
  229. package/src/toolbars/hooks/Bold.js +0 -73
  230. package/src/toolbars/hooks/Br.js +0 -34
  231. package/src/toolbars/hooks/ChangeLocale.js +0 -62
  232. package/src/toolbars/hooks/ChatGpt.js +0 -182
  233. package/src/toolbars/hooks/CheckList.js +0 -41
  234. package/src/toolbars/hooks/Code.js +0 -49
  235. package/src/toolbars/hooks/CodeTheme.js +0 -66
  236. package/src/toolbars/hooks/Color.js +0 -298
  237. package/src/toolbars/hooks/Copy.js +0 -141
  238. package/src/toolbars/hooks/Detail.js +0 -69
  239. package/src/toolbars/hooks/DrawIo.js +0 -57
  240. package/src/toolbars/hooks/Export.js +0 -49
  241. package/src/toolbars/hooks/File.js +0 -79
  242. package/src/toolbars/hooks/Formula.js +0 -69
  243. package/src/toolbars/hooks/FullScreen.js +0 -50
  244. package/src/toolbars/hooks/Graph.js +0 -263
  245. package/src/toolbars/hooks/H1.js +0 -71
  246. package/src/toolbars/hooks/H2.js +0 -71
  247. package/src/toolbars/hooks/H3.js +0 -71
  248. package/src/toolbars/hooks/Header.js +0 -118
  249. package/src/toolbars/hooks/Hr.js +0 -35
  250. package/src/toolbars/hooks/Image.js +0 -91
  251. package/src/toolbars/hooks/InlineCode.js +0 -53
  252. package/src/toolbars/hooks/Insert.js +0 -193
  253. package/src/toolbars/hooks/Italic.js +0 -72
  254. package/src/toolbars/hooks/Justify.js +0 -49
  255. package/src/toolbars/hooks/LineTable.js +0 -41
  256. package/src/toolbars/hooks/Link.js +0 -49
  257. package/src/toolbars/hooks/List.js +0 -55
  258. package/src/toolbars/hooks/MobilePreview.js +0 -44
  259. package/src/toolbars/hooks/Ol.js +0 -41
  260. package/src/toolbars/hooks/Panel.js +0 -140
  261. package/src/toolbars/hooks/Pdf.js +0 -78
  262. package/src/toolbars/hooks/Publish.js +0 -123
  263. package/src/toolbars/hooks/QuickTable.js +0 -43
  264. package/src/toolbars/hooks/Quote.js +0 -45
  265. package/src/toolbars/hooks/Redo.js +0 -33
  266. package/src/toolbars/hooks/Ruby.js +0 -59
  267. package/src/toolbars/hooks/Search.js +0 -53
  268. package/src/toolbars/hooks/Settings.js +0 -220
  269. package/src/toolbars/hooks/ShortcutKey.js +0 -62
  270. package/src/toolbars/hooks/Size.js +0 -118
  271. package/src/toolbars/hooks/Split.js +0 -37
  272. package/src/toolbars/hooks/Strikethrough.js +0 -71
  273. package/src/toolbars/hooks/Sub.js +0 -58
  274. package/src/toolbars/hooks/Sup.js +0 -58
  275. package/src/toolbars/hooks/SwitchModel.js +0 -56
  276. package/src/toolbars/hooks/Table.js +0 -56
  277. package/src/toolbars/hooks/Theme.js +0 -62
  278. package/src/toolbars/hooks/Toc.js +0 -35
  279. package/src/toolbars/hooks/TogglePreview.js +0 -91
  280. package/src/toolbars/hooks/Ul.js +0 -41
  281. package/src/toolbars/hooks/Underline.js +0 -68
  282. package/src/toolbars/hooks/Undo.js +0 -30
  283. package/src/toolbars/hooks/Video.js +0 -79
  284. package/src/toolbars/hooks/Word.js +0 -78
  285. package/src/toolbars/hooks/WordCount.js +0 -106
  286. package/src/utils/autoindent.js +0 -58
  287. package/src/utils/cm-search-replace.js +0 -794
  288. package/src/utils/code-preview-language-setting.js +0 -180
  289. package/src/utils/codeBlockContentHandler.js +0 -400
  290. package/src/utils/config.js +0 -174
  291. package/src/utils/copy.js +0 -55
  292. package/src/utils/dialog.js +0 -214
  293. package/src/utils/dom.js +0 -163
  294. package/src/utils/downloadUtil.js +0 -23
  295. package/src/utils/env.js +0 -22
  296. package/src/utils/error.js +0 -61
  297. package/src/utils/event.js +0 -38
  298. package/src/utils/export.js +0 -166
  299. package/src/utils/file.js +0 -164
  300. package/src/utils/formulaUtilsHandler.js +0 -232
  301. package/src/utils/htmlparser.js +0 -976
  302. package/src/utils/image.js +0 -99
  303. package/src/utils/imgSizeHandler.js +0 -279
  304. package/src/utils/lazyLoadImg.js +0 -327
  305. package/src/utils/lineFeed.js +0 -49
  306. package/src/utils/listContentHandler.js +0 -227
  307. package/src/utils/lookbehind-replace.js +0 -81
  308. package/src/utils/mathjax.js +0 -89
  309. package/src/utils/myersDiff.js +0 -211
  310. package/src/utils/pasteHelper.js +0 -253
  311. package/src/utils/platformTransform.js +0 -71
  312. package/src/utils/recount-pos.js +0 -59
  313. package/src/utils/regexp.js +0 -295
  314. package/src/utils/sanitize.js +0 -477
  315. package/src/utils/selection.js +0 -50
  316. package/src/utils/shortcutKey.js +0 -291
  317. package/src/utils/svgUtils.js +0 -96
  318. package/src/utils/tableContentHandler.js +0 -876
  319. package/test/core/CommonMark.spec.ts +0 -62
  320. package/test/core/hooks/AutoLink.spec.ts +0 -28
  321. package/test/core/hooks/List.spec.ts +0 -79
  322. package/test/core/hooks/__snapshots__/List.spec.ts.snap +0 -11
  323. package/test/example.md +0 -778
  324. package/test/node.js +0 -10
  325. package/test/suites/commonmark.spec.json +0 -5218
  326. package/test/tsconfig.test.json +0 -6
  327. package/test/utils/regexp.spec.ts +0 -28
@@ -1,345 +0,0 @@
1
- import { mac } from 'codemirror/src/util/browser';
2
- import {
3
- getAllowedShortcutKey,
4
- keyStackIsModifierkeys,
5
- ENTER_KEY,
6
- BACKSPACE_KEY,
7
- keyStack2UniqueString,
8
- shortcutCode2Key,
9
- keyStack2UnPlatformUniqueString,
10
- isEnableShortcutKey,
11
- setDisableShortcutKey,
12
- storageKeyMap,
13
- } from '@/utils/shortcutKey';
14
- import { createElement } from '@/utils/dom';
15
- /**
16
- * 隐藏输入框,展示快捷键配置项
17
- * @param {Element} inputWrapper
18
- * @param {HTMLElement} shortcutPanel
19
- */
20
- function hiddenInputWrapper(inputWrapper, shortcutPanel) {
21
- inputWrapper.setAttribute('style', 'display: none;');
22
- shortcutPanel.style.display = 'flex';
23
- }
24
-
25
- export default class ShortcutKeyConfigPanel {
26
- /**
27
- *
28
- * @param {Partial<import('@/Cherry').default> & {$currentMenuOptions?:import('~types/menus').CustomMenuConfig}} $cherry
29
- */
30
- constructor($cherry) {
31
- this.$cherry = $cherry;
32
- this.shortcutUlClassName = 'cherry-shortcut-key-config-panel-ul';
33
- this.shortcutUlId = this.shortcutUlClassName;
34
- this.shortcutConfigPanelKbdClassName = 'shortcut-key-config-panel-kbd';
35
- this.shortcutKeyboardKeyClassName = 'keyboard-key';
36
- // 双击快捷键区域
37
- this.handleDbClick = (/** @type {MouseEvent} */ e) => {
38
- if (!isEnableShortcutKey(this.$cherry.nameSpace)) {
39
- return;
40
- }
41
- if (e.target instanceof HTMLElement) {
42
- if (
43
- e.target.classList.contains(this.shortcutConfigPanelKbdClassName) ||
44
- e.target.classList.contains(this.shortcutKeyboardKeyClassName)
45
- ) {
46
- const shortcutPanel = e.target.classList.contains(this.shortcutConfigPanelKbdClassName)
47
- ? e.target
48
- : e.target.parentElement;
49
- // 隐藏展示快捷键的容器
50
- shortcutPanel.style.display = 'none';
51
- const inputWrapper = shortcutPanel.nextElementSibling;
52
- // 显示输入框
53
- inputWrapper.setAttribute('style', 'display: block;');
54
- const inputElement = inputWrapper.querySelector('input');
55
- const placeholder = [];
56
- shortcutPanel.childNodes.forEach((element) => {
57
- // @ts-ignore
58
- placeholder.push(element.innerText);
59
- });
60
- inputElement.placeholder = placeholder.join('-');
61
- // 获取焦点
62
- inputElement.focus();
63
- inputElement.onblur = () => {
64
- hiddenInputWrapper(inputWrapper, shortcutPanel);
65
- inputElement.value = '';
66
- };
67
- /** @type {string[]} 按下的快捷键栈 */
68
- let keyStack = [];
69
- inputElement.onkeydown = (/** @type {KeyboardEvent} */ e) => {
70
- e.preventDefault();
71
- e.stopPropagation();
72
- if (e.key === ENTER_KEY || e.key === BACKSPACE_KEY) {
73
- if (e.key === ENTER_KEY) {
74
- const { hookname = '' } = shortcutPanel.parentElement?.dataset ?? {};
75
- const oldShortcutKeys = [];
76
- for (let i = 0; i < shortcutPanel.children.length; i++) {
77
- /** @type {HTMLDivElement} */
78
- // @ts-ignore
79
- const element = shortcutPanel.children.item(i);
80
- const { code } = element.dataset ?? {};
81
- if (code) {
82
- oldShortcutKeys.push(code);
83
- }
84
- }
85
- // 防止修改
86
- if (oldShortcutKeys.length === shortcutPanel.children.length) {
87
- // 旧的shortcutKey用于在更新时比较,删除旧值
88
- const oldShortcutKey = keyStack2UniqueString(oldShortcutKeys);
89
- if (hookname) {
90
- // 触发更新快捷键
91
- this.$cherry?.toolbar?.updateShortcutKeyMap(oldShortcutKey, keyStack2UniqueString(keyStack));
92
- // 取二者较大者
93
- const endIndex = Math.max(keyStack.length, shortcutPanel.children.length);
94
- // 更新界面展示的快捷键
95
- for (let i = 0; i < endIndex; i++) {
96
- const element = shortcutPanel.children.item(i);
97
- // 如果当前快捷键栈不存在了,说明新的快捷键个数比上一次少,则应该删除当前element
98
- if (!keyStack[i] && element) {
99
- element.remove();
100
- continue;
101
- }
102
- const matchRes = shortcutCode2Key(keyStack[i], mac);
103
- if (element) {
104
- element.setAttribute('title', matchRes.tip);
105
- element.textContent = matchRes.text;
106
- element.setAttribute('data-code', keyStack[i]);
107
- } else {
108
- const matchRes = shortcutCode2Key(keyStack[i], mac);
109
- const kbd = createElement('span', this.shortcutKeyboardKeyClassName, {
110
- title: matchRes.tip,
111
- });
112
- kbd.setAttribute('data-code', keyStack[i]);
113
- kbd.innerText = matchRes.text;
114
- shortcutPanel.appendChild(kbd);
115
- }
116
- }
117
- }
118
- }
119
- hiddenInputWrapper(inputWrapper, shortcutPanel);
120
- } else {
121
- if (keyStack.length === 0) {
122
- hiddenInputWrapper(inputWrapper, shortcutPanel);
123
- }
124
- // 退栈
125
- keyStack.pop();
126
- inputElement.value = keyStack2UnPlatformUniqueString(keyStack, mac);
127
- }
128
- } else {
129
- keyStack = getAllowedShortcutKey(e);
130
- if (!keyStackIsModifierkeys(keyStack) && Array.isArray(keyStack) && keyStack.length >= 2) {
131
- inputElement.value = keyStack2UnPlatformUniqueString(keyStack, mac);
132
- }
133
- }
134
- };
135
- }
136
- }
137
- };
138
- this.clickSettingsDisableBtn = () => {
139
- if (!isEnableShortcutKey(this.$cherry.nameSpace)) {
140
- setDisableShortcutKey(this.$cherry.nameSpace, 'enable');
141
- this.dom.classList.remove('disable');
142
- this.$cherry.editor.disableShortcut(false);
143
- } else {
144
- setDisableShortcutKey(this.$cherry.nameSpace, 'disable');
145
- this.dom.classList.add('disable');
146
- this.$cherry.editor.disableShortcut(true);
147
- }
148
- };
149
- this.clickSettingsRecoverBtn = () => {
150
- setDisableShortcutKey(this.$cherry.nameSpace, 'enable');
151
- this.dom.classList.remove('disable');
152
- this.$cherry.editor.disableShortcut(false);
153
- this.$cherry.toolbar.shortcutKeyMap = {};
154
- this.$cherry.toolbar.collectShortcutKey(false);
155
- storageKeyMap(this.$cherry.nameSpace, this.$cherry.toolbar.shortcutKeyMap);
156
- this.dom.innerHTML = this.generateShortcutKeyConfigPanelHtmlStr();
157
- this.show();
158
- };
159
- this.init();
160
- }
161
-
162
- init() {
163
- if (this.$cherry?.toolbar?.shortcutKeyMap) {
164
- this.dom = document.createElement('div');
165
- this.dom.className = [
166
- 'cherry-dropdown',
167
- 'cherry-shortcut-key-config-panel',
168
- 'cherry-shortcut-key-config-panel-wrapper',
169
- ].join(' ');
170
- this.dom.innerHTML = this.generateShortcutKeyConfigPanelHtmlStr();
171
- // 实例化后,将容器插入到富文本编辑器中,默认隐藏
172
- this.dom.style.display = 'none';
173
- if (!isEnableShortcutKey(this.$cherry.nameSpace)) {
174
- this.dom.classList.add('disable');
175
- }
176
- this.$cherry.wrapperDom.append(this.dom);
177
- }
178
- }
179
-
180
- generateShortcutKeyConfigPanelHtmlStr() {
181
- const liStr = Object.entries(this.$cherry.toolbar.shortcutKeyMap ?? {})
182
- .filter(([key, val]) => typeof val === 'object' && val)
183
- .map(([key, val]) => {
184
- const { hookName, aliasName, ...rest } = val;
185
- let otherDataSet = '';
186
- if (rest && typeof rest === 'object') {
187
- otherDataSet = Object.entries(rest)
188
- .map(([otherField, fieldValue]) => `data-${otherField}=${fieldValue}`)
189
- .join(' ');
190
- }
191
- return `<li class="cherry-dropdown-item shortcut-key-item" data-hookname=${hookName} ${otherDataSet}>
192
- <div class="shortcut-key-config-panel-name">${aliasName}</div>
193
- <div class="${this.shortcutConfigPanelKbdClassName}">${key
194
- ?.split('-')
195
- .map((singalKey) => {
196
- const matchRes = shortcutCode2Key(singalKey, mac);
197
- const shortKey = matchRes ?? {
198
- text: singalKey,
199
- tip: singalKey,
200
- };
201
- return `<span class="${this.shortcutKeyboardKeyClassName}" title="${shortKey.tip}" data-code="${singalKey}">${shortKey.text}</span>`;
202
- })
203
- .join('')}</div>
204
- <div style="display: none;" class="input-shortcut-wrapper"><input type="text" /></div>
205
- </li>`;
206
- })
207
- .join('');
208
- // <div class="cherry-dropdown-item">
209
- // <input type="checkbox" id="enableMacControl" name="enableMacControl" checked />
210
- // <label for="enableMacControl">启用Mac平台的Control键</label>
211
- // </div>
212
- const ulStr = `
213
- <div class="cherry-shortcut-key-config-panel-inner">
214
- <div class="shortcut-panel-settings">
215
- <btn class="shortcut-settings-btn j-shortcut-settings-disable-btn"><i class="ch-icon ch-icon-cherry-table-delete"></i> ${
216
- this.$cherry.locale.disableShortcut
217
- }</btn>
218
- <btn class="shortcut-settings-btn j-shortcut-settings-recover-btn"><i class="ch-icon ch-icon-undo"></i> ${
219
- this.$cherry.locale.recoverShortcut
220
- }</btn>
221
- </div>
222
- <div class="shortcut-panel-title">${this.$cherry.locale.editShortcutKeyConfigTip}</div>
223
- <ul class="${this.shortcutUlClassName}" id="${this.shortcutUlId}">${liStr}</ul>
224
- ${this.$getStaticShortcut()}
225
- </div>`;
226
- return ulStr;
227
- }
228
-
229
- /**
230
- * 定义不支持修改的快捷键信息(是codemirror提供的类sublime快捷键)
231
- */
232
- $getStaticShortcut() {
233
- if (this.$cherry.options.editor.keyMap === 'vim') {
234
- return '';
235
- }
236
- const list = [
237
- { name: this.$cherry.locale.shortcutStatic1, key: 'Ctrl+[' },
238
- { name: this.$cherry.locale.shortcutStatic2, key: 'Ctrl+]' },
239
- { name: this.$cherry.locale.shortcutStatic3, key: 'Ctrl+Shift+D' },
240
- { name: this.$cherry.locale.shortcutStatic4, key: 'Ctrl+Enter' },
241
- { name: this.$cherry.locale.shortcutStatic5, key: 'Ctrl+Shift+Enter' },
242
- { name: this.$cherry.locale.shortcutStatic6, key: 'Ctrl+Shift+↑' },
243
- { name: this.$cherry.locale.shortcutStatic7, key: 'Ctrl+Shift+↓' },
244
- { name: this.$cherry.locale.shortcutStatic8, key: 'Ctrl+Shift+K' },
245
- { name: this.$cherry.locale.shortcutStatic9, key: 'Ctrl+Shift+←' },
246
- { name: this.$cherry.locale.shortcutStatic10, key: 'Ctrl+Shift+→' },
247
- { name: this.$cherry.locale.shortcutStatic11, key: 'Ctrl+Backspace' },
248
- { name: this.$cherry.locale.shortcutStatic12, key: 'Ctrl+Shift+M' },
249
- { name: this.$cherry.locale.shortcutStatic13, key: `Ctrl+${this.$cherry.locale.leftMouseButton}` },
250
- { name: this.$cherry.locale.shortcutStatic14, key: 'Ctrl+Shift+L' },
251
- { name: this.$cherry.locale.shortcutStatic16, key: 'Alt+F3' },
252
- { name: this.$cherry.locale.shortcutStatic17, key: 'Ctrl+Z' },
253
- { name: this.$cherry.locale.shortcutStatic18, key: 'Ctrl+Y' },
254
- ];
255
- const li = [];
256
- for (let i = 0; i < list.length; i++) {
257
- const one = list[i];
258
- li.push(`
259
- <li class="cherry-dropdown-item shortcut-key-item">
260
- <div class="shortcut-key-config-panel-name">${one.name}</div>
261
- <div class="shortcut-key-config-panel-static">${one.key.replace(
262
- /\+/g,
263
- '<span class="shortcut-split">+</span>',
264
- )}
265
- </div>
266
- </li>
267
- `);
268
- }
269
- return `<div class="shortcut-static">
270
- <div class="shortcut-panel-title">${this.$cherry.locale.shortcutStaticTitle}</div>
271
- <ul class="cherry-shortcut-key-config-panel-ul">${li.join('')}</ul>
272
- </div>`;
273
- }
274
-
275
- /**
276
- * 显示快捷键配置面板
277
- */
278
- show() {
279
- this.dom.style.removeProperty('display');
280
- const ulWrapper = this.dom.querySelector(`#${this.shortcutUlId}`);
281
- if (ulWrapper instanceof HTMLUListElement) {
282
- // 监听双击
283
- ulWrapper.addEventListener('dblclick', this.handleDbClick);
284
- }
285
- const settingsDisableBtn = this.dom.querySelector('.j-shortcut-settings-disable-btn');
286
- if (settingsDisableBtn instanceof HTMLElement) {
287
- settingsDisableBtn.addEventListener('click', this.clickSettingsDisableBtn);
288
- }
289
- const settingsRecoverBtn = this.dom.querySelector('.j-shortcut-settings-recover-btn');
290
- if (settingsRecoverBtn instanceof HTMLElement) {
291
- settingsRecoverBtn.addEventListener('click', this.clickSettingsRecoverBtn);
292
- }
293
- }
294
-
295
- hide() {
296
- this.dom.style.display = 'none';
297
- const ulWrapper = this.dom.querySelector(`#${this.shortcutUlId}`);
298
- if (ulWrapper instanceof HTMLUListElement) {
299
- // 销毁时取消监听
300
- ulWrapper.removeEventListener('dblclick', this.handleDbClick);
301
- }
302
- const settingsDisableBtn = this.dom.querySelector('.j-shortcut-settings-disable-btn');
303
- if (settingsDisableBtn instanceof HTMLElement) {
304
- settingsDisableBtn.removeEventListener('click', this.clickSettingsDisableBtn);
305
- }
306
- const settingsRecoverBtn = this.dom.querySelector('.j-shortcut-settings-recover-btn');
307
- if (settingsRecoverBtn instanceof HTMLElement) {
308
- settingsRecoverBtn.removeEventListener('click', this.clickSettingsRecoverBtn);
309
- }
310
- }
311
-
312
- isShow() {
313
- return this.dom.style.display === 'block';
314
- }
315
-
316
- isHide() {
317
- return this.dom.style.display === 'none';
318
- }
319
-
320
- /**
321
- * 展示/隐藏快捷键配置面板
322
- * @param {HTMLElement} settingsDom
323
- */
324
- toggle(settingsDom) {
325
- if (!(settingsDom instanceof HTMLElement)) {
326
- throw new Error(`settingsDom must be an instance of HTMLElement, but got: ${settingsDom}`);
327
- }
328
- const pos = settingsDom.getBoundingClientRect();
329
- const cherryWrapPos = this.$cherry.wrapperDom.getBoundingClientRect();
330
- if (this.isHide()) {
331
- this.dom.style.left = `${pos.left - cherryWrapPos.left + pos.width / 2}px`;
332
- this.dom.style.top = `${pos.top - cherryWrapPos.top + pos.height}px`;
333
- this.show();
334
- const me = this.dom.getBoundingClientRect();
335
- this.dom.style.marginLeft = `0px`;
336
- this.dom.style.left = `${pos.left - cherryWrapPos.left + pos.width / 2 - me.width / 2}px`;
337
- // 如果弹窗位置超出屏幕,则自动调整位置
338
- if (me.left + me.width > window.innerWidth) {
339
- this.dom.style.left = `${window.innerWidth - me.width - 5}px`;
340
- }
341
- return;
342
- }
343
- return this.hide();
344
- }
345
- }
@@ -1,36 +0,0 @@
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 Toolbar from './Toolbar';
17
- /**
18
- * 预览区域右侧悬浮的工具栏
19
- * 推荐放置跟编辑区域完全无关的工具栏
20
- * 比如复制预览区域内容、修改预览区域主题等
21
- */
22
- export default class Sidebar extends Toolbar {
23
- // constructor(options) {
24
- // super(options);
25
- // }
26
- appendMenusToDom(menus) {
27
- this.options.dom.appendChild(menus);
28
- }
29
-
30
- init() {
31
- super.init();
32
- Object.entries(this.shortcutKeyMap).forEach(([key, value]) => {
33
- this.$cherry.toolbar.shortcutKeyMap[key] = value;
34
- });
35
- }
36
- }
@@ -1,242 +0,0 @@
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 { createElement } from '../utils/dom';
17
- /**
18
- * 悬浮目录
19
- */
20
- export default class Toc {
21
- constructor(options) {
22
- this.$cherry = options.$cherry;
23
- this.editor = options.$cherry.editor.editor;
24
- this.tocStr = '';
25
- this.updateLocationHash = options.updateLocationHash ?? true;
26
- this.defaultModel = options.defaultModel ?? 'full';
27
- this.showAutoNumber = options.showAutoNumber ?? false;
28
- this.position = options.position ?? 'absolute';
29
- this.cssText = options.cssText ?? '';
30
- this.init();
31
- }
32
-
33
- init() {
34
- this.drawDom();
35
- this.timer = setTimeout(() => {
36
- this.updateTocList();
37
- }, 300);
38
- this.editor.on('change', (codemirror, evt) => {
39
- clearTimeout(this.timer);
40
- this.timer = setTimeout(() => {
41
- this.updateTocList();
42
- this.$switchModel(this.model);
43
- }, 300);
44
- });
45
- this.$switchModel(this.getModelFromLocalStorage());
46
- }
47
-
48
- getModelFromLocalStorage() {
49
- if (typeof localStorage === 'undefined') {
50
- return this.defaultModel;
51
- }
52
- return localStorage.getItem('cherry-toc-model') || this.defaultModel;
53
- }
54
-
55
- setModelToLocalStorage(model) {
56
- if (typeof localStorage === 'undefined') {
57
- return;
58
- }
59
- localStorage.setItem('cherry-toc-model', model);
60
- }
61
-
62
- drawDom() {
63
- const tocDom = createElement(
64
- 'div',
65
- `cherry-flex-toc cherry-flex-toc__pure${this.showAutoNumber ? ' auto-num' : ''}`,
66
- );
67
- if (this.position === 'fixed') {
68
- tocDom.classList.add('cherry-flex-toc__fixed');
69
- }
70
-
71
- if (this.cssText.length > 0) {
72
- tocDom.style.cssText = this.cssText;
73
- }
74
-
75
- const tocHead = createElement('div', 'cherry-toc-head');
76
- const tocTitle = createElement('span', 'cherry-toc-title');
77
- tocTitle.append(this.$cherry.locale.toc);
78
- const tocClose = createElement('i', 'ch-icon ch-icon-chevronsRight');
79
- const tocOpen = createElement('i', 'ch-icon ch-icon-chevronsLeft');
80
- this.tocClose = tocClose;
81
- this.tocOpen = tocOpen;
82
- tocHead.appendChild(tocTitle);
83
- tocHead.appendChild(tocClose);
84
- tocHead.appendChild(tocOpen);
85
- tocDom.appendChild(tocHead);
86
- const tocListDom = createElement('div', 'cherry-toc-list');
87
- this.tocListDom = tocListDom;
88
- tocDom.appendChild(tocListDom);
89
- this.tocDom = tocDom;
90
- this.$cherry.wrapperDom.appendChild(tocDom);
91
- this.bindClickEvent();
92
- }
93
-
94
- bindClickEvent() {
95
- this.tocDom.addEventListener('click', (e) => {
96
- const a = this.$getClosestNode(e.target, 'A');
97
- if (a === false) {
98
- return;
99
- }
100
- if (/cherry-toc-one-a/.test(a.className)) {
101
- const { id, index } = a.dataset;
102
- if (this.$cherry.status.previewer === 'hide') {
103
- // editorOnly模式下,需要定位到编辑区对应位置
104
- const searcher = this.$cherry.editor.editor.getSearchCursor(
105
- /(?:^|\n)\n*((?:[ \t\u00a0]*#{1,6}).+?|(?:[ \t\u00a0]*.+)\n(?:[ \t\u00a0]*[=]+|[-]+))(?=$|\n)/g,
106
- );
107
- for (let i = 0; i <= index; i++) {
108
- searcher.findNext();
109
- }
110
- const target = searcher.from();
111
- this.$cherry.editor.scrollToLineNum(target.line, target.line + 1, 0);
112
- } else {
113
- // 有预览的情况下,直接通过滚动预览区位置实现滚动到锚点
114
- this.$cherry.previewer.scrollToHeadByIndex(index);
115
- }
116
- if (this.updateLocationHash) {
117
- location.href = id;
118
- }
119
- }
120
- });
121
- this.tocClose.addEventListener('click', (e) => {
122
- this.$switchModel('pure');
123
- this.setModelToLocalStorage('pure');
124
- });
125
- this.tocOpen.addEventListener('click', (e) => {
126
- this.$switchModel('full');
127
- this.setModelToLocalStorage('full');
128
- });
129
- if (window) {
130
- window.addEventListener('resize', () => {
131
- this.$switchModel(this.model);
132
- });
133
- }
134
- this.editor.on('scroll', (codemirror, evt) => {
135
- this.updateTocList(true);
136
- });
137
- const scrollDom = this.$cherry.previewer.getDomCanScroll();
138
- if (scrollDom.nodeName === 'HTML') {
139
- window.addEventListener('scroll', () => {
140
- this.updateTocList(true);
141
- });
142
- } else {
143
- scrollDom.addEventListener('scroll', () => {
144
- this.updateTocList(true);
145
- });
146
- }
147
- }
148
-
149
- $switchModel(model = 'pure') {
150
- this.model = model;
151
- const targetClassName = `cherry-flex-toc__${model}`;
152
- if (!this.tocDom.classList.contains(targetClassName)) {
153
- this.tocDom.classList.remove(`cherry-flex-toc__pure`);
154
- this.tocDom.classList.remove(`cherry-flex-toc__full`);
155
- this.tocDom.classList.add(targetClassName);
156
- }
157
- const list = this.tocListDom.querySelectorAll('.cherry-toc-one-a');
158
- if (list.length > 0) {
159
- let targetHeight = 28;
160
- if (model === 'pure') {
161
- const { height } = this.tocListDom.getBoundingClientRect();
162
- const minHeight = Math.floor((height - list.length * 3) / list.length);
163
- // eslint-disable-next-line no-nested-ternary
164
- targetHeight = minHeight < 3 ? 3 : minHeight > 10 ? 10 : minHeight;
165
- }
166
- for (let i = 0; i < list.length; i++) {
167
- // @ts-ignore
168
- if (list[i].style.height !== `${targetHeight}px`) {
169
- // @ts-ignore
170
- list[i].style.height = `${targetHeight}px`;
171
- }
172
- }
173
- }
174
- }
175
-
176
- $getClosestNode(node, targetNodeName) {
177
- if (!node || !node.tagName) {
178
- return false;
179
- }
180
- if (node.tagName === targetNodeName) {
181
- return node;
182
- }
183
- if (node.parentNode.tagName === 'BODY') {
184
- return false;
185
- }
186
- return this.$getClosestNode(node.parentNode, targetNodeName);
187
- }
188
-
189
- updateTocList(onlyScroll = false) {
190
- if (onlyScroll === true) {
191
- // do nothing
192
- } else {
193
- const tocList = this.$cherry.getToc();
194
- let tocStr = '';
195
- tocList.map((item) => {
196
- tocStr += item.text;
197
- return item;
198
- });
199
- tocStr = this.$cherry.engine.hash(tocStr);
200
- if (this.tocStr !== tocStr) {
201
- this.tocStr = tocStr;
202
- let tocHtml = '';
203
- let index = 0;
204
- tocList.map((item) => {
205
- const text = item.text.replace(/<a .+?<\/a>/g, '');
206
- const title = text.replace(/<[^>]+?>/g, '');
207
- tocHtml += `<a class="cherry-toc-one-a cherry-toc-one-a__${item.level > 5 ? 5 : item.level}"
208
- title="${title}"
209
- data-index="${index}"
210
- data-id="#${item.id}"
211
- >${text}</a>`;
212
- index += 1;
213
- return item;
214
- });
215
- this.tocListDom.innerHTML = tocHtml;
216
- }
217
- }
218
- // 处理当前标题的高亮
219
- if (this.$cherry.status.previewer === 'hide') {
220
- // 似乎没有特别好的办法,先欠着
221
- } else {
222
- const scrollDom = this.$cherry.previewer.getDomCanScroll();
223
- const minY = scrollDom.nodeName === 'HTML' ? 0 : scrollDom.getBoundingClientRect().y;
224
- const headList = this.$cherry.previewer.getDomContainer().querySelectorAll('h1,h2,h3,h4,h5,h6,h7,h8');
225
- let index = 0;
226
- for (; index < headList.length; index++) {
227
- const { y } = headList[index].getBoundingClientRect();
228
- if (y > minY + 20) {
229
- break;
230
- }
231
- }
232
- index = index > 0 ? index - 1 : index;
233
- this.tocListDom.querySelectorAll('.cherry-toc-one-a').forEach((item, key) => {
234
- if (key === index) {
235
- item.classList.add('current');
236
- } else {
237
- item.classList.remove('current');
238
- }
239
- });
240
- }
241
- }
242
- }