cherry-muse 1.0.1
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/LICENSE +162 -0
- package/README.md +139 -0
- package/dist/addons/cherry-code-block-card-plugin.js +1 -0
- package/dist/addons/cherry-code-block-echarts-plugin.js +1 -0
- package/dist/addons/cherry-code-block-mermaid-plugin.js +1 -0
- package/dist/cherry-markdown.core.common.js +1 -0
- package/dist/cherry-markdown.core.js +1 -0
- package/dist/cherry-markdown.css +4089 -0
- package/dist/cherry-markdown.engine.core.common.js +1 -0
- package/dist/cherry-markdown.engine.core.esm.js +1 -0
- package/dist/cherry-markdown.engine.core.js +1 -0
- package/dist/cherry-markdown.esm.js +1 -0
- package/dist/cherry-markdown.js +70837 -0
- package/dist/cherry-markdown.js.map +1 -0
- package/dist/cherry-markdown.min.css +1 -0
- package/dist/cherry-markdown.min.js +1 -0
- package/dist/stats.html +4838 -0
- package/examples/scripts/pinyin/README.md +53 -0
- package/package.json +167 -0
- package/src/Cherry.config.js +411 -0
- package/src/Cherry.js +788 -0
- package/src/CherryStatic.js +70 -0
- package/src/Editor.js +746 -0
- package/src/Engine.js +334 -0
- package/src/Event.js +74 -0
- package/src/Factory.js +180 -0
- package/src/Logger.js +31 -0
- package/src/Previewer.js +1147 -0
- package/src/Sanitizer.js +4 -0
- package/src/Sanitizer.node.js +7 -0
- package/src/Stats.js +101 -0
- package/src/Theme.js +46 -0
- package/src/UrlCache.js +98 -0
- package/src/addons/cherry-code-block-card-plugin.js +213 -0
- package/src/addons/cherry-code-block-echarts-plugin.js +161 -0
- package/src/addons/cherry-code-block-mermaid-plugin.js +118 -0
- package/src/core/HookCenter.js +303 -0
- package/src/core/HooksConfig.js +106 -0
- package/src/core/ParagraphBase.js +314 -0
- package/src/core/SentenceBase.js +65 -0
- package/src/core/SyntaxBase.js +197 -0
- package/src/core/hooks/AutoLink.js +251 -0
- package/src/core/hooks/BackgroundColor.js +46 -0
- package/src/core/hooks/Badge.js +100 -0
- package/src/core/hooks/Blockquote.js +113 -0
- package/src/core/hooks/Br.js +85 -0
- package/src/core/hooks/CodeBlock.js +876 -0
- package/src/core/hooks/Color.js +78 -0
- package/src/core/hooks/CommentReference.js +96 -0
- package/src/core/hooks/Detail.js +138 -0
- package/src/core/hooks/Emoji.config.js +9388 -0
- package/src/core/hooks/Emoji.js +223 -0
- package/src/core/hooks/Emphasis.js +113 -0
- package/src/core/hooks/Footnote.js +125 -0
- package/src/core/hooks/FrontMatter.js +52 -0
- package/src/core/hooks/FrontMatterVars.js +82 -0
- package/src/core/hooks/Header.js +229 -0
- package/src/core/hooks/HighLight.js +37 -0
- package/src/core/hooks/Hr.js +52 -0
- package/src/core/hooks/HtmlBlock.js +159 -0
- package/src/core/hooks/Iframe.js +80 -0
- package/src/core/hooks/Image.js +276 -0
- package/src/core/hooks/InlineCode.js +45 -0
- package/src/core/hooks/InlineMath.js +142 -0
- package/src/core/hooks/Link.js +169 -0
- package/src/core/hooks/List.js +260 -0
- package/src/core/hooks/Mark.js +55 -0
- package/src/core/hooks/MathBlock.js +97 -0
- package/src/core/hooks/Panel.js +170 -0
- package/src/core/hooks/Paragraph.js +84 -0
- package/src/core/hooks/Ruby.js +34 -0
- package/src/core/hooks/Size.js +84 -0
- package/src/core/hooks/Strikethrough.js +54 -0
- package/src/core/hooks/Sub.js +47 -0
- package/src/core/hooks/SuggestList.js +317 -0
- package/src/core/hooks/Suggester.js +759 -0
- package/src/core/hooks/Sup.js +47 -0
- package/src/core/hooks/Table.js +315 -0
- package/src/core/hooks/Toc.js +290 -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 +62 -0
- package/src/index.engine.js +30 -0
- package/src/index.js +28 -0
- package/src/locales/index.js +21 -0
- package/src/locales/zh_CN.js +170 -0
- package/src/sass/cherry.scss +122 -0
- package/src/sass/components/bubble.scss +122 -0
- package/src/sass/components/codemirror.scss +628 -0
- package/src/sass/components/dropdown.scss +37 -0
- package/src/sass/components/editor.scss +78 -0
- package/src/sass/components/preview.scss +71 -0
- package/src/sass/components/prism.scss +142 -0
- package/src/sass/components/stats.scss +32 -0
- package/src/sass/components/toc.scss +184 -0
- package/src/sass/components/toolbar.scss +117 -0
- package/src/sass/core/AutoLink.scss +20 -0
- package/src/sass/core/BackgroundColor.scss +0 -0
- package/src/sass/core/Badge.scss +116 -0
- package/src/sass/core/Blockquote.scss +12 -0
- package/src/sass/core/Br.scss +0 -0
- package/src/sass/core/Card.scss +219 -0
- package/src/sass/core/CodeBlock.scss +205 -0
- package/src/sass/core/Color.scss +37 -0
- package/src/sass/core/CommentReference.scss +0 -0
- package/src/sass/core/Detail.scss +107 -0
- package/src/sass/core/Emoji.scss +127 -0
- package/src/sass/core/Emphasis.scss +9 -0
- package/src/sass/core/Footnote.scss +21 -0
- package/src/sass/core/FrontMatterVars.scss +19 -0
- package/src/sass/core/Header.scss +103 -0
- package/src/sass/core/HighLight.scss +0 -0
- package/src/sass/core/Hr.scss +10 -0
- package/src/sass/core/HtmlBlock.scss +0 -0
- package/src/sass/core/Iframe.scss +36 -0
- package/src/sass/core/Image.scss +59 -0
- package/src/sass/core/InlineCode.scss +10 -0
- package/src/sass/core/InlineMath.scss +11 -0
- package/src/sass/core/Link.scss +16 -0
- package/src/sass/core/List.scss +61 -0
- package/src/sass/core/Mark.scss +15 -0
- package/src/sass/core/MathBlock.scss +0 -0
- package/src/sass/core/Panel.scss +150 -0
- package/src/sass/core/Paragraph.scss +6 -0
- package/src/sass/core/Ruby.scss +0 -0
- package/src/sass/core/Size.scss +8 -0
- package/src/sass/core/Strikethrough.scss +0 -0
- package/src/sass/core/Sub.scss +5 -0
- package/src/sass/core/Suggester.scss +62 -0
- package/src/sass/core/Sup.scss +5 -0
- package/src/sass/core/Table.scss +127 -0
- package/src/sass/core/Toc.scss +28 -0
- package/src/sass/core/Transfer.scss +0 -0
- package/src/sass/core/Underline.scss +0 -0
- package/src/sass/google-fonts.scss +34 -0
- package/src/sass/index.scss +3 -0
- package/src/sass/prism/dark.scss +131 -0
- package/src/sass/prism/light.scss +143 -0
- package/src/sass/variables/colors.scss +96 -0
- package/src/toolbars/Bubble.js +232 -0
- package/src/toolbars/BubbleTable.js +147 -0
- package/src/toolbars/HookCenter.js +185 -0
- package/src/toolbars/MenuBase.js +357 -0
- package/src/toolbars/PreviewerBubble.js +558 -0
- package/src/toolbars/Toc.js +246 -0
- package/src/toolbars/Toolbar.js +401 -0
- package/src/toolbars/hooks/Audio.js +53 -0
- package/src/toolbars/hooks/Badge.js +80 -0
- package/src/toolbars/hooks/BarTable.js +41 -0
- package/src/toolbars/hooks/Bold.js +70 -0
- package/src/toolbars/hooks/Br.js +34 -0
- package/src/toolbars/hooks/Card.js +64 -0
- package/src/toolbars/hooks/CheckList.js +41 -0
- package/src/toolbars/hooks/Code.js +46 -0
- package/src/toolbars/hooks/Color.js +285 -0
- package/src/toolbars/hooks/Copy.js +139 -0
- package/src/toolbars/hooks/Detail.js +70 -0
- package/src/toolbars/hooks/ECharts.js +303 -0
- package/src/toolbars/hooks/Emoji.js +303 -0
- package/src/toolbars/hooks/Export.js +47 -0
- package/src/toolbars/hooks/File.js +54 -0
- package/src/toolbars/hooks/Formula.js +36 -0
- package/src/toolbars/hooks/FullScreen.js +55 -0
- package/src/toolbars/hooks/Graph.js +281 -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 +100 -0
- package/src/toolbars/hooks/Hr.js +35 -0
- package/src/toolbars/hooks/Iframe.js +35 -0
- package/src/toolbars/hooks/Image.js +60 -0
- package/src/toolbars/hooks/Insert.js +36 -0
- package/src/toolbars/hooks/Italic.js +70 -0
- package/src/toolbars/hooks/LineTable.js +41 -0
- package/src/toolbars/hooks/Link.js +46 -0
- package/src/toolbars/hooks/List.js +55 -0
- package/src/toolbars/hooks/Ol.js +41 -0
- package/src/toolbars/hooks/Panel.js +155 -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/Size.js +100 -0
- package/src/toolbars/hooks/Split.js +37 -0
- package/src/toolbars/hooks/Strikethrough.js +65 -0
- package/src/toolbars/hooks/Sub.js +58 -0
- package/src/toolbars/hooks/Sup.js +58 -0
- package/src/toolbars/hooks/SwitchModel.js +78 -0
- package/src/toolbars/hooks/Table.js +56 -0
- package/src/toolbars/hooks/Toc.js +35 -0
- package/src/toolbars/hooks/TogglePreview.js +79 -0
- package/src/toolbars/hooks/Ul.js +41 -0
- package/src/toolbars/hooks/Underline.js +65 -0
- package/src/toolbars/hooks/Undo.js +30 -0
- package/src/toolbars/hooks/Video.js +53 -0
- package/src/utils/LazyLoadImg.js +341 -0
- package/src/utils/autoindent.js +58 -0
- package/src/utils/codeBlockContentHandler.js +351 -0
- package/src/utils/config.js +98 -0
- package/src/utils/copy.js +55 -0
- package/src/utils/dialog.js +196 -0
- package/src/utils/dom.js +162 -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 +115 -0
- package/src/utils/file.js +121 -0
- package/src/utils/formulaUtilsHandler.js +230 -0
- package/src/utils/htmlparser.js +977 -0
- package/src/utils/image.js +99 -0
- package/src/utils/imgSizeHandler.js +279 -0
- package/src/utils/jsonUtils.js +17 -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/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/svgUtils.js +96 -0
- package/src/utils/tableContentHandler.js +592 -0
- package/tools/README.md +3 -0
|
@@ -0,0 +1,139 @@
|
|
|
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 { copyToClip } from '@/utils/copy';
|
|
18
|
+
/**
|
|
19
|
+
* 复制按钮,用来复制预览区的html内容
|
|
20
|
+
* 该操作会将预览区的css样式以行内样式的形式插入到html内容里,从而保证粘贴时样式一致
|
|
21
|
+
*/
|
|
22
|
+
export default class Copy extends MenuBase {
|
|
23
|
+
constructor($cherry) {
|
|
24
|
+
super($cherry);
|
|
25
|
+
this.previewer = $cherry.previewer;
|
|
26
|
+
this.isLoading = false;
|
|
27
|
+
this.updateMarkdown = false;
|
|
28
|
+
this.setName('copy', 'content_copy');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async adaptWechat(rawHtml) {
|
|
32
|
+
// 转化链接
|
|
33
|
+
// Array.from(document.querySelectorAll('a')).forEach((item) => {
|
|
34
|
+
// item.removeAttribute('href');
|
|
35
|
+
// });
|
|
36
|
+
// 防止echarts标签被转成p时丢失样式
|
|
37
|
+
const figureRegex = /(<figure data-lines=.+?<)div(.+?<\/)div(>.*?<\/figure>)/g;
|
|
38
|
+
const html = rawHtml.replace(figureRegex, (match, prefix, content, suffix) => {
|
|
39
|
+
return `${prefix}p${content}p${suffix}`;
|
|
40
|
+
});
|
|
41
|
+
// 图片转base64,防止无法自动上传
|
|
42
|
+
const imgRegex = /(<img.+?src=")(.+?)(".*?>)/g;
|
|
43
|
+
/** @type {(Promise<string>)[]} */
|
|
44
|
+
const promises = [];
|
|
45
|
+
html.replace(imgRegex, (match, prefix, src) => {
|
|
46
|
+
promises.push(convertImgToBase64(src));
|
|
47
|
+
});
|
|
48
|
+
const urls = await Promise.all(promises);
|
|
49
|
+
return html.replace(imgRegex, (match, prefix, src, suffix) => prefix + urls.shift() + suffix);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
getStyleFromSheets(keyword) {
|
|
53
|
+
const sheets = Array.from(document.styleSheets).filter(
|
|
54
|
+
(item) => item.cssRules[0] && item.cssRules[0].cssText.indexOf(keyword) > -1,
|
|
55
|
+
);
|
|
56
|
+
return `<style>${sheets.reduce((html, sheet) => {
|
|
57
|
+
return html + Array.from(sheet.cssRules).reduce((html, rule) => html + rule.cssText, '');
|
|
58
|
+
}, '')}</style>`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
computeStyle() {
|
|
62
|
+
// 计算需要append进富文本的style
|
|
63
|
+
const mathStyle = this.getStyleFromSheets('mjx-container');
|
|
64
|
+
const cherryStyle = this.getStyleFromSheets('cherry');
|
|
65
|
+
const echartStyle =
|
|
66
|
+
'<style>figure>p{overflow:hidden;position:relative;width:500px;height:300px;background:transparent;}</style>';
|
|
67
|
+
return {
|
|
68
|
+
mathStyle,
|
|
69
|
+
echartStyle,
|
|
70
|
+
cherryStyle,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 由于复制操作会随着预览区域的内容增加而耗时变长,所以需要增加“正在复制”的状态回显
|
|
76
|
+
* 同时该状态也用于限频
|
|
77
|
+
*/
|
|
78
|
+
toggleLoading() {
|
|
79
|
+
// 切换loading状态
|
|
80
|
+
if (this.isLoading) {
|
|
81
|
+
this.dom.lastElementChild.outerHTML = this.lastIconOuterHtml;
|
|
82
|
+
this.lastIconOuterHtml = '';
|
|
83
|
+
} else {
|
|
84
|
+
this.lastIconOuterHtml = this.dom.lastElementChild.outerHTML;
|
|
85
|
+
this.dom.lastElementChild.outerHTML = '<div class="icon-loading loading"></div>';
|
|
86
|
+
}
|
|
87
|
+
this.isLoading = !this.isLoading;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 响应点击事件
|
|
92
|
+
* 该按钮不会引发编辑区域的内容改动,所以不用处理用户在编辑区域的选中内容
|
|
93
|
+
* @param {Event} e 点击事件
|
|
94
|
+
*/
|
|
95
|
+
onClick(e) {
|
|
96
|
+
this.toggleLoading();
|
|
97
|
+
const inlineCodeTheme = document.querySelector('.cherry').getAttribute('data-inline-code-theme');
|
|
98
|
+
const codeBlockTheme = document.querySelector('.cherry').getAttribute('data-code-block-theme');
|
|
99
|
+
const { mathStyle, echartStyle, cherryStyle } = this.computeStyle();
|
|
100
|
+
const html = this.previewer.isPreviewerHidden()
|
|
101
|
+
? this.previewer.options.previewerCache.html
|
|
102
|
+
: this.previewer.getValue();
|
|
103
|
+
// 将css样式以行内样式的形式插入到html内容里
|
|
104
|
+
this.adaptWechat(html).then((html) => {
|
|
105
|
+
copyToClip(
|
|
106
|
+
`${mathStyle + echartStyle + cherryStyle}
|
|
107
|
+
<div data-inline-code-theme="${inlineCodeTheme}" data-code-block-theme="${codeBlockTheme}">
|
|
108
|
+
<div class="cherry-markdown">${html}</div>
|
|
109
|
+
</div>`,
|
|
110
|
+
);
|
|
111
|
+
this.toggleLoading();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* 将图片转成base64,防止出现由于图片防盗链功能导致图裂的情况
|
|
118
|
+
* @param {string} url 图片的地址
|
|
119
|
+
* @param {Function} [callback] 回调函数,本函数不处理该参数
|
|
120
|
+
* @param {string} [outputFormat]
|
|
121
|
+
* @returns {Promise<string>} img node
|
|
122
|
+
*/
|
|
123
|
+
function convertImgToBase64(url, callback, outputFormat) {
|
|
124
|
+
return new Promise((resolve) => {
|
|
125
|
+
let canvas = /** @type {HTMLCanvasElement}*/ (document.createElement('CANVAS'));
|
|
126
|
+
const ctx = canvas.getContext('2d');
|
|
127
|
+
const img = new Image();
|
|
128
|
+
img.crossOrigin = 'Anonymous';
|
|
129
|
+
img.onload = function () {
|
|
130
|
+
canvas.height = img.height;
|
|
131
|
+
canvas.width = img.width;
|
|
132
|
+
ctx.drawImage(img, 0, 0);
|
|
133
|
+
const dataURL = canvas.toDataURL(outputFormat || 'image/png');
|
|
134
|
+
resolve(dataURL);
|
|
135
|
+
canvas = null;
|
|
136
|
+
};
|
|
137
|
+
img.src = url;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
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 { getDetailRule } from '@/utils/regexp';
|
|
18
|
+
import { getSelection } from '@/utils/selection';
|
|
19
|
+
/**
|
|
20
|
+
* 插入手风琴
|
|
21
|
+
*/
|
|
22
|
+
export default class Detail extends MenuBase {
|
|
23
|
+
constructor($cherry) {
|
|
24
|
+
super($cherry);
|
|
25
|
+
this.setName('detail', 'more_horiz');
|
|
26
|
+
this.detailRule = getDetailRule().reg;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 响应点击事件
|
|
31
|
+
* @param {string} selection 被用户选中的文本内容
|
|
32
|
+
* @returns {string} 回填到编辑器光标位置/选中文本区域的内容
|
|
33
|
+
*/
|
|
34
|
+
onClick(selection) {
|
|
35
|
+
let $selection =
|
|
36
|
+
getSelection(this.editor.editor, selection, 'line', true) ||
|
|
37
|
+
'点击展开更多\n内容\n++- 默认展开\n内容\n++ 默认收起\n内容';
|
|
38
|
+
this.detailRule.lastIndex = 0;
|
|
39
|
+
if (!this.detailRule.test($selection)) {
|
|
40
|
+
// 如果没有命中手风琴语法,则尝试扩大选区
|
|
41
|
+
this.getMoreSelection('+++ ', '\n', () => {
|
|
42
|
+
const newSelection = this.editor.editor.getSelection();
|
|
43
|
+
this.detailRule.lastIndex = 0;
|
|
44
|
+
const isMatch = this.detailRule.test(newSelection);
|
|
45
|
+
if (isMatch !== false) {
|
|
46
|
+
$selection = newSelection;
|
|
47
|
+
}
|
|
48
|
+
return isMatch !== false;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
this.detailRule.lastIndex = 0;
|
|
52
|
+
if (this.detailRule.test($selection)) {
|
|
53
|
+
// 如果命中了手风琴语法,则去掉手风琴语法
|
|
54
|
+
this.detailRule.lastIndex = 0;
|
|
55
|
+
return $selection.replace(this.detailRule, (match, preLines, isOpen, title, content) => {
|
|
56
|
+
return `${title}\n${content}`;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// 去掉开头的空格
|
|
60
|
+
$selection = $selection.replace(/^\s+/, '');
|
|
61
|
+
// 如果选中的内容不包含换行,则强制增加一个换行
|
|
62
|
+
if (!/\n/.test($selection)) {
|
|
63
|
+
$selection = `${$selection}\n${$selection}`;
|
|
64
|
+
}
|
|
65
|
+
this.registerAfterClickCb(() => {
|
|
66
|
+
this.setLessSelection('+++ ', '\n');
|
|
67
|
+
});
|
|
68
|
+
return `+++ ${$selection}\n+++`.replace(/\n{2,}\+\+\+/g, '\n+++');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,303 @@
|
|
|
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 ECharts extends MenuBase {
|
|
21
|
+
constructor($cherry) {
|
|
22
|
+
super($cherry);
|
|
23
|
+
this.setName('echarts', 'insert_chart');
|
|
24
|
+
this.subMenuConfig = [
|
|
25
|
+
{
|
|
26
|
+
name: 'basicBarChart',
|
|
27
|
+
iconName: 'bar_chart',
|
|
28
|
+
onclick: this.bindSubClick.bind(this, {
|
|
29
|
+
xAxis: {
|
|
30
|
+
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
|
|
31
|
+
},
|
|
32
|
+
yAxis: {},
|
|
33
|
+
series: [
|
|
34
|
+
{
|
|
35
|
+
type: 'bar',
|
|
36
|
+
data: [23, 24, 18, 25, 27, 28, 25],
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
}),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'stackedBarChart',
|
|
43
|
+
iconName: 'stacked_bar_chart',
|
|
44
|
+
onclick: this.bindSubClick.bind(this, {
|
|
45
|
+
xAxis: {
|
|
46
|
+
data: ['A', 'B', 'C', 'D', 'E'],
|
|
47
|
+
},
|
|
48
|
+
yAxis: {},
|
|
49
|
+
series: [
|
|
50
|
+
{
|
|
51
|
+
data: [10, 22, 28, 43, 49],
|
|
52
|
+
type: 'bar',
|
|
53
|
+
stack: 'x',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
data: [5, 4, 3, 5, 10],
|
|
57
|
+
type: 'bar',
|
|
58
|
+
stack: 'x',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
}),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'basicLineChart',
|
|
65
|
+
iconName: 'show_chart',
|
|
66
|
+
onclick: this.bindSubClick.bind(this, {
|
|
67
|
+
xAxis: {
|
|
68
|
+
type: 'category',
|
|
69
|
+
data: ['A', 'B', 'C'],
|
|
70
|
+
},
|
|
71
|
+
yAxis: {
|
|
72
|
+
type: 'value',
|
|
73
|
+
},
|
|
74
|
+
series: [
|
|
75
|
+
{
|
|
76
|
+
data: [120, 200, 150],
|
|
77
|
+
type: 'line',
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
}),
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'stackedLineChart',
|
|
84
|
+
|
|
85
|
+
iconName: 'stacked_line_chart',
|
|
86
|
+
onclick: this.bindSubClick.bind(this, {
|
|
87
|
+
xAxis: {
|
|
88
|
+
data: ['A', 'B', 'C', 'D', 'E'],
|
|
89
|
+
},
|
|
90
|
+
yAxis: {},
|
|
91
|
+
series: [
|
|
92
|
+
{
|
|
93
|
+
data: [10, 22, 28, 43, 49],
|
|
94
|
+
type: 'line',
|
|
95
|
+
stack: 'x',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
data: [5, 4, 3, 5, 10],
|
|
99
|
+
type: 'line',
|
|
100
|
+
stack: 'x',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
}),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'areaChart',
|
|
107
|
+
|
|
108
|
+
iconName: 'area_chart',
|
|
109
|
+
onclick: this.bindSubClick.bind(this, {
|
|
110
|
+
xAxis: {
|
|
111
|
+
data: ['A', 'B', 'C', 'D', 'E'],
|
|
112
|
+
},
|
|
113
|
+
yAxis: {},
|
|
114
|
+
series: [
|
|
115
|
+
{
|
|
116
|
+
data: [10, 22, 28, 23, 19],
|
|
117
|
+
type: 'line',
|
|
118
|
+
areaStyle: {},
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
data: [25, 14, 23, 35, 10],
|
|
122
|
+
type: 'line',
|
|
123
|
+
areaStyle: {
|
|
124
|
+
color: '#ff0',
|
|
125
|
+
opacity: 0.5,
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
}),
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'smoothCurveChart',
|
|
133
|
+
iconName: 'multiline_chart',
|
|
134
|
+
onclick: this.bindSubClick.bind(this, {
|
|
135
|
+
xAxis: {
|
|
136
|
+
data: ['A', 'B', 'C', 'D', 'E'],
|
|
137
|
+
},
|
|
138
|
+
yAxis: {},
|
|
139
|
+
series: [
|
|
140
|
+
{
|
|
141
|
+
data: [10, 22, 28, 23, 19],
|
|
142
|
+
type: 'line',
|
|
143
|
+
smooth: true,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
}),
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: 'ladderLineDiagram',
|
|
150
|
+
iconName: 'waterfall_chart',
|
|
151
|
+
onclick: this.bindSubClick.bind(this, {
|
|
152
|
+
xAxis: {
|
|
153
|
+
type: 'category',
|
|
154
|
+
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
|
|
155
|
+
},
|
|
156
|
+
yAxis: {
|
|
157
|
+
type: 'value',
|
|
158
|
+
},
|
|
159
|
+
series: [
|
|
160
|
+
{
|
|
161
|
+
name: 'Step Start',
|
|
162
|
+
type: 'line',
|
|
163
|
+
step: 'start',
|
|
164
|
+
data: [120, 132, 101, 134, 90, 230, 210],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'Step Middle',
|
|
168
|
+
type: 'line',
|
|
169
|
+
step: 'middle',
|
|
170
|
+
data: [220, 282, 201, 234, 290, 430, 410],
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: 'Step End',
|
|
174
|
+
type: 'line',
|
|
175
|
+
step: 'end',
|
|
176
|
+
data: [450, 432, 401, 454, 590, 530, 510],
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
}),
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'pieChart',
|
|
183
|
+
|
|
184
|
+
iconName: 'pie_chart',
|
|
185
|
+
onclick: this.bindSubClick.bind(this, {
|
|
186
|
+
series: [
|
|
187
|
+
{
|
|
188
|
+
type: 'pie',
|
|
189
|
+
data: [
|
|
190
|
+
{
|
|
191
|
+
value: 335,
|
|
192
|
+
name: '直接访问',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
value: 234,
|
|
196
|
+
name: '联盟广告',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
value: 1548,
|
|
200
|
+
name: '搜索引擎',
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
}),
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: 'circleDiagram',
|
|
209
|
+
|
|
210
|
+
iconName: 'donut_large',
|
|
211
|
+
onclick: this.bindSubClick.bind(this, {
|
|
212
|
+
title: {
|
|
213
|
+
text: '圆环图的例子',
|
|
214
|
+
left: 'center',
|
|
215
|
+
top: 'center',
|
|
216
|
+
},
|
|
217
|
+
series: [
|
|
218
|
+
{
|
|
219
|
+
type: 'pie',
|
|
220
|
+
data: [
|
|
221
|
+
{
|
|
222
|
+
value: 335,
|
|
223
|
+
name: 'A',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
value: 234,
|
|
227
|
+
name: 'B',
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
value: 1548,
|
|
231
|
+
name: 'C',
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
radius: ['40%', '70%'],
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
}),
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
name: 'roseChart',
|
|
241
|
+
|
|
242
|
+
iconName: 'donut_small',
|
|
243
|
+
onclick: this.bindSubClick.bind(this, {
|
|
244
|
+
series: [
|
|
245
|
+
{
|
|
246
|
+
type: 'pie',
|
|
247
|
+
data: [
|
|
248
|
+
{
|
|
249
|
+
value: 100,
|
|
250
|
+
name: 'A',
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
value: 200,
|
|
254
|
+
name: 'B',
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
value: 300,
|
|
258
|
+
name: 'C',
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
value: 400,
|
|
262
|
+
name: 'D',
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
value: 500,
|
|
266
|
+
name: 'E',
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
roseType: 'area',
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
}),
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: 'scatterPlot',
|
|
276
|
+
|
|
277
|
+
iconName: 'scatter_plot',
|
|
278
|
+
onclick: this.bindSubClick.bind(this, {
|
|
279
|
+
xAxis: {
|
|
280
|
+
data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
|
281
|
+
},
|
|
282
|
+
yAxis: {},
|
|
283
|
+
series: [
|
|
284
|
+
{
|
|
285
|
+
type: 'scatter',
|
|
286
|
+
data: [220, 182, 191, 234, 290, 330, 310],
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
}),
|
|
290
|
+
},
|
|
291
|
+
];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* 响应点击事件
|
|
296
|
+
* @param {string} selection 被用户选中的文本内容
|
|
297
|
+
|
|
298
|
+
* @returns {string} 回填到编辑器光标位置/选中文本区域的内容
|
|
299
|
+
*/
|
|
300
|
+
onClick(selection, shortKey) {
|
|
301
|
+
return `\`\`\`echarts\n${JSON.stringify(shortKey, null, 2)}\n\`\`\`\n`;
|
|
302
|
+
}
|
|
303
|
+
}
|