@cherry-markdown/cherry-markdown-dev 0.8.58-dev

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 (319) hide show
  1. package/package.json +149 -0
  2. package/src/Cherry.config.js +625 -0
  3. package/src/Cherry.js +1104 -0
  4. package/src/CherryStatic.js +70 -0
  5. package/src/Editor.js +748 -0
  6. package/src/Engine.js +381 -0
  7. package/src/Event.js +140 -0
  8. package/src/Factory.js +180 -0
  9. package/src/Logger.js +31 -0
  10. package/src/Previewer.js +1183 -0
  11. package/src/Sanitizer.js +4 -0
  12. package/src/Sanitizer.node.js +7 -0
  13. package/src/UrlCache.js +98 -0
  14. package/src/addons/advance/cherry-table-echarts-plugin.js +170 -0
  15. package/src/addons/cherry-code-block-mermaid-plugin.js +158 -0
  16. package/src/addons/cherry-code-block-plantuml-plugin.js +106 -0
  17. package/src/core/HookCenter.js +297 -0
  18. package/src/core/HooksConfig.js +100 -0
  19. package/src/core/ParagraphBase.js +332 -0
  20. package/src/core/SentenceBase.js +65 -0
  21. package/src/core/SyntaxBase.js +194 -0
  22. package/src/core/hooks/AutoLink.js +232 -0
  23. package/src/core/hooks/BackgroundColor.js +46 -0
  24. package/src/core/hooks/Blockquote.js +70 -0
  25. package/src/core/hooks/Br.js +85 -0
  26. package/src/core/hooks/CodeBlock.js +446 -0
  27. package/src/core/hooks/Color.js +46 -0
  28. package/src/core/hooks/CommentReference.js +96 -0
  29. package/src/core/hooks/Detail.js +108 -0
  30. package/src/core/hooks/Emoji.config.js +1825 -0
  31. package/src/core/hooks/Emoji.js +119 -0
  32. package/src/core/hooks/Emphasis.js +113 -0
  33. package/src/core/hooks/Footnote.js +125 -0
  34. package/src/core/hooks/FrontMatter.js +51 -0
  35. package/src/core/hooks/Header.js +234 -0
  36. package/src/core/hooks/HighLight.js +37 -0
  37. package/src/core/hooks/Hr.js +52 -0
  38. package/src/core/hooks/HtmlBlock.js +184 -0
  39. package/src/core/hooks/Image.js +174 -0
  40. package/src/core/hooks/InlineCode.js +48 -0
  41. package/src/core/hooks/InlineMath.js +107 -0
  42. package/src/core/hooks/Link.js +160 -0
  43. package/src/core/hooks/List.js +264 -0
  44. package/src/core/hooks/MathBlock.js +103 -0
  45. package/src/core/hooks/Panel.js +145 -0
  46. package/src/core/hooks/Paragraph.js +84 -0
  47. package/src/core/hooks/Ruby.js +34 -0
  48. package/src/core/hooks/Size.js +51 -0
  49. package/src/core/hooks/Strikethrough.js +54 -0
  50. package/src/core/hooks/Sub.js +47 -0
  51. package/src/core/hooks/SuggestList.js +333 -0
  52. package/src/core/hooks/Suggester.js +707 -0
  53. package/src/core/hooks/Sup.js +47 -0
  54. package/src/core/hooks/Table.js +275 -0
  55. package/src/core/hooks/Toc.js +292 -0
  56. package/src/core/hooks/Transfer.js +47 -0
  57. package/src/core/hooks/Underline.js +37 -0
  58. package/src/index.core.js +29 -0
  59. package/src/index.engine.core.js +68 -0
  60. package/src/index.engine.js +28 -0
  61. package/src/index.js +32 -0
  62. package/src/libs/mermaidAPI.8.4.8.js +1 -0
  63. package/src/libs/mermaidAPI.8.5.2.js +42 -0
  64. package/src/libs/rawdeflate.js +1663 -0
  65. package/src/locales/en_US.js +139 -0
  66. package/src/locales/index.js +25 -0
  67. package/src/locales/ru_RU.js +139 -0
  68. package/src/locales/zh_CN.js +142 -0
  69. package/src/sass/base.scss +26 -0
  70. package/src/sass/bubble_formula.scss +166 -0
  71. package/src/sass/ch-icon.scss +118 -0
  72. package/src/sass/cherry.scss +1116 -0
  73. package/src/sass/components/bubble.scss +173 -0
  74. package/src/sass/components/shortcut_key_config.scss +108 -0
  75. package/src/sass/formula_utils_bubble.scss +82 -0
  76. package/src/sass/icon_template.scss +24 -0
  77. package/src/sass/icons/uEA03-list.svg +19 -0
  78. package/src/sass/icons/uEA04-check.svg +14 -0
  79. package/src/sass/icons/uEA09-square.svg +10 -0
  80. package/src/sass/icons/uEA0A-bold.svg +20 -0
  81. package/src/sass/icons/uEA0B-code.svg +18 -0
  82. package/src/sass/icons/uEA0C-color.svg +13 -0
  83. package/src/sass/icons/uEA0D-header.svg +8 -0
  84. package/src/sass/icons/uEA0E-image.svg +15 -0
  85. package/src/sass/icons/uEA0F-italic.svg +8 -0
  86. package/src/sass/icons/uEA10-link.svg +16 -0
  87. package/src/sass/icons/uEA11-ol.svg +21 -0
  88. package/src/sass/icons/uEA12-size.svg +11 -0
  89. package/src/sass/icons/uEA13-strike.svg +16 -0
  90. package/src/sass/icons/uEA14-table.svg +12 -0
  91. package/src/sass/icons/uEA15-ul.svg +17 -0
  92. package/src/sass/icons/uEA16-underline.svg +13 -0
  93. package/src/sass/icons/uEA17-word.svg +16 -0
  94. package/src/sass/icons/uEA18-blockquote.svg +11 -0
  95. package/src/sass/icons/uEA19-font.svg +10 -0
  96. package/src/sass/icons/uEA1F-insertClass.svg +39 -0
  97. package/src/sass/icons/uEA20-insertFlow.svg +8 -0
  98. package/src/sass/icons/uEA21-insertFormula.svg +23 -0
  99. package/src/sass/icons/uEA22-insertGantt.svg +13 -0
  100. package/src/sass/icons/uEA23-insertGraph.svg +13 -0
  101. package/src/sass/icons/uEA24-insertPie.svg +19 -0
  102. package/src/sass/icons/uEA25-insertSeq.svg +20 -0
  103. package/src/sass/icons/uEA26-insertState.svg +35 -0
  104. package/src/sass/icons/uEA27-line.svg +11 -0
  105. package/src/sass/icons/uEA28-preview.svg +18 -0
  106. package/src/sass/icons/uEA29-previewClose.svg +24 -0
  107. package/src/sass/icons/uEA2A-toc.svg +24 -0
  108. package/src/sass/icons/uEA2D-sub.svg +15 -0
  109. package/src/sass/icons/uEA2E-sup.svg +15 -0
  110. package/src/sass/icons/uEA2F-h1.svg +16 -0
  111. package/src/sass/icons/uEA30-h2.svg +20 -0
  112. package/src/sass/icons/uEA31-h3.svg +23 -0
  113. package/src/sass/icons/uEA32-h4.svg +16 -0
  114. package/src/sass/icons/uEA33-h5.svg +20 -0
  115. package/src/sass/icons/uEA34-h6.svg +17 -0
  116. package/src/sass/icons/uEA35-video.svg +20 -0
  117. package/src/sass/icons/uEA36-insert.svg +25 -0
  118. package/src/sass/icons/uEA37-little_table.svg +30 -0
  119. package/src/sass/icons/uEA38-pdf.svg +27 -0
  120. package/src/sass/icons/uEA39-checklist.svg +22 -0
  121. package/src/sass/icons/uEA40-close.svg +12 -0
  122. package/src/sass/icons/uEA41-fullscreen.svg +81 -0
  123. package/src/sass/icons/uEA42-minscreen.svg +77 -0
  124. package/src/sass/icons/uEA43-insertChart.svg +23 -0
  125. package/src/sass/icons/uEA44-question.svg +25 -0
  126. package/src/sass/icons/uEA45-settings.svg +32 -0
  127. package/src/sass/icons/uEA46-ok.svg +7 -0
  128. package/src/sass/icons/uEA47-br.svg +22 -0
  129. package/src/sass/icons/uEA48-normal.svg +15 -0
  130. package/src/sass/icons/uEA49-undo.svg +19 -0
  131. package/src/sass/icons/uEA50-redo.svg +21 -0
  132. package/src/sass/icons/uEA51-copy.svg +6 -0
  133. package/src/sass/icons/uEA52-phone.svg +5 -0
  134. package/src/sass/icons/uEA53-cherry-table-delete.svg +17 -0
  135. package/src/sass/icons/uEA54-cherry-table-insert-bottom.svg +16 -0
  136. package/src/sass/icons/uEA55-cherry-table-insert-left.svg +15 -0
  137. package/src/sass/icons/uEA56-cherry-table-insert-right.svg +16 -0
  138. package/src/sass/icons/uEA57-cherry-table-insert-top.svg +16 -0
  139. package/src/sass/icons/uEA58-sort-s.svg +13 -0
  140. package/src/sass/icons/uEA59-pinyin.svg +1 -0
  141. package/src/sass/icons/uEA5A-create.svg +24 -0
  142. package/src/sass/icons/uEA5B-download.svg +34 -0
  143. package/src/sass/icons/uEA5C-edit.svg +3 -0
  144. package/src/sass/icons/uEA5D-export.svg +53 -0
  145. package/src/sass/icons/uEA5E-folder-open.svg +3 -0
  146. package/src/sass/icons/uEA5F-folder.svg +3 -0
  147. package/src/sass/icons/uEA60-help.svg +5 -0
  148. package/src/sass/icons/uEA61-pen-fill.svg +13 -0
  149. package/src/sass/icons/uEA62-pen.svg +3 -0
  150. package/src/sass/icons/uEA64-tips.svg +5 -0
  151. package/src/sass/icons/uEA65-warn.svg +5 -0
  152. package/src/sass/icons/uEA66-mistake.svg +4 -0
  153. package/src/sass/icons/uEA67-success.svg +4 -0
  154. package/src/sass/icons/uEA68-danger.svg +4 -0
  155. package/src/sass/icons/uEA69-info.svg +5 -0
  156. package/src/sass/icons/uEA6A-primary.svg +5 -0
  157. package/src/sass/icons/uEA6B-warning.svg +5 -0
  158. package/src/sass/icons/uEA6C-justify.svg +19 -0
  159. package/src/sass/icons/uEA6D-justifyCenter.svg +19 -0
  160. package/src/sass/icons/uEA6E-justifyLeft.svg +19 -0
  161. package/src/sass/icons/uEA6F-justifyRight.svg +19 -0
  162. package/src/sass/icons/uEA70-chevronsLeft.svg +1 -0
  163. package/src/sass/icons/uEA71-chevronsRight.svg +1 -0
  164. package/src/sass/icons/uEA72-trendingUp.svg +1 -0
  165. package/src/sass/icons/uEA74-codeBlock.svg +1 -0
  166. package/src/sass/icons/uEA75-expand.svg +3 -0
  167. package/src/sass/icons/uEA76-unExpand.svg +3 -0
  168. package/src/sass/icons/uEA77-swap-vert.svg +1 -0
  169. package/src/sass/icons/uEA78-swap.svg +1 -0
  170. package/src/sass/icons/uEA79-keyboard.svg +1 -0
  171. package/src/sass/icons/uEA7A-command.svg +1 -0
  172. package/src/sass/icons/uEA7B-search.svg +1 -0
  173. package/src/sass/index.scss +3 -0
  174. package/src/sass/markdown.scss +668 -0
  175. package/src/sass/markdown_pure.scss +9 -0
  176. package/src/sass/prettyprint/prettyprint.scss +118 -0
  177. package/src/sass/previewer.scss +179 -0
  178. package/src/sass/print.scss +13 -0
  179. package/src/sass/prism/coy.scss +220 -0
  180. package/src/sass/prism/dark.scss +132 -0
  181. package/src/sass/prism/default.scss +143 -0
  182. package/src/sass/prism/funky.scss +133 -0
  183. package/src/sass/prism/okaidia.scss +126 -0
  184. package/src/sass/prism/one-dark.scss +440 -0
  185. package/src/sass/prism/one-light.scss +428 -0
  186. package/src/sass/prism/solarized-light.scss +153 -0
  187. package/src/sass/prism/tomorrow-night.scss +125 -0
  188. package/src/sass/prism/twilight.scss +202 -0
  189. package/src/sass/prism/vs-dark.scss +275 -0
  190. package/src/sass/prism/vs-light.scss +168 -0
  191. package/src/sass/themes/blue.scss +411 -0
  192. package/src/sass/themes/dark.scss +517 -0
  193. package/src/sass/themes/default.scss +255 -0
  194. package/src/sass/themes/green.scss +395 -0
  195. package/src/sass/themes/light.scss +368 -0
  196. package/src/sass/themes/red.scss +397 -0
  197. package/src/sass/themes/violet.scss +410 -0
  198. package/src/sass/variable.scss +84 -0
  199. package/src/toolbars/Bubble.js +234 -0
  200. package/src/toolbars/BubbleFormula.js +298 -0
  201. package/src/toolbars/BubbleTable.js +147 -0
  202. package/src/toolbars/FloatMenu.js +131 -0
  203. package/src/toolbars/HiddenToolbar.js +36 -0
  204. package/src/toolbars/HookCenter.js +234 -0
  205. package/src/toolbars/MenuBase.js +569 -0
  206. package/src/toolbars/PreviewerBubble.js +608 -0
  207. package/src/toolbars/ShortcutKeyConfigPanel.js +345 -0
  208. package/src/toolbars/Sidebar.js +36 -0
  209. package/src/toolbars/Toc.js +242 -0
  210. package/src/toolbars/Toolbar.js +449 -0
  211. package/src/toolbars/ToolbarRight.js +37 -0
  212. package/src/toolbars/hooks/Audio.js +79 -0
  213. package/src/toolbars/hooks/BarTable.js +41 -0
  214. package/src/toolbars/hooks/Bold.js +73 -0
  215. package/src/toolbars/hooks/Br.js +34 -0
  216. package/src/toolbars/hooks/ChangeLocale.js +62 -0
  217. package/src/toolbars/hooks/ChatGpt.js +182 -0
  218. package/src/toolbars/hooks/CheckList.js +41 -0
  219. package/src/toolbars/hooks/Code.js +49 -0
  220. package/src/toolbars/hooks/CodeTheme.js +66 -0
  221. package/src/toolbars/hooks/Color.js +298 -0
  222. package/src/toolbars/hooks/Copy.js +141 -0
  223. package/src/toolbars/hooks/Detail.js +69 -0
  224. package/src/toolbars/hooks/DrawIo.js +57 -0
  225. package/src/toolbars/hooks/Export.js +49 -0
  226. package/src/toolbars/hooks/File.js +79 -0
  227. package/src/toolbars/hooks/Formula.js +69 -0
  228. package/src/toolbars/hooks/FullScreen.js +50 -0
  229. package/src/toolbars/hooks/Graph.js +263 -0
  230. package/src/toolbars/hooks/H1.js +71 -0
  231. package/src/toolbars/hooks/H2.js +71 -0
  232. package/src/toolbars/hooks/H3.js +71 -0
  233. package/src/toolbars/hooks/Header.js +118 -0
  234. package/src/toolbars/hooks/Hr.js +35 -0
  235. package/src/toolbars/hooks/Image.js +91 -0
  236. package/src/toolbars/hooks/InlineCode.js +53 -0
  237. package/src/toolbars/hooks/Insert.js +193 -0
  238. package/src/toolbars/hooks/Italic.js +72 -0
  239. package/src/toolbars/hooks/Justify.js +49 -0
  240. package/src/toolbars/hooks/LineTable.js +41 -0
  241. package/src/toolbars/hooks/Link.js +49 -0
  242. package/src/toolbars/hooks/List.js +55 -0
  243. package/src/toolbars/hooks/MobilePreview.js +44 -0
  244. package/src/toolbars/hooks/Ol.js +41 -0
  245. package/src/toolbars/hooks/Panel.js +140 -0
  246. package/src/toolbars/hooks/Pdf.js +78 -0
  247. package/src/toolbars/hooks/Publish.js +123 -0
  248. package/src/toolbars/hooks/QuickTable.js +43 -0
  249. package/src/toolbars/hooks/Quote.js +45 -0
  250. package/src/toolbars/hooks/Redo.js +33 -0
  251. package/src/toolbars/hooks/Ruby.js +59 -0
  252. package/src/toolbars/hooks/Search.js +53 -0
  253. package/src/toolbars/hooks/Settings.js +220 -0
  254. package/src/toolbars/hooks/ShortcutKey.js +62 -0
  255. package/src/toolbars/hooks/Size.js +118 -0
  256. package/src/toolbars/hooks/Split.js +37 -0
  257. package/src/toolbars/hooks/Strikethrough.js +71 -0
  258. package/src/toolbars/hooks/Sub.js +58 -0
  259. package/src/toolbars/hooks/Sup.js +58 -0
  260. package/src/toolbars/hooks/SwitchModel.js +56 -0
  261. package/src/toolbars/hooks/Table.js +56 -0
  262. package/src/toolbars/hooks/Theme.js +62 -0
  263. package/src/toolbars/hooks/Toc.js +35 -0
  264. package/src/toolbars/hooks/TogglePreview.js +91 -0
  265. package/src/toolbars/hooks/Ul.js +41 -0
  266. package/src/toolbars/hooks/Underline.js +68 -0
  267. package/src/toolbars/hooks/Undo.js +30 -0
  268. package/src/toolbars/hooks/Video.js +79 -0
  269. package/src/toolbars/hooks/Word.js +78 -0
  270. package/src/toolbars/hooks/WordCount.js +106 -0
  271. package/src/utils/autoindent.js +58 -0
  272. package/src/utils/cm-search-replace.js +794 -0
  273. package/src/utils/code-preview-language-setting.js +180 -0
  274. package/src/utils/codeBlockContentHandler.js +400 -0
  275. package/src/utils/config.js +174 -0
  276. package/src/utils/copy.js +55 -0
  277. package/src/utils/dialog.js +214 -0
  278. package/src/utils/dom.js +163 -0
  279. package/src/utils/downloadUtil.js +23 -0
  280. package/src/utils/env.js +22 -0
  281. package/src/utils/error.js +61 -0
  282. package/src/utils/event.js +38 -0
  283. package/src/utils/export.js +166 -0
  284. package/src/utils/file.js +164 -0
  285. package/src/utils/formulaUtilsHandler.js +232 -0
  286. package/src/utils/htmlparser.js +976 -0
  287. package/src/utils/image.js +99 -0
  288. package/src/utils/imgSizeHandler.js +279 -0
  289. package/src/utils/lazyLoadImg.js +327 -0
  290. package/src/utils/lineFeed.js +49 -0
  291. package/src/utils/listContentHandler.js +227 -0
  292. package/src/utils/lookbehind-replace.js +81 -0
  293. package/src/utils/mathjax.js +89 -0
  294. package/src/utils/myersDiff.js +211 -0
  295. package/src/utils/pasteHelper.js +253 -0
  296. package/src/utils/platformTransform.js +71 -0
  297. package/src/utils/recount-pos.js +59 -0
  298. package/src/utils/regexp.js +295 -0
  299. package/src/utils/sanitize.js +477 -0
  300. package/src/utils/selection.js +50 -0
  301. package/src/utils/shortcutKey.js +291 -0
  302. package/src/utils/svgUtils.js +96 -0
  303. package/src/utils/tableContentHandler.js +876 -0
  304. package/test/core/CommonMark.spec.ts +62 -0
  305. package/test/core/hooks/AutoLink.spec.ts +28 -0
  306. package/test/core/hooks/List.spec.ts +79 -0
  307. package/test/core/hooks/__snapshots__/List.spec.ts.snap +11 -0
  308. package/test/example.md +778 -0
  309. package/test/node.js +10 -0
  310. package/test/suites/commonmark.spec.json +5218 -0
  311. package/test/tsconfig.test.json +6 -0
  312. package/test/utils/regexp.spec.ts +28 -0
  313. package/types/cherry.d.ts +675 -0
  314. package/types/codemirror.d.ts +22 -0
  315. package/types/editor.d.ts +72 -0
  316. package/types/global.d.ts +16 -0
  317. package/types/menus.d.ts +24 -0
  318. package/types/previewer.d.ts +53 -0
  319. package/types/syntax.d.ts +52 -0
@@ -0,0 +1,291 @@
1
+ import { mac } from 'codemirror/src/util/browser';
2
+
3
+ export const SHIFT_KEY = 'Shift';
4
+ export const ALT_KEY = 'Alt';
5
+ // mac的command(meta)键,windows的ctrl键
6
+ export const CONTROL_KEY = mac ? 'Meta' : 'Control';
7
+ export const META_KEY = 'Meta';
8
+ export const ENTER_KEY = 'Enter';
9
+ export const ESCAPE_KEY = 'Escape';
10
+ export const BACKSPACE_KEY = 'Backspace';
11
+
12
+ export const shortKey2UnPlatformKey = {
13
+ [SHIFT_KEY]: (/** @type {boolean} */ isMac) => {
14
+ if (isMac) {
15
+ return {
16
+ text: '⇧',
17
+ tip: 'Shift',
18
+ };
19
+ }
20
+ return {
21
+ text: '⇧',
22
+ tip: 'Shift',
23
+ };
24
+ },
25
+ [CONTROL_KEY]: (/** @type {boolean} */ isMac) => {
26
+ if (isMac) {
27
+ return {
28
+ text: '⌃',
29
+ tip: 'Control',
30
+ };
31
+ }
32
+ return {
33
+ text: 'Ctrl',
34
+ tip: 'Control',
35
+ };
36
+ },
37
+ [ALT_KEY]: (/** @type {boolean} */ isMac) => {
38
+ if (isMac) {
39
+ return {
40
+ text: '⌥',
41
+ tip: 'Option',
42
+ };
43
+ }
44
+ return {
45
+ text: 'Alt',
46
+ tip: 'Alt',
47
+ };
48
+ },
49
+ [META_KEY]: (/** @type {boolean} */ isMac) => {
50
+ if (isMac) {
51
+ return {
52
+ text: '⌘',
53
+ tip: 'Command',
54
+ };
55
+ }
56
+ return {
57
+ text: '⊞',
58
+ tip: 'Windows',
59
+ };
60
+ },
61
+ };
62
+
63
+ /**
64
+ * 编辑属性的快捷键
65
+ * @type {string[]}
66
+ * @see https://developer.mozilla.org/zh-CN/docs/Web/API/UI_Events/Keyboard_event_key_values#editing_keys
67
+ */
68
+ const editingKeys = [
69
+ 'Backspace',
70
+ 'Clear',
71
+ 'Copy',
72
+ 'CrSel',
73
+ 'Cut',
74
+ 'Delete',
75
+ 'EraseEof',
76
+ 'ExSel',
77
+ 'Insert',
78
+ 'Paste',
79
+ 'Redo',
80
+ 'Undo',
81
+ ];
82
+
83
+ /**
84
+ * 导航快捷键
85
+ * @type {string[]}
86
+ * @see https://developer.mozilla.org/zh-CN/docs/Web/API/UI_Events/Keyboard_event_key_values#navigation_keys
87
+ */
88
+ const navigationKeys = ['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'End', 'Home', 'PageDown', 'PageUp'];
89
+
90
+ /**
91
+ * whitespace_keys
92
+ * @type {string[]}
93
+ * @see https://developer.mozilla.org/zh-CN/docs/Web/API/UI_Events/Keyboard_event_key_values#whitespace_keys
94
+ */
95
+ const whiteSpaceKeys = [' ', 'Tab', 'Enter'];
96
+
97
+ /**
98
+ * 默认禁止的快捷键,主要是一些会对编辑器造成影响的快捷键
99
+ * @type {string[]}
100
+ */
101
+ const defaultForbiddenKeys = [...editingKeys, ...navigationKeys, ...whiteSpaceKeys];
102
+
103
+ /**
104
+ * 获取合法的快捷键
105
+ * @param {KeyboardEvent} event 键盘事件
106
+ * @param {string[]} customForbiddenKeys 自定义的禁止的快捷键
107
+ */
108
+ export const getAllowedShortcutKey = (event, customForbiddenKeys = []) => {
109
+ const finalForbiddenKeys = [...defaultForbiddenKeys, ...customForbiddenKeys];
110
+ /** @type {string[]} */
111
+ const keyStack = [];
112
+ const isSpecialKey = event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;
113
+ /**
114
+ * 这里用 key 是因为 code 带有布局特征
115
+ */
116
+ if (finalForbiddenKeys.includes(event.key)) {
117
+ return keyStack;
118
+ }
119
+ /**
120
+ * 这个逻辑体内就规定了特殊按键的顺序:Meta > Control > Alt > Shift,从而保证了快捷键的顺序而不会重复
121
+ * 也就是说这四个特殊键无论怎么按下,都会按照这个顺序排列
122
+ */
123
+ if (isSpecialKey) {
124
+ if (event.metaKey) {
125
+ keyStack.push(META_KEY);
126
+ }
127
+ if (event.ctrlKey) {
128
+ keyStack.push(CONTROL_KEY);
129
+ }
130
+ if (event.altKey) {
131
+ keyStack.push(ALT_KEY);
132
+ }
133
+ if (event.shiftKey) {
134
+ keyStack.push(SHIFT_KEY);
135
+ }
136
+ }
137
+ // 这里排除掉上面 isSpecialKey 的键,追加其他键
138
+ if (!keyStack.includes(event.key)) {
139
+ /**
140
+ * 这里用 code 的原因在于要抹平不同浏览器对键值的不同处理,以及按下Shift键时key的表示不同
141
+ * shfit、alt 等调节性键,在按下时,key的值会不同,但code的值是相同的
142
+ * @see https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/code
143
+ */
144
+ // 当前键是否是重复按下的
145
+ if (event.repeat) {
146
+ keyStack.push(event.code);
147
+ return keyStack;
148
+ }
149
+ keyStack.push(event.code);
150
+ }
151
+ return keyStack;
152
+ };
153
+
154
+ /**
155
+ * 判断一个快捷键栈是否只包含了修饰键+输入键
156
+ * @param {string[]} keyStack 快捷键栈
157
+ */
158
+ export const keyStackIsModifierkeys = (keyStack) => {
159
+ // 不是数组或长度不为2的肯定不是,(shift/alt)+input
160
+ if (!Array.isArray(keyStack) || keyStack.length !== 2) {
161
+ return false;
162
+ }
163
+ const includeShiftKey = keyStack.includes(SHIFT_KEY);
164
+ const includeAltKey = keyStack.includes(ALT_KEY);
165
+ // 只包含 Shift 和 Alt 的肯定不是
166
+ if (includeShiftKey && includeAltKey && keyStack.length === 2) {
167
+ return false;
168
+ }
169
+ return (includeShiftKey || includeAltKey) && !keyStack.includes(META_KEY) && !keyStack.includes(CONTROL_KEY);
170
+ };
171
+
172
+ export const setDisableShortcutKey = (nameSpace, value = 'disable') => {
173
+ window.localStorage.setItem(`${nameSpace}-disable-cherry-shortcut-key`, value);
174
+ };
175
+
176
+ export const isEnableShortcutKey = (nameSpace) => {
177
+ const disableShortcutKeyStorage = window.localStorage.getItem(`${nameSpace}-disable-cherry-shortcut-key`);
178
+ if (disableShortcutKeyStorage === 'disable') {
179
+ return false;
180
+ }
181
+ return true;
182
+ };
183
+
184
+ /**
185
+ * 缓存快捷键映射
186
+ * @param {string} nameSpace cherry 的缓存命名空间
187
+ * @param {import('@/toolbars/MenuBase').HookShortcutKeyMap} keyMap 快捷键映射
188
+ * @returns
189
+ */
190
+ export const storageKeyMap = (nameSpace, keyMap) => {
191
+ if (!keyMap || typeof keyMap !== 'object') {
192
+ throw new Error('keyMap must be a object');
193
+ }
194
+ return window.localStorage.setItem(`${nameSpace}-cherry-shortcut-keymap`, JSON.stringify(keyMap));
195
+ };
196
+
197
+ /**
198
+ * 获取缓存快捷键映射
199
+ * @param {string} nameSpace cherry 的缓存命名空间
200
+ * @returns
201
+ */
202
+ export const getStorageKeyMap = (nameSpace) => {
203
+ const shortcutKeyMapStorage = window.localStorage.getItem(`${nameSpace}-cherry-shortcut-keymap`);
204
+ if (shortcutKeyMapStorage) {
205
+ try {
206
+ /** @type {import('@/toolbars/MenuBase').HookShortcutKeyMap} */
207
+ const res = JSON.parse(shortcutKeyMapStorage);
208
+ return res;
209
+ } catch (error) {
210
+ console.error(error);
211
+ return null;
212
+ }
213
+ }
214
+ return null;
215
+ };
216
+
217
+ /**
218
+ * 将快捷键栈转换为唯一字符串
219
+ * @param {string[]} keyStack 快捷键栈
220
+ * @returns
221
+ */
222
+ export const keyStack2UniqueString = (keyStack) => {
223
+ if (!Array.isArray(keyStack)) {
224
+ throw new Error('keyStack must be a array');
225
+ }
226
+ return keyStack.join('-');
227
+ };
228
+
229
+ /**
230
+ * 将快捷键代码转换为平台对应的快捷键
231
+ * @param {string} code 源code
232
+ * @param {boolean} isMac 是否是mac平台
233
+ */
234
+ export const shortcutCode2Key = (code, isMac) => {
235
+ if (code in shortKey2UnPlatformKey) {
236
+ /** @type {keyof shortKey2UnPlatformKey} */
237
+ // @ts-ignore
238
+ const origin = code;
239
+ const func = shortKey2UnPlatformKey[origin];
240
+ if (typeof func === 'function') {
241
+ return func(isMac);
242
+ }
243
+ }
244
+ // 由于code包含了Key、Digit等,所以需要替换掉
245
+ const text = code.replace(/Key|Digit/g, '');
246
+ return {
247
+ text,
248
+ tip: text,
249
+ };
250
+ };
251
+
252
+ /**
253
+ * 将快捷键栈转换为平台无关的唯一字符串
254
+ * @param {string[]} keyStack 快捷键栈
255
+ * @param {boolean} isMac 是否是mac平台
256
+ * @returns
257
+ */
258
+ export const keyStack2UnPlatformUniqueString = (keyStack, isMac) => {
259
+ if (!Array.isArray(keyStack)) {
260
+ throw new Error('keyStack must be a array');
261
+ }
262
+ return keyStack2UniqueString(keyStack.map((code) => shortcutCode2Key(code, isMac).text));
263
+ };
264
+
265
+ /**
266
+ * 获取快捷键
267
+ * @param {string|number} key 易读的键
268
+ * @example [0-9, a-z]
269
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values
270
+ */
271
+ export const getKeyCode = (key) => {
272
+ if (typeof key === 'number') {
273
+ return `Digit${key}`;
274
+ }
275
+ if (typeof key !== 'string') {
276
+ throw new Error('key must be a string or number');
277
+ }
278
+ // 一次只能输入一个字符
279
+ if (key.length > 1) {
280
+ throw new Error(`key length must be 1, but get ${key.length}`);
281
+ }
282
+ const upperCaseKey = key.toUpperCase();
283
+ // 字符串数字
284
+ if (/\d/.test(upperCaseKey)) {
285
+ return `Digit${upperCaseKey}`;
286
+ }
287
+ // 字符串字母
288
+ if (/[A-Z]/.test(upperCaseKey)) {
289
+ return `Key${upperCaseKey}`;
290
+ }
291
+ };
@@ -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
+
17
+ import { downloadByATag } from './downloadUtil';
18
+ /**
19
+ * @typedef {Object} Svg2ImgOptions
20
+ * @property {string=} filename 文件名
21
+ * @property {number=} width 宽度
22
+ * @property {number=} height 高度
23
+ * @property {number=} scale 缩放比例
24
+ * @property {number=} quality 图片质量
25
+ * @property {string=} backgroundColor 背景颜色
26
+ * @property {"svg" | "png" | "jpg"=} format 图片格式
27
+ * @property {string=} encoderOptions 编码器选项
28
+ * @property {string=} mimeType mime类型
29
+ * @property {string=} type 类型
30
+ * @property {string=} crossOrigin 跨域
31
+ */
32
+ /**
33
+ * svg转img
34
+ * @param {SVGSVGElement} svgElement
35
+ * @param {Svg2ImgOptions} options
36
+ */
37
+ export function svg2img(svgElement, options = {}) {
38
+ if (options.format === 'svg') {
39
+ downloadSvg(svgElement, options.filename ?? 'formula.svg');
40
+ return;
41
+ }
42
+ const {
43
+ width = svgElement.width.baseVal.value,
44
+ height = svgElement.height.baseVal.value,
45
+ scale = 5,
46
+ quality = 1,
47
+ backgroundColor = 'white',
48
+ filename = 'formula',
49
+ format = 'png',
50
+ mimeType = 'image/png',
51
+ } = options;
52
+ const svgString = getSvgString(svgElement);
53
+ // 创建一个新的 Canvas 元素
54
+ const canvas = document.createElement('canvas');
55
+ const ctx = canvas.getContext('2d');
56
+ const img = new Image();
57
+ img.src = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgString)))}`;
58
+ img.onload = () => {
59
+ canvas.width = width * scale;
60
+ canvas.height = height * scale;
61
+ ctx.fillStyle = backgroundColor;
62
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
63
+ ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
64
+ canvas.toBlob(
65
+ (blob) => {
66
+ const url = URL.createObjectURL(blob);
67
+ downloadByATag(url, `${filename}.${format}`);
68
+ URL.revokeObjectURL(url);
69
+ },
70
+ mimeType,
71
+ quality,
72
+ );
73
+ };
74
+ }
75
+
76
+ /**
77
+ * 获取带xmlns的svg字符串
78
+ * @param {SVGSVGElement} svgElement svg元素
79
+ * @returns {string}
80
+ */
81
+ export function getSvgString(svgElement) {
82
+ return new XMLSerializer().serializeToString(svgElement);
83
+ }
84
+
85
+ /**
86
+ * 下载svg
87
+ * @param {SVGSVGElement} svgElement svg元素
88
+ * @param {string} filename 文件名
89
+ */
90
+ export function downloadSvg(svgElement, filename) {
91
+ const svgString = getSvgString(svgElement);
92
+ const blob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' });
93
+ const url = URL.createObjectURL(blob);
94
+ downloadByATag(url, filename);
95
+ URL.revokeObjectURL(url);
96
+ }