@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.
- package/package.json +149 -0
- package/src/Cherry.config.js +625 -0
- package/src/Cherry.js +1104 -0
- package/src/CherryStatic.js +70 -0
- package/src/Editor.js +748 -0
- package/src/Engine.js +381 -0
- package/src/Event.js +140 -0
- package/src/Factory.js +180 -0
- package/src/Logger.js +31 -0
- package/src/Previewer.js +1183 -0
- package/src/Sanitizer.js +4 -0
- package/src/Sanitizer.node.js +7 -0
- package/src/UrlCache.js +98 -0
- package/src/addons/advance/cherry-table-echarts-plugin.js +170 -0
- package/src/addons/cherry-code-block-mermaid-plugin.js +158 -0
- package/src/addons/cherry-code-block-plantuml-plugin.js +106 -0
- package/src/core/HookCenter.js +297 -0
- package/src/core/HooksConfig.js +100 -0
- package/src/core/ParagraphBase.js +332 -0
- package/src/core/SentenceBase.js +65 -0
- package/src/core/SyntaxBase.js +194 -0
- package/src/core/hooks/AutoLink.js +232 -0
- package/src/core/hooks/BackgroundColor.js +46 -0
- package/src/core/hooks/Blockquote.js +70 -0
- package/src/core/hooks/Br.js +85 -0
- package/src/core/hooks/CodeBlock.js +446 -0
- package/src/core/hooks/Color.js +46 -0
- package/src/core/hooks/CommentReference.js +96 -0
- package/src/core/hooks/Detail.js +108 -0
- package/src/core/hooks/Emoji.config.js +1825 -0
- package/src/core/hooks/Emoji.js +119 -0
- package/src/core/hooks/Emphasis.js +113 -0
- package/src/core/hooks/Footnote.js +125 -0
- package/src/core/hooks/FrontMatter.js +51 -0
- package/src/core/hooks/Header.js +234 -0
- package/src/core/hooks/HighLight.js +37 -0
- package/src/core/hooks/Hr.js +52 -0
- package/src/core/hooks/HtmlBlock.js +184 -0
- package/src/core/hooks/Image.js +174 -0
- package/src/core/hooks/InlineCode.js +48 -0
- package/src/core/hooks/InlineMath.js +107 -0
- package/src/core/hooks/Link.js +160 -0
- package/src/core/hooks/List.js +264 -0
- package/src/core/hooks/MathBlock.js +103 -0
- package/src/core/hooks/Panel.js +145 -0
- package/src/core/hooks/Paragraph.js +84 -0
- package/src/core/hooks/Ruby.js +34 -0
- package/src/core/hooks/Size.js +51 -0
- package/src/core/hooks/Strikethrough.js +54 -0
- package/src/core/hooks/Sub.js +47 -0
- package/src/core/hooks/SuggestList.js +333 -0
- package/src/core/hooks/Suggester.js +707 -0
- package/src/core/hooks/Sup.js +47 -0
- package/src/core/hooks/Table.js +275 -0
- package/src/core/hooks/Toc.js +292 -0
- package/src/core/hooks/Transfer.js +47 -0
- package/src/core/hooks/Underline.js +37 -0
- package/src/index.core.js +29 -0
- package/src/index.engine.core.js +68 -0
- package/src/index.engine.js +28 -0
- package/src/index.js +32 -0
- package/src/libs/mermaidAPI.8.4.8.js +1 -0
- package/src/libs/mermaidAPI.8.5.2.js +42 -0
- package/src/libs/rawdeflate.js +1663 -0
- package/src/locales/en_US.js +139 -0
- package/src/locales/index.js +25 -0
- package/src/locales/ru_RU.js +139 -0
- package/src/locales/zh_CN.js +142 -0
- package/src/sass/base.scss +26 -0
- package/src/sass/bubble_formula.scss +166 -0
- package/src/sass/ch-icon.scss +118 -0
- package/src/sass/cherry.scss +1116 -0
- package/src/sass/components/bubble.scss +173 -0
- package/src/sass/components/shortcut_key_config.scss +108 -0
- package/src/sass/formula_utils_bubble.scss +82 -0
- package/src/sass/icon_template.scss +24 -0
- package/src/sass/icons/uEA03-list.svg +19 -0
- package/src/sass/icons/uEA04-check.svg +14 -0
- package/src/sass/icons/uEA09-square.svg +10 -0
- package/src/sass/icons/uEA0A-bold.svg +20 -0
- package/src/sass/icons/uEA0B-code.svg +18 -0
- package/src/sass/icons/uEA0C-color.svg +13 -0
- package/src/sass/icons/uEA0D-header.svg +8 -0
- package/src/sass/icons/uEA0E-image.svg +15 -0
- package/src/sass/icons/uEA0F-italic.svg +8 -0
- package/src/sass/icons/uEA10-link.svg +16 -0
- package/src/sass/icons/uEA11-ol.svg +21 -0
- package/src/sass/icons/uEA12-size.svg +11 -0
- package/src/sass/icons/uEA13-strike.svg +16 -0
- package/src/sass/icons/uEA14-table.svg +12 -0
- package/src/sass/icons/uEA15-ul.svg +17 -0
- package/src/sass/icons/uEA16-underline.svg +13 -0
- package/src/sass/icons/uEA17-word.svg +16 -0
- package/src/sass/icons/uEA18-blockquote.svg +11 -0
- package/src/sass/icons/uEA19-font.svg +10 -0
- package/src/sass/icons/uEA1F-insertClass.svg +39 -0
- package/src/sass/icons/uEA20-insertFlow.svg +8 -0
- package/src/sass/icons/uEA21-insertFormula.svg +23 -0
- package/src/sass/icons/uEA22-insertGantt.svg +13 -0
- package/src/sass/icons/uEA23-insertGraph.svg +13 -0
- package/src/sass/icons/uEA24-insertPie.svg +19 -0
- package/src/sass/icons/uEA25-insertSeq.svg +20 -0
- package/src/sass/icons/uEA26-insertState.svg +35 -0
- package/src/sass/icons/uEA27-line.svg +11 -0
- package/src/sass/icons/uEA28-preview.svg +18 -0
- package/src/sass/icons/uEA29-previewClose.svg +24 -0
- package/src/sass/icons/uEA2A-toc.svg +24 -0
- package/src/sass/icons/uEA2D-sub.svg +15 -0
- package/src/sass/icons/uEA2E-sup.svg +15 -0
- package/src/sass/icons/uEA2F-h1.svg +16 -0
- package/src/sass/icons/uEA30-h2.svg +20 -0
- package/src/sass/icons/uEA31-h3.svg +23 -0
- package/src/sass/icons/uEA32-h4.svg +16 -0
- package/src/sass/icons/uEA33-h5.svg +20 -0
- package/src/sass/icons/uEA34-h6.svg +17 -0
- package/src/sass/icons/uEA35-video.svg +20 -0
- package/src/sass/icons/uEA36-insert.svg +25 -0
- package/src/sass/icons/uEA37-little_table.svg +30 -0
- package/src/sass/icons/uEA38-pdf.svg +27 -0
- package/src/sass/icons/uEA39-checklist.svg +22 -0
- package/src/sass/icons/uEA40-close.svg +12 -0
- package/src/sass/icons/uEA41-fullscreen.svg +81 -0
- package/src/sass/icons/uEA42-minscreen.svg +77 -0
- package/src/sass/icons/uEA43-insertChart.svg +23 -0
- package/src/sass/icons/uEA44-question.svg +25 -0
- package/src/sass/icons/uEA45-settings.svg +32 -0
- package/src/sass/icons/uEA46-ok.svg +7 -0
- package/src/sass/icons/uEA47-br.svg +22 -0
- package/src/sass/icons/uEA48-normal.svg +15 -0
- package/src/sass/icons/uEA49-undo.svg +19 -0
- package/src/sass/icons/uEA50-redo.svg +21 -0
- package/src/sass/icons/uEA51-copy.svg +6 -0
- package/src/sass/icons/uEA52-phone.svg +5 -0
- package/src/sass/icons/uEA53-cherry-table-delete.svg +17 -0
- package/src/sass/icons/uEA54-cherry-table-insert-bottom.svg +16 -0
- package/src/sass/icons/uEA55-cherry-table-insert-left.svg +15 -0
- package/src/sass/icons/uEA56-cherry-table-insert-right.svg +16 -0
- package/src/sass/icons/uEA57-cherry-table-insert-top.svg +16 -0
- package/src/sass/icons/uEA58-sort-s.svg +13 -0
- package/src/sass/icons/uEA59-pinyin.svg +1 -0
- package/src/sass/icons/uEA5A-create.svg +24 -0
- package/src/sass/icons/uEA5B-download.svg +34 -0
- package/src/sass/icons/uEA5C-edit.svg +3 -0
- package/src/sass/icons/uEA5D-export.svg +53 -0
- package/src/sass/icons/uEA5E-folder-open.svg +3 -0
- package/src/sass/icons/uEA5F-folder.svg +3 -0
- package/src/sass/icons/uEA60-help.svg +5 -0
- package/src/sass/icons/uEA61-pen-fill.svg +13 -0
- package/src/sass/icons/uEA62-pen.svg +3 -0
- package/src/sass/icons/uEA64-tips.svg +5 -0
- package/src/sass/icons/uEA65-warn.svg +5 -0
- package/src/sass/icons/uEA66-mistake.svg +4 -0
- package/src/sass/icons/uEA67-success.svg +4 -0
- package/src/sass/icons/uEA68-danger.svg +4 -0
- package/src/sass/icons/uEA69-info.svg +5 -0
- package/src/sass/icons/uEA6A-primary.svg +5 -0
- package/src/sass/icons/uEA6B-warning.svg +5 -0
- package/src/sass/icons/uEA6C-justify.svg +19 -0
- package/src/sass/icons/uEA6D-justifyCenter.svg +19 -0
- package/src/sass/icons/uEA6E-justifyLeft.svg +19 -0
- package/src/sass/icons/uEA6F-justifyRight.svg +19 -0
- package/src/sass/icons/uEA70-chevronsLeft.svg +1 -0
- package/src/sass/icons/uEA71-chevronsRight.svg +1 -0
- package/src/sass/icons/uEA72-trendingUp.svg +1 -0
- package/src/sass/icons/uEA74-codeBlock.svg +1 -0
- package/src/sass/icons/uEA75-expand.svg +3 -0
- package/src/sass/icons/uEA76-unExpand.svg +3 -0
- package/src/sass/icons/uEA77-swap-vert.svg +1 -0
- package/src/sass/icons/uEA78-swap.svg +1 -0
- package/src/sass/icons/uEA79-keyboard.svg +1 -0
- package/src/sass/icons/uEA7A-command.svg +1 -0
- package/src/sass/icons/uEA7B-search.svg +1 -0
- package/src/sass/index.scss +3 -0
- package/src/sass/markdown.scss +668 -0
- package/src/sass/markdown_pure.scss +9 -0
- package/src/sass/prettyprint/prettyprint.scss +118 -0
- package/src/sass/previewer.scss +179 -0
- package/src/sass/print.scss +13 -0
- package/src/sass/prism/coy.scss +220 -0
- package/src/sass/prism/dark.scss +132 -0
- package/src/sass/prism/default.scss +143 -0
- package/src/sass/prism/funky.scss +133 -0
- package/src/sass/prism/okaidia.scss +126 -0
- package/src/sass/prism/one-dark.scss +440 -0
- package/src/sass/prism/one-light.scss +428 -0
- package/src/sass/prism/solarized-light.scss +153 -0
- package/src/sass/prism/tomorrow-night.scss +125 -0
- package/src/sass/prism/twilight.scss +202 -0
- package/src/sass/prism/vs-dark.scss +275 -0
- package/src/sass/prism/vs-light.scss +168 -0
- package/src/sass/themes/blue.scss +411 -0
- package/src/sass/themes/dark.scss +517 -0
- package/src/sass/themes/default.scss +255 -0
- package/src/sass/themes/green.scss +395 -0
- package/src/sass/themes/light.scss +368 -0
- package/src/sass/themes/red.scss +397 -0
- package/src/sass/themes/violet.scss +410 -0
- package/src/sass/variable.scss +84 -0
- package/src/toolbars/Bubble.js +234 -0
- package/src/toolbars/BubbleFormula.js +298 -0
- package/src/toolbars/BubbleTable.js +147 -0
- package/src/toolbars/FloatMenu.js +131 -0
- package/src/toolbars/HiddenToolbar.js +36 -0
- package/src/toolbars/HookCenter.js +234 -0
- package/src/toolbars/MenuBase.js +569 -0
- package/src/toolbars/PreviewerBubble.js +608 -0
- package/src/toolbars/ShortcutKeyConfigPanel.js +345 -0
- package/src/toolbars/Sidebar.js +36 -0
- package/src/toolbars/Toc.js +242 -0
- package/src/toolbars/Toolbar.js +449 -0
- package/src/toolbars/ToolbarRight.js +37 -0
- package/src/toolbars/hooks/Audio.js +79 -0
- package/src/toolbars/hooks/BarTable.js +41 -0
- package/src/toolbars/hooks/Bold.js +73 -0
- package/src/toolbars/hooks/Br.js +34 -0
- package/src/toolbars/hooks/ChangeLocale.js +62 -0
- package/src/toolbars/hooks/ChatGpt.js +182 -0
- package/src/toolbars/hooks/CheckList.js +41 -0
- package/src/toolbars/hooks/Code.js +49 -0
- package/src/toolbars/hooks/CodeTheme.js +66 -0
- package/src/toolbars/hooks/Color.js +298 -0
- package/src/toolbars/hooks/Copy.js +141 -0
- package/src/toolbars/hooks/Detail.js +69 -0
- package/src/toolbars/hooks/DrawIo.js +57 -0
- package/src/toolbars/hooks/Export.js +49 -0
- package/src/toolbars/hooks/File.js +79 -0
- package/src/toolbars/hooks/Formula.js +69 -0
- package/src/toolbars/hooks/FullScreen.js +50 -0
- package/src/toolbars/hooks/Graph.js +263 -0
- package/src/toolbars/hooks/H1.js +71 -0
- package/src/toolbars/hooks/H2.js +71 -0
- package/src/toolbars/hooks/H3.js +71 -0
- package/src/toolbars/hooks/Header.js +118 -0
- package/src/toolbars/hooks/Hr.js +35 -0
- package/src/toolbars/hooks/Image.js +91 -0
- package/src/toolbars/hooks/InlineCode.js +53 -0
- package/src/toolbars/hooks/Insert.js +193 -0
- package/src/toolbars/hooks/Italic.js +72 -0
- package/src/toolbars/hooks/Justify.js +49 -0
- package/src/toolbars/hooks/LineTable.js +41 -0
- package/src/toolbars/hooks/Link.js +49 -0
- package/src/toolbars/hooks/List.js +55 -0
- package/src/toolbars/hooks/MobilePreview.js +44 -0
- package/src/toolbars/hooks/Ol.js +41 -0
- package/src/toolbars/hooks/Panel.js +140 -0
- package/src/toolbars/hooks/Pdf.js +78 -0
- package/src/toolbars/hooks/Publish.js +123 -0
- package/src/toolbars/hooks/QuickTable.js +43 -0
- package/src/toolbars/hooks/Quote.js +45 -0
- package/src/toolbars/hooks/Redo.js +33 -0
- package/src/toolbars/hooks/Ruby.js +59 -0
- package/src/toolbars/hooks/Search.js +53 -0
- package/src/toolbars/hooks/Settings.js +220 -0
- package/src/toolbars/hooks/ShortcutKey.js +62 -0
- package/src/toolbars/hooks/Size.js +118 -0
- package/src/toolbars/hooks/Split.js +37 -0
- package/src/toolbars/hooks/Strikethrough.js +71 -0
- package/src/toolbars/hooks/Sub.js +58 -0
- package/src/toolbars/hooks/Sup.js +58 -0
- package/src/toolbars/hooks/SwitchModel.js +56 -0
- package/src/toolbars/hooks/Table.js +56 -0
- package/src/toolbars/hooks/Theme.js +62 -0
- package/src/toolbars/hooks/Toc.js +35 -0
- package/src/toolbars/hooks/TogglePreview.js +91 -0
- package/src/toolbars/hooks/Ul.js +41 -0
- package/src/toolbars/hooks/Underline.js +68 -0
- package/src/toolbars/hooks/Undo.js +30 -0
- package/src/toolbars/hooks/Video.js +79 -0
- package/src/toolbars/hooks/Word.js +78 -0
- package/src/toolbars/hooks/WordCount.js +106 -0
- package/src/utils/autoindent.js +58 -0
- package/src/utils/cm-search-replace.js +794 -0
- package/src/utils/code-preview-language-setting.js +180 -0
- package/src/utils/codeBlockContentHandler.js +400 -0
- package/src/utils/config.js +174 -0
- package/src/utils/copy.js +55 -0
- package/src/utils/dialog.js +214 -0
- package/src/utils/dom.js +163 -0
- package/src/utils/downloadUtil.js +23 -0
- package/src/utils/env.js +22 -0
- package/src/utils/error.js +61 -0
- package/src/utils/event.js +38 -0
- package/src/utils/export.js +166 -0
- package/src/utils/file.js +164 -0
- package/src/utils/formulaUtilsHandler.js +232 -0
- package/src/utils/htmlparser.js +976 -0
- package/src/utils/image.js +99 -0
- package/src/utils/imgSizeHandler.js +279 -0
- package/src/utils/lazyLoadImg.js +327 -0
- package/src/utils/lineFeed.js +49 -0
- package/src/utils/listContentHandler.js +227 -0
- package/src/utils/lookbehind-replace.js +81 -0
- package/src/utils/mathjax.js +89 -0
- package/src/utils/myersDiff.js +211 -0
- package/src/utils/pasteHelper.js +253 -0
- package/src/utils/platformTransform.js +71 -0
- package/src/utils/recount-pos.js +59 -0
- package/src/utils/regexp.js +295 -0
- package/src/utils/sanitize.js +477 -0
- package/src/utils/selection.js +50 -0
- package/src/utils/shortcutKey.js +291 -0
- package/src/utils/svgUtils.js +96 -0
- package/src/utils/tableContentHandler.js +876 -0
- package/test/core/CommonMark.spec.ts +62 -0
- package/test/core/hooks/AutoLink.spec.ts +28 -0
- package/test/core/hooks/List.spec.ts +79 -0
- package/test/core/hooks/__snapshots__/List.spec.ts.snap +11 -0
- package/test/example.md +778 -0
- package/test/node.js +10 -0
- package/test/suites/commonmark.spec.json +5218 -0
- package/test/tsconfig.test.json +6 -0
- package/test/utils/regexp.spec.ts +28 -0
- package/types/cherry.d.ts +675 -0
- package/types/codemirror.d.ts +22 -0
- package/types/editor.d.ts +72 -0
- package/types/global.d.ts +16 -0
- package/types/menus.d.ts +24 -0
- package/types/previewer.d.ts +53 -0
- 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
|
+
}
|