@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,49 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ import { CONTROL_KEY, getKeyCode } from '@/utils/shortcutKey';
18
+ /**
19
+ * 插入超链接
20
+ */
21
+ export default class Link extends MenuBase {
22
+ /**
23
+ * @param {import('@/toolbars/MenuBase').MenuBaseConstructorParams} $cherry
24
+ */
25
+ constructor($cherry) {
26
+ super($cherry);
27
+ this.setName('link', 'link');
28
+ this.shortcutKeyMap = {
29
+ [`${CONTROL_KEY}-${getKeyCode('l')}`]: {
30
+ hookName: this.name,
31
+ aliasName: this.$cherry.locale[this.name],
32
+ },
33
+ };
34
+ }
35
+
36
+ /**
37
+ * 响应点击事件
38
+ * @param {string} selection 被用户选中的文本内容
39
+ * @returns {string} 回填到编辑器光标位置/选中文本区域的内容
40
+ */
41
+ onClick(selection, shortKey = '') {
42
+ // 插入图片,调用上传文件逻辑
43
+ if (/^http/.test(selection)) {
44
+ return `[${this.locale.link}](${selection})`;
45
+ }
46
+ const title = selection ? selection : this.locale.link;
47
+ return `[${title}](http://url.com) `;
48
+ }
49
+ }
@@ -0,0 +1,55 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ import { getSelection } from '@/utils/selection';
18
+ import { getListFromStr } from '@/utils/regexp';
19
+ /**
20
+ * 插入有序/无序/checklist列表的按钮
21
+ */
22
+ export default class List extends MenuBase {
23
+ constructor($cherry) {
24
+ super($cherry);
25
+ this.setName('list', 'list');
26
+ this.subMenuConfig = [
27
+ { iconName: 'ol', name: 'ol', onclick: this.bindSubClick.bind(this, '1') },
28
+ { iconName: 'ul', name: 'ul', onclick: this.bindSubClick.bind(this, '2') },
29
+ { iconName: 'checklist', name: 'checklist', onclick: this.bindSubClick.bind(this, '3') },
30
+ ];
31
+ }
32
+
33
+ getSubMenuConfig() {
34
+ return this.subMenuConfig;
35
+ }
36
+
37
+ /**
38
+ * 响应点击事件
39
+ * @param {string} selection 编辑区选中的文本内容
40
+ * @param {1|2|3|'ol'|'1'|'2'|'3'|'ul'|'checklist'|''} shortKey 快捷键:ol(1)有序列表,ul(2)无序列表,checklist(3) 检查项
41
+ * @returns 对应markdown的源码
42
+ */
43
+ onClick(selection, shortKey = '') {
44
+ const listType = [null, 'ol', 'ul', 'checklist']; // 下标1, 2, 3生效
45
+ const $selection = getSelection(this.editor.editor, selection, 'line', true);
46
+ const [before] = $selection.match(/^\n*/);
47
+ const [after] = $selection.match(/\n*$/);
48
+ const type = listType[shortKey] ? listType[shortKey] : shortKey;
49
+
50
+ if (!type || !/^(ol|ul|checklist)$/.test(type)) {
51
+ return $selection;
52
+ }
53
+ return `${before}${getListFromStr($selection, type)}${after}`;
54
+ }
55
+ }
@@ -0,0 +1,44 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ /**
18
+ * 预览区域切换到“移动端视图”的按钮
19
+ */
20
+ export default class MobilePreview extends MenuBase {
21
+ constructor($cherry) {
22
+ super($cherry);
23
+ this.previewer = $cherry.previewer;
24
+ this.updateMarkdown = false;
25
+ this.setName('mobilePreview', 'phone');
26
+ }
27
+
28
+ /**
29
+ * 响应点击事件
30
+ * 因为是预览区域的按钮,所以不用关注编辑区的选中内容
31
+ */
32
+ onClick() {
33
+ this.previewer.removeScroll();
34
+ // TODO:是否可以只通过修改外层class的方式来实现移动端预览效果的展示,而不是增加删除dom结构的方式
35
+ const previewerDom = this.previewer.getDomContainer();
36
+ if (this.previewer.isMobilePreview) {
37
+ previewerDom.parentNode.innerHTML = previewerDom.innerHTML;
38
+ } else {
39
+ previewerDom.innerHTML = `<div class='cherry-mobile-previewer-content'>${previewerDom.innerHTML}</div>`;
40
+ }
41
+ this.previewer.isMobilePreview = !this.previewer.isMobilePreview;
42
+ this.previewer.bindScroll();
43
+ }
44
+ }
@@ -0,0 +1,41 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ import { getSelection } from '@/utils/selection';
18
+ import { getListFromStr } from '@/utils/regexp';
19
+
20
+ /**
21
+ * 下标的按钮
22
+ **/
23
+ export default class Ol extends MenuBase {
24
+ constructor($cherry) {
25
+ super($cherry);
26
+ this.setName('ol', 'ol');
27
+ }
28
+
29
+ /**
30
+ *
31
+ * @param {string} selection 被用户选中的文本内容
32
+ * @param {string} shortKey 快捷键参数,本函数不处理这个参数
33
+ * @returns {string} 回填到编辑器光标位置/选中文本区域的内容
34
+ */
35
+ onClick(selection, shortKey = '') {
36
+ const $selection = getSelection(this.editor.editor, selection, 'line', true) || 'Item 1\n Item 1.1\nItem 2';
37
+ const [before] = $selection.match(/^\n*/);
38
+ const [after] = $selection.match(/\n*$/);
39
+ return `${before}${getListFromStr($selection, 'ol')}${after}`;
40
+ }
41
+ }
@@ -0,0 +1,140 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ import { getPanelRule } from '@/utils/regexp';
18
+ import { getSelection } from '@/utils/selection';
19
+ /**
20
+ * 插入面板
21
+ */
22
+ export default class Panel extends MenuBase {
23
+ constructor($cherry) {
24
+ super($cherry);
25
+ this.setName('panel', 'tips');
26
+ this.panelRule = getPanelRule().reg;
27
+ this.subMenuConfig = [
28
+ {
29
+ iconName: 'tips',
30
+ name: 'tips',
31
+ onclick: this.bindSubClick.bind(this, 'primary'),
32
+ },
33
+ {
34
+ iconName: 'info',
35
+ name: 'info',
36
+ onclick: this.bindSubClick.bind(this, 'info'),
37
+ },
38
+ {
39
+ iconName: 'warning',
40
+ name: 'warning',
41
+ onclick: this.bindSubClick.bind(this, 'warning'),
42
+ },
43
+ {
44
+ iconName: 'danger',
45
+ name: 'danger',
46
+ onclick: this.bindSubClick.bind(this, 'danger'),
47
+ },
48
+ {
49
+ iconName: 'success',
50
+ name: 'success',
51
+ onclick: this.bindSubClick.bind(this, 'success'),
52
+ },
53
+ ];
54
+ }
55
+
56
+ /**
57
+ * 从字符串中找打面板的name
58
+ * @param {string} str
59
+ * @returns {string | false}
60
+ */
61
+ $getNameFromStr(str) {
62
+ let ret = false;
63
+ this.panelRule.lastIndex = 0;
64
+ str.replace(this.panelRule, (match, preLines, name, content) => {
65
+ const $name = /\s/.test(name.trim()) ? name.trim().replace(/\s.*$/, '') : name;
66
+ ret = $name ? $name.trim().toLowerCase() : '';
67
+ return match;
68
+ });
69
+ return ret;
70
+ }
71
+
72
+ $getTitle(str) {
73
+ this.panelRule.lastIndex = 0;
74
+ str.replace(this.panelRule, (match, preLines, name, content) => {
75
+ const $name = name.trim();
76
+ return /\s/.test($name) ? $name.replace(/[^\s]+\s/, '') : '';
77
+ });
78
+ return '';
79
+ }
80
+
81
+ /**
82
+ * 响应点击事件
83
+ * @param {string} selection 被用户选中的文本内容
84
+ * @param {string} shortKey 快捷键参数
85
+ * @returns {string} 回填到编辑器光标位置/选中文本区域的内容
86
+ */
87
+ onClick(selection, shortKey = '') {
88
+ let $selection = getSelection(this.editor.editor, selection, 'line', true) || '内容';
89
+ let currentName = this.$getNameFromStr($selection);
90
+ let title = this.$getTitle($selection);
91
+ if (currentName === false) {
92
+ // 如果没有命中面板语法,则尝试扩大选区
93
+ this.getMoreSelection('::: ', '\n', () => {
94
+ const newSelection = this.editor.editor.getSelection();
95
+ const isMatch = this.$getNameFromStr(newSelection);
96
+ if (isMatch !== false) {
97
+ $selection = newSelection;
98
+ currentName = isMatch;
99
+ title = this.$getTitle(newSelection);
100
+ }
101
+ return isMatch !== false;
102
+ });
103
+ }
104
+ if (currentName !== false) {
105
+ // 如果命中了面板语法,则尝试去掉语法或者变更语法
106
+ if (currentName === shortKey) {
107
+ // 去掉面板语法
108
+ this.panelRule.lastIndex = 0;
109
+ return $selection.replace(this.panelRule, (match, preLines, name, content) => {
110
+ const $name = name.trim();
111
+ const $title = /\s/.test($name) ? $name.replace(/[^\s]+\s/, '') : '';
112
+ return `${$title}\n${content}`;
113
+ });
114
+ }
115
+ // 修改name
116
+ this.registerAfterClickCb(() => {
117
+ this.setLessSelection('::: ', '\n');
118
+ });
119
+ this.panelRule.lastIndex = 0;
120
+ return $selection.replace(this.panelRule, (match, preLines, name, content) => {
121
+ const $name = name.trim();
122
+ const $title = /\s/.test($name) ? $name.replace(/[^\s]+\s/, '') : '';
123
+ return `::: ${shortKey} ${$title}\n${content.replace(/\n+$/, '')}\n:::`;
124
+ });
125
+ }
126
+ this.registerAfterClickCb(() => {
127
+ this.setLessSelection('::: ', '\n');
128
+ });
129
+ $selection = $selection.replace(/^\n+/, '');
130
+ if (/\n/.test($selection)) {
131
+ if (!title) {
132
+ title = $selection.replace(/\n[\w\W]+$/, '');
133
+ $selection = $selection.replace(/^[^\n]+\n/, '');
134
+ }
135
+ } else {
136
+ title = title ? title : '标题';
137
+ }
138
+ return `::: ${shortKey} ${title}\n${$selection}\n:::`.replace(/\n{2,}:::/g, '\n:::');
139
+ }
140
+ }
@@ -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 MenuBase from '@/toolbars/MenuBase';
17
+ import { handleUpload, handleUploadMulti } from '@/utils/file';
18
+ /**
19
+ * 插入pdf
20
+ */
21
+ export default class Pdf extends MenuBase {
22
+ constructor($cherry) {
23
+ super($cherry);
24
+ this.setName('pdf', 'pdf');
25
+ }
26
+
27
+ /**
28
+ * 响应点击事件
29
+ * @param {string} selection 被用户选中的文本内容
30
+ * @returns {string} 回填到编辑器光标位置/选中文本区域的内容
31
+ */
32
+ onClick(selection, shortKey = '') {
33
+ const accept = this.$cherry.options?.fileTypeLimitMap?.pdf ?? '*';
34
+ const multiple = this.$cherry?.options.multipleFileSelection?.pdf ?? false;
35
+ if (multiple) {
36
+ if (this.hasCacheOnce()) {
37
+ const arr = this.getAndCleanCacheOnce();
38
+ let res = '';
39
+ // @ts-ignore
40
+ for (const { url, params } of arr) {
41
+ const begin = '[';
42
+ const end = `](${url})`;
43
+ this.registerAfterClickCb(() => {
44
+ this.setLessSelection(begin, end);
45
+ });
46
+ const finalName = params.name ? params.name : name;
47
+ res += `${begin}${finalName}${end}\n`;
48
+ }
49
+ return res;
50
+ }
51
+ // 插入图片,调用上传文件逻辑
52
+ handleUploadMulti(this.editor, 'pdf', accept, (arr) => {
53
+ this.setCacheOnce(arr);
54
+ this.fire(null);
55
+ });
56
+ this.updateMarkdown = false;
57
+ return selection;
58
+ }
59
+ if (this.hasCacheOnce()) {
60
+ // @ts-ignore
61
+ const { name, url, params } = this.getAndCleanCacheOnce();
62
+ const begin = '[';
63
+ const end = `](${url})`;
64
+ this.registerAfterClickCb(() => {
65
+ this.setLessSelection(begin, end);
66
+ });
67
+ const finalName = params.name ? params.name : name;
68
+ return `${begin}${finalName}${end}`;
69
+ }
70
+ // 插入图片,调用上传文件逻辑
71
+ handleUpload(this.editor, 'pdf', accept, (name, url, params) => {
72
+ this.setCacheOnce({ name, url, params });
73
+ this.fire(null);
74
+ });
75
+ this.updateMarkdown = false;
76
+ return selection;
77
+ }
78
+ }
@@ -0,0 +1,123 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ import { isBrowser } from '@/utils/env';
18
+ import platformTransform from '@/utils/platformTransform';
19
+
20
+ /** @typedef {import('../../../types/cherry').SupportPlatform} SupportPlatform */
21
+
22
+ /** @type {Array<SupportPlatform>} */
23
+ const supportPlatforms = ['wechat'];
24
+
25
+ export default class Publish extends MenuBase {
26
+ /**
27
+ * @param {import('@/toolbars/MenuBase').MenuBaseConstructorParams} $cherry
28
+ */
29
+ constructor($cherry) {
30
+ super($cherry);
31
+ this.previewer = $cherry.previewer;
32
+ this.updateMarkdown = false;
33
+ this.setName('publish', 'copy');
34
+ const publishConfigs = $cherry?.options?.toolbars?.config?.publish || [];
35
+ const keys = publishConfigs.map((config) => {
36
+ if (!Object.prototype.hasOwnProperty.call(config, 'key')) {
37
+ throw new Error('publish config must have key');
38
+ }
39
+ // @ts-ignore
40
+ if (!supportPlatforms.includes(config.key)) {
41
+ throw new Error(`publish config key must be one of ${supportPlatforms.join(',')}`);
42
+ }
43
+ return config.key;
44
+ });
45
+ if (new Set(keys).size !== keys.length) {
46
+ throw new Error('publish config key must be unique');
47
+ }
48
+ this.subMenuConfig = publishConfigs.map((config) => {
49
+ /** @type {import('../MenuBase').SubMenuConfigItem}*/
50
+ const subMenuConfig = {
51
+ name: config.name,
52
+ iconName: config.iconName,
53
+ icon: config.icon,
54
+ onclick: this.bindSubClick.bind(this, config),
55
+ };
56
+ return subMenuConfig;
57
+ });
58
+ }
59
+
60
+ /**
61
+ * 子菜单点击事件
62
+ * @param {string} selection 编辑器中选中的内容
63
+ * @param {import('../../../types/cherry').CherryPublishToolbarOption} shortcut 子菜单配置项
64
+ */
65
+ onClick(selection, shortcut) {
66
+ if (!isBrowser()) return;
67
+ const { previewerDom } = this.$cherry.previewer.options;
68
+ const title = previewerDom?.querySelector('h1')?.innerText ?? '';
69
+ const { key, serviceUrl, injectPayload } = shortcut;
70
+ const execute = async () => {
71
+ let injectPayloadResult = {};
72
+ if (typeof injectPayload === 'function') {
73
+ injectPayloadResult = await injectPayload();
74
+ } else if (typeof injectPayload === 'object' && injectPayload !== null) {
75
+ injectPayloadResult = injectPayload;
76
+ }
77
+ const style = this.getAllStyleSheets();
78
+ const html = await platformTransform(previewerDom?.outerHTML ?? '', key);
79
+ const res = await fetch(`${serviceUrl}/publish`, {
80
+ method: 'POST',
81
+ headers: {
82
+ 'Content-Type': 'application/json',
83
+ },
84
+ body: JSON.stringify({
85
+ target: key,
86
+ contentType: 'html',
87
+ needInlineStyle: true,
88
+ articles: [
89
+ {
90
+ title,
91
+ content: html + style,
92
+ ...injectPayloadResult,
93
+ },
94
+ ],
95
+ }),
96
+ });
97
+ const publishRes = await res.json();
98
+ if (publishRes?.code === 0) {
99
+ alert('发布成功');
100
+ } else {
101
+ alert(`错误码:${publishRes?.code} 错误信息:${publishRes?.msg}`);
102
+ }
103
+ };
104
+ execute();
105
+ }
106
+
107
+ /**
108
+ * 获取所有的样式表
109
+ * @returns {string}
110
+ */
111
+ getAllStyleSheets() {
112
+ const allSheets = Array.from(document.styleSheets).filter((item) => item.cssRules[0]);
113
+ // 每一条styleSheet用一个style标签包裹
114
+ return allSheets
115
+ .map(
116
+ (cssStyleSheet) =>
117
+ `<style>${Array.from(cssStyleSheet.cssRules)
118
+ .map((cssRule) => cssRule.cssText)
119
+ .join('')}</style>`,
120
+ )
121
+ .join('');
122
+ }
123
+ }
@@ -0,0 +1,43 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ /**
18
+ * 插入“简单表格”的按钮
19
+ * 所谓简单表格,是源于[TAPD](https://tapd.cn) wiki应用里的一种表格语法
20
+ * 该表格语法不是markdown通用语法,请慎用
21
+ */
22
+ export default class QuickTable extends MenuBase {
23
+ constructor($cherry) {
24
+ super($cherry);
25
+ this.setName('quickTable', 'table');
26
+ }
27
+
28
+ /**
29
+ * 响应点击事件
30
+ * @param {string} selection 编辑器里选中的内容
31
+ * @param {string} shortKey 本函数不处理快捷键
32
+ * @returns
33
+ */
34
+ onClick(selection, shortKey = '') {
35
+ // TODO:可以尝试解析下selection里的内容,按\s、\t区分列,按\n区分行
36
+ return (
37
+ `${selection}| LeftAlignedCol | CenterAlignedCol | RightAlignedCol |\n` +
38
+ '| :--- | :---: | ---: |\n' +
39
+ '| sampleText | sampleText | sampleText |\n' +
40
+ '| **left**Text | centered Text | *right*Text |\n'
41
+ );
42
+ }
43
+ }
@@ -0,0 +1,45 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ import { getSelection } from '@/utils/selection';
18
+ /**
19
+ * 插入“引用”的按钮
20
+ */
21
+ export default class Quote extends MenuBase {
22
+ constructor($cherry) {
23
+ super($cherry);
24
+ this.setName('quote', 'blockquote');
25
+ }
26
+
27
+ /**
28
+ * click handler
29
+ * @param {string} selection selection in editor
30
+ * @returns
31
+ */
32
+ onClick(selection) {
33
+ const $selection = getSelection(this.editor.editor, selection, 'line', true) || this.locale.quote;
34
+ const isWrapped = $selection.split('\n').every((text) => /^\s*>[^\n]+$/.exec(text));
35
+ if (isWrapped) {
36
+ // 去掉>号
37
+ return $selection.replace(/(^\s*)>\s*([^\n]+)($)/gm, '$1$2$3').replace(/\n+$/, '\n\n');
38
+ }
39
+ this.registerAfterClickCb(() => {
40
+ this.setLessSelection('> ', '');
41
+ });
42
+ // 给每一行增加>号
43
+ return $selection.replace(/(^)([^\n]+)($)/gm, '$1> $2$3').replace(/\n+$/, '\n\n');
44
+ }
45
+ }
@@ -0,0 +1,33 @@
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 MenuBase from '@/toolbars/MenuBase';
17
+ /**
18
+ * 撤销/重做 里的“重做”按键
19
+ * 依赖codemirror的undo接口
20
+ */
21
+ export default class Redo extends MenuBase {
22
+ constructor($cherry) {
23
+ super($cherry);
24
+ this.setName('redo', 'redo');
25
+ }
26
+
27
+ /**
28
+ * 直接调用codemirror的redo方法就好了
29
+ */
30
+ onClick() {
31
+ this.editor.editor.redo();
32
+ }
33
+ }