@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,34 @@
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 Br extends MenuBase {
21
+ constructor($cherry) {
22
+ super($cherry);
23
+ this.setName('br', 'br');
24
+ }
25
+
26
+ /**
27
+ * 响应点击事件
28
+ * @param {string} selection 被用户选中的文本内容
29
+ * @returns {string} 回填到编辑器光标位置/选中文本区域的内容
30
+ */
31
+ onClick(selection, shortKey = '') {
32
+ return `${selection}<br>`;
33
+ }
34
+ }
@@ -0,0 +1,62 @@
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 ChangeLocale extends MenuBase {
21
+ constructor($cherry) {
22
+ super($cherry);
23
+ this.noIcon = true;
24
+ const defaultLocaleList = [
25
+ {
26
+ locale: 'zh_CN',
27
+ name: '中文',
28
+ },
29
+ {
30
+ locale: 'en_US',
31
+ name: 'English',
32
+ },
33
+ {
34
+ locale: 'ru_RU',
35
+ name: 'Русский',
36
+ },
37
+ ];
38
+ this.changeLocale = $cherry?.options?.toolbars?.config?.changeLocale || defaultLocaleList;
39
+ this.subMenuConfig = [];
40
+ this.nameMap = {};
41
+ for (let i = 0; i < this.changeLocale.length; i++) {
42
+ const { locale, name } = this.changeLocale[i];
43
+ this.subMenuConfig.push({
44
+ iconName: locale,
45
+ name,
46
+ onclick: this.bindSubClick.bind(this, locale),
47
+ });
48
+ this.nameMap[locale] = name;
49
+ }
50
+ this.setName(this.nameMap[this.$cherry.options.locale] || this.nameMap.zh_CN);
51
+ }
52
+
53
+ onClick(selection, shortKey) {
54
+ if (!this.$cherry.locales[shortKey]) {
55
+ return;
56
+ }
57
+ this.$cherry.$event.emit('afterChangeLocale', shortKey);
58
+ this.$cherry.options.locale = shortKey;
59
+ this.$cherry.locale = this.$cherry.locales[shortKey];
60
+ this.$cherry.resetToolbar('toolbar', this.$cherry.options.toolbars.toolbar || []);
61
+ }
62
+ }
@@ -0,0 +1,182 @@
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 openAI from 'openai';
18
+
19
+ const FUNC_MAP = {
20
+ COMPLEMENT: 'complement',
21
+ SUMMARY: 'summary',
22
+ };
23
+
24
+ /**
25
+ * 插入“画图”的按钮
26
+ * 本功能依赖[Mermaid.js](https://mermaid-js.github.io)组件,请保证调用CherryMarkdown前已加载mermaid.js组件
27
+ */
28
+ export default class ChatGpt extends MenuBase {
29
+ constructor($cherry) {
30
+ super($cherry);
31
+ this.setName('chatgpt', 'chatgpt');
32
+ this.noIcon = true;
33
+ this.subMenuConfig = [
34
+ // 续写
35
+ {
36
+ iconName: this.locale.complement,
37
+ name: FUNC_MAP.COMPLEMENT,
38
+ onclick: this.bindSubClick.bind(this, FUNC_MAP.COMPLEMENT),
39
+ },
40
+ // 总结
41
+ {
42
+ iconName: this.locale.summary,
43
+ name: FUNC_MAP.SUMMARY,
44
+ onclick: this.bindSubClick.bind(this, FUNC_MAP.SUMMARY),
45
+ },
46
+ ];
47
+ const { apiKey = '', proxy: { host = '', port = '' } = {}, ignoreError } = this.$cherry.options.openai || {};
48
+ // 设置apiKey
49
+ if (apiKey) {
50
+ const openai = new openAI.OpenAIApi(
51
+ new openAI.Configuration({
52
+ apiKey,
53
+ }),
54
+ );
55
+ this.openai = openai;
56
+ }
57
+ // 设置http proxy
58
+ if (host && port) {
59
+ this.proxy = {
60
+ host,
61
+ port,
62
+ };
63
+ }
64
+ this.ignoreError = ignoreError;
65
+ }
66
+
67
+ getSubMenuConfig() {
68
+ return this.subMenuConfig;
69
+ }
70
+
71
+ /**
72
+ * 响应点击事件
73
+ * @param {string} selection 被用户选中的文本内容,本函数不处理选中的内容,会直接清空用户选中的内容
74
+ * @param {string} shortKey 快捷键参数
75
+ * @returns {string} 回填到编辑器光标位置/选中文本区域的内容
76
+ */
77
+ onClick(selection, shortKey = '') {
78
+ if (!shortKey) {
79
+ return;
80
+ }
81
+ switch (shortKey) {
82
+ case FUNC_MAP.COMPLEMENT:
83
+ if (!this.openai) {
84
+ // 触发一个事件表示没有apiKey?
85
+ return;
86
+ }
87
+ this.queryOpenAIApi(FUNC_MAP.COMPLEMENT, selection);
88
+ break;
89
+ case FUNC_MAP.SUMMARY:
90
+ this.queryOpenAIApi(FUNC_MAP.SUMMARY, selection);
91
+ break;
92
+ default:
93
+ return;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * 在编辑器中添加文字
99
+ */
100
+ concatText(selection, text) {
101
+ this.button.className = this.button.className.replace('icon-loading loading', '');
102
+ this.button.innerText = this.button.title;
103
+ this.editor?.editor?.replaceSelection(`${selection || ''} \n${text}`);
104
+ this.editor?.editor?.focus();
105
+ }
106
+
107
+ /**
108
+ * 请求openai api,成功回调&失败回调
109
+ * @param {string} name
110
+ * @param {string} selection
111
+ */
112
+ queryOpenAIApi(name, selection) {
113
+ if (!this.openai) {
114
+ return;
115
+ }
116
+ // 增加loading
117
+ // eslint-disable-next-line prefer-destructuring
118
+ this.button = this.$cherry.wrapperDom.getElementsByClassName('cherry-toolbar-chatgpt')[0];
119
+ if (/icon-loading loading/.test(this.button.className)) {
120
+ return;
121
+ }
122
+ this.button.className += ' icon-loading loading';
123
+ this.button.innerText = '';
124
+ // const that = this;
125
+ const inputText = selection || this.$cherry.editor.editor.getValue();
126
+ queryMap[name]
127
+ .apply(this, [inputText])
128
+ .then((res) => this.concatText(selection, res.data?.choices?.[0]?.message?.content || ''))
129
+ .catch((res) => {
130
+ // 请求失败处理,两种方案
131
+ // 1. 抛出一个事件给第三方使用者,在cherry里怎么实现?
132
+ // 2. cherry处理并在编辑器中提示用户,目前采取这种方式
133
+ const errMsg = res?.response?.data?.error?.message || '';
134
+ if (errMsg && this.ignoreError === false) {
135
+ this.concatText(selection, errMsg);
136
+ }
137
+ });
138
+ }
139
+ }
140
+
141
+ const generatePromptMap = {
142
+ [FUNC_MAP.COMPLEMENT](text, language) {
143
+ if (language === 'zh_CN') {
144
+ return `请续写以下文字: ${text}`;
145
+ }
146
+ return `continue writing with the following text: ${text}`;
147
+ },
148
+ [FUNC_MAP.SUMMARY](text, language) {
149
+ if (language === 'zh_CN') {
150
+ return `请总结以下文字: ${text}`;
151
+ }
152
+ return `summary the following text: ${text}`;
153
+ },
154
+ };
155
+
156
+ function queryCompletion(type, input) {
157
+ return this.openai.createChatCompletion(
158
+ {
159
+ model: 'gpt-3.5-turbo',
160
+ messages: [
161
+ {
162
+ role: 'user',
163
+ content: generatePromptMap[type](input, this.$cherry.options.locale || ''),
164
+ },
165
+ ],
166
+ // temperature: 0.6,
167
+ // max_tokens: 500,
168
+ },
169
+ {
170
+ proxy: this.proxy,
171
+ },
172
+ );
173
+ }
174
+
175
+ const queryMap = {
176
+ [FUNC_MAP.COMPLEMENT](input) {
177
+ return queryCompletion.apply(this, [FUNC_MAP.COMPLEMENT, input]);
178
+ },
179
+ [FUNC_MAP.SUMMARY](input) {
180
+ return queryCompletion.apply(this, [FUNC_MAP.SUMMARY, input]);
181
+ },
182
+ };
@@ -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 Checklist extends MenuBase {
24
+ constructor($cherry) {
25
+ super($cherry);
26
+ this.setName('checklist', 'checklist');
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, 'checklist')}${after}`;
40
+ }
41
+ }
@@ -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 Code extends MenuBase {
22
+ /**
23
+ * @param {import('@/toolbars/MenuBase').MenuBaseConstructorParams} $cherry
24
+ */
25
+ constructor($cherry) {
26
+ super($cherry);
27
+ this.setName('codeBlock', 'codeBlock');
28
+ this.shortcutKeyMap = {
29
+ [`${CONTROL_KEY}-${getKeyCode('k')}`]: {
30
+ hookName: this.name,
31
+ aliasName: this.$cherry.locale[this.name],
32
+ },
33
+ };
34
+ }
35
+
36
+ /**
37
+ * 响应点击事件
38
+ * @param {string} selection 被用户选中的文本内容
39
+ * @param {string} shortKey 快捷键参数,本函数不处理这个参数
40
+ * @returns {string} 回填到编辑器光标位置/选中文本区域的内容
41
+ */
42
+ onClick(selection, shortKey = '') {
43
+ const code = selection ? selection : 'code...';
44
+ this.registerAfterClickCb(() => {
45
+ this.setLessSelection(`\n\`\`\` \n`, `\n\`\`\`\n`);
46
+ });
47
+ return `\n\`\`\` \n${code}\n\`\`\`\n`;
48
+ }
49
+ }
@@ -0,0 +1,66 @@
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 { changeCodeTheme } from '@/utils/config';
18
+ /**
19
+ * 设置代码块的主题
20
+ * 本功能依赖[prism组件](https://github.com/PrismJS/prism)
21
+ */
22
+ export default class CodeTheme extends MenuBase {
23
+ constructor($cherry) {
24
+ super($cherry);
25
+ this.setName('codeTheme');
26
+ this.updateMarkdown = false;
27
+ this.noIcon = true;
28
+ this.subMenuConfig = [
29
+ { noIcon: false, name: 'autoWrap', iconName: 'br', onclick: this.bindSubClick.bind(this, 'wrap') },
30
+ { noIcon: true, name: 'light', onclick: this.bindSubClick.bind(this, 'default') },
31
+ { noIcon: true, name: 'dark', onclick: this.bindSubClick.bind(this, 'dark') },
32
+ { noIcon: true, name: 'one light', onclick: this.bindSubClick.bind(this, 'one-light') },
33
+ { noIcon: true, name: 'one dark', onclick: this.bindSubClick.bind(this, 'one-dark') },
34
+ { noIcon: true, name: 'vs light', onclick: this.bindSubClick.bind(this, 'vs-light') },
35
+ { noIcon: true, name: 'vs dark', onclick: this.bindSubClick.bind(this, 'vs-dark') },
36
+ { noIcon: true, name: 'solarized light', onclick: this.bindSubClick.bind(this, 'solarized-light') },
37
+ { noIcon: true, name: 'tomorrow dark', onclick: this.bindSubClick.bind(this, 'tomorrow-night') },
38
+ { noIcon: true, name: 'okaidia', onclick: this.bindSubClick.bind(this, 'okaidia') },
39
+ { noIcon: true, name: 'twilight', onclick: this.bindSubClick.bind(this, 'twilight') },
40
+ { noIcon: true, name: 'coy', onclick: this.bindSubClick.bind(this, 'coy') },
41
+ ];
42
+ }
43
+
44
+ getActiveSubMenuIndex(subMenuDomPanel) {
45
+ const wrap = this.$cherry.getCodeWrap();
46
+ return wrap === 'wrap' ? 0 : -1;
47
+ }
48
+
49
+ /**
50
+ * 响应点击事件
51
+ * @param {string} shortKey 快捷键参数,本函数不处理这个参数
52
+ * @param {string} codeTheme 具体的代码块主题
53
+ */
54
+ onClick(shortKey = '', codeTheme) {
55
+ if (codeTheme === 'wrap') {
56
+ // 切换是否自动换行
57
+ const wrap = this.$cherry.getCodeWrap();
58
+ const newWrap = wrap === 'wrap' ? 'nowrap' : 'wrap';
59
+ this.$cherry.wrapperDom.dataset.codeWrap = newWrap;
60
+ this.$cherry.setCodeWrap(newWrap);
61
+ return;
62
+ }
63
+ this.$cherry.$event.emit('changeCodeBlockTheme', codeTheme);
64
+ changeCodeTheme(this.$cherry, codeTheme);
65
+ }
66
+ }