@@ -8,11 +8,11 @@ Cherry Markdown Editor 是一款 Javascript Markdown 编辑器,具有开箱即
8
8
9
9
### ** 开箱即用**
10
10
11
- 开发者可以使用非常简单的方式调用并实例化Cherry Markdown编辑器,实例化的编辑器默认支持大部分常用的markdown语法 (如标题、目录、流程图、公式等)。
11
+ 开发者可以使用非常简单的方式调用并实例化 Cherry Markdown 编辑器,实例化的编辑器默认支持大部分常用的 markdown 语法 (如标题、目录、流程图、公式等)。
12
12
13
13
### ** 易于拓展**
14
14
15
- 当 Cherry Markdown 编辑器支持的语法不满足开发者需求时,可以快速的进行二次开发或功能扩展。同时,CherryMarkdown编辑器应该由纯JavaScript实现,不应该依赖angular 、vue、react等框架技术 ,框架只提供容器环境即可。
15
+ 当 Cherry Markdown 编辑器支持的语法不满足开发者需求时,可以快速的进行二次开发或功能扩展。同时,CherryMarkdown 编辑器应该由纯 JavaScript 实现,不应该依赖 angular 、vue、react 等框架技术 ,框架只提供容器环境即可。
16
16
17
17
## 特性
18
18
@@ -34,7 +34,7 @@ Cherry Markdown Editor 是一款 Javascript Markdown 编辑器,具有开箱即
34
34
35
35
### 功能特性
36
36
37
- 1 . 复制Html粘贴成MD语法
37
+ 1 . 复制 Html 粘贴成 MD 语法
38
38
2 . 经典换行&常规换行
39
39
3 . 多光标编辑
40
40
4 . 图片尺寸
@@ -49,7 +49,7 @@ Cherry Markdown Editor 是一款 Javascript Markdown 编辑器,具有开箱即
49
49
50
50
### 安全
51
51
52
- Cherry Markdown 有内置的安全 Hook,通过过滤白名单以及DomPurify进行扫描过滤 .
52
+ Cherry Markdown 有内置的安全 Hook,通过过滤白名单以及 DomPurify 进行扫描过滤 .
53
53
54
54
### 样式主题
55
55
@@ -72,8 +72,6 @@ Cherry Markdown 有多种样式主题选择
72
72
- [ 表格编辑] ( https://tencent.github.io/cherry-markdown/examples/table.html )
73
73
- [ 标题自动序号] ( https://tencent.github.io/cherry-markdown/examples/head_num.html )
74
74
75
-
76
-
77
75
## 安装
78
76
79
77
通过 yarn
110
108
<div id =" markdown-container" ></div >
111
109
<script src =" cherry-editor.min.js" ></script >
112
110
<script >
113
- new Cherry ({
114
- id: ' markdown-container' ,
115
- value: ' # welcome to cherry editor!' ,
116
- });
111
+ new Cherry ({
112
+ id: ' markdown-container' ,
113
+ value: ' # welcome to cherry editor!' ,
114
+ });
117
115
</script >
118
116
```
119
117
@@ -149,14 +147,14 @@ const cherryInstance = new Cherry({
149
147
});
150
148
```
151
149
152
- ### 引擎模式 (语法编译)
150
+ ### 引擎模式 (语法编译)
153
151
154
152
``` javascript
155
153
// 引入Cherry引擎核心构建
156
154
// 引擎配置项与Cherry通用,以下文档内容仅介绍Cherry核心包
157
155
import CherryEngine from ' cherry-markdown/dist/cherry-markdown.engine.core' ;
158
156
const cherryEngineInstance = new CherryEngine ();
159
- const htmlContent = cherryEngineInstance .makeHtml (' # welcome to cherry editor!' )
157
+ const htmlContent = cherryEngineInstance .makeHtml (' # welcome to cherry editor!' );
160
158
161
159
// --> <h1>welcome to cherry editor!</h1>
162
160
```
@@ -215,7 +213,7 @@ registerPlugin().then(() => {
215
213
216
214
### 默认配置
217
215
218
- ``` javascript
216
+ ```` javascript
219
217
{
220
218
// 第三方包
221
219
externals: {
@@ -254,6 +252,12 @@ registerPlugin().then(() => {
254
252
// 'hookName': {
255
253
//
256
254
// }
255
+ autoLink: {
256
+ /** 是否开启短链接 */
257
+ enableShortLink: true ,
258
+ /** 短链接长度 */
259
+ shortLinkLength: 20 ,
260
+ },
257
261
list: {
258
262
listNested: false , // 同级列表类型转换后变为子级
259
263
indentSpace: 2 , // 默认2个空格缩进
@@ -323,7 +327,7 @@ registerPlugin().then(() => {
323
327
codemirror: {
324
328
// depend on codemirror theme name: https://codemirror.net/demo/theme.html
325
329
// 自行导入主题文件: `import 'codemirror/theme/<theme-name>.css';`
326
- theme: ' default' ,
330
+ theme: ' default' ,
327
331
},
328
332
// 编辑器的高度,默认100%,如果挂载点存在内联设置的height则以内联样式为主
329
333
height: ' 100%' ,
@@ -391,13 +395,13 @@ registerPlugin().then(() => {
391
395
// 外层容器不存在时,是否强制输出到body上
392
396
forceAppend: true ,
393
397
}
394
- ```
398
+ ````
395
399
396
400
### 关闭浮动菜单和气泡菜单
397
401
398
402
``` javascript
399
403
toolbars: {
400
- ... // other config
404
+ ... // other config
401
405
bubble: false , // array or false
402
406
float: false , // array or false
403
407
},
@@ -413,13 +417,15 @@ registerPlugin().then(() => {
413
417
点击查看 [ examples] ( ./examples/ )
414
418
415
419
### 客户端
420
+
416
421
[ cherry-markdown 桌面客户端] ( ./docs/cherry_editor_client.CN.md )
417
422
418
423
## 拓展
419
424
420
425
### 自定义语法
421
426
422
427
#### sentence Syntax
428
+
423
429
如果编译内容没有额外特殊要求,使用普通语法
424
430
425
431
``` javascript
@@ -445,20 +451,21 @@ new Cherry({
445
451
customSyntax: {
446
452
// 注入编辑器的自定义语法中
447
453
BlockSensitiveWordsHook: {
448
- syntaxClass: BlockSensitiveWordsHook,
449
- // 有同名hook则强制覆盖
450
- force: true ,
451
- // 在处理图片的hook之前调用
452
- // before: 'image',
454
+ syntaxClass: BlockSensitiveWordsHook,
455
+ // 有同名hook则强制覆盖
456
+ force: true ,
457
+ // 在处理图片的hook之前调用
458
+ // before: 'image',
453
459
},
454
460
},
455
461
},
456
462
});
457
463
```
458
464
459
-
460
465
#### paragraph Syntax
466
+
461
467
如果编译内容要求不受外界影响,则使用段落语法
468
+
462
469
``` javascript
463
470
/*
464
471
* 生成一个屏蔽敏感词汇的hook
@@ -471,11 +478,11 @@ let BlockSensitiveWordsHook = Cherry.createSyntaxHook('blockSensitiveWords', Che
471
478
// 预处理文本,避免受影响
472
479
beforeMakeHtml (str ) {
473
480
return str .replace (this .RULE .reg , (match , code ) => {
474
- const lineCount = (match .match (/ \n / g ) || []).length ;
475
- const sign = this .$engine .md5 (match);
476
- const html = ` <div data-sign="${ sign} " data-lines="${ lineCount + 1 } " >***</div>` ;
477
- return this .pushCache (html, sign, lineCount);
478
- })
481
+ const lineCount = (match .match (/ \n / g ) || []).length ;
482
+ const sign = this .$engine .md5 (match);
483
+ const html = ` <div data-sign="${ sign} " data-lines="${ lineCount + 1 } " >***</div>` ;
484
+ return this .pushCache (html, sign, lineCount);
485
+ });
479
486
},
480
487
makeHtml (str , sentenceMakeFunc ) {
481
488
return str;
@@ -493,11 +500,11 @@ new Cherry({
493
500
customSyntax: {
494
501
// 注入编辑器的自定义语法中
495
502
BlockSensitiveWordsHook: {
496
- syntaxClass: BlockSensitiveWordsHook,
497
- // 有同名hook则强制覆盖
498
- force: true ,
499
- // 在处理图片的hook之前调用
500
- // before: 'image',
503
+ syntaxClass: BlockSensitiveWordsHook,
504
+ // 有同名hook则强制覆盖
505
+ force: true ,
506
+ // 在处理图片的hook之前调用
507
+ // before: 'image',
501
508
},
502
509
},
503
510
},
@@ -508,10 +515,10 @@ new Cherry({
508
515
509
516
``` javascript
510
517
/*
511
- * 生成一个添加前缀模板的hook
512
- * 名字叫AddPrefixTemplate
513
- * 图标类名icon-add-prefix
514
- */
518
+ * 生成一个添加前缀模板的hook
519
+ * 名字叫AddPrefixTemplate
520
+ * 图标类名icon-add-prefix
521
+ */
515
522
let AddPrefixTemplate = Cherry .createMenuHook (' AddPrefixTemplate' , ' icon-add-prefix' , {
516
523
onClick (selection ) {
517
524
return ' Prefix-' + selection;
@@ -529,11 +536,15 @@ new Cherry({
529
536
' addPrefix' , // 在顶部菜单栏的尾部添加自定义菜单项
530
537
],
531
538
bubble: [
532
- ' bold' , /** ...其他菜单项 */ , ' color' ,
539
+ ' bold' /** ...其他菜单项 */ ,
540
+ ,
541
+ ' color' ,
533
542
' addPrefix' , // 在气泡菜单(选中文本时出现)的尾部添加自定义菜单项
534
543
], // array or false
535
544
float: [
536
- ' h1' , /** ...其他菜单项 */ , ' code' ,
545
+ ' h1' /** ...其他菜单项 */ ,
546
+ ,
547
+ ' code' ,
537
548
' addPrefix' , // 在浮动菜单(在新的空行出现)的尾部添加自定义菜单项
538
549
], // array or false
539
550
customMenu: {
@@ -547,7 +558,6 @@ new Cherry({
547
558
548
559
如果你想看更多有关 cherry markdown 的拓展信息,可以看这里 [ extensions] ( ./docs/extensions.CN.md ) .
549
560
550
-
551
561
## 单元测试
552
562
553
563
选用 Jest 作为单元测试工具,主要看好其断言、支持异步和快照测试等功能。单元测试分为两个部分,CommonMark 用例测试和快照测试。
@@ -557,6 +567,7 @@ new Cherry({
557
567
运行 ` yarn run test:commonmark ` 测试 CommonMark 官方用例,运行速度较快。
558
568
559
569
用例位于 ` test/suites/commonmark.spec.json ` , 比如:
570
+
560
571
``` json
561
572
{
562
573
"markdown" : " \t foo\t baz\t\t bim\n " ,
@@ -567,7 +578,8 @@ new Cherry({
567
578
"section" : " Tabs"
568
579
},
569
580
```
570
- 对于这个测试点,Jest 会比对 ` Cherry.makeHtml(" \tfoo\tbaz\t\tbim\n") ` 生成的 html 与用例中的预期结果 ` "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n" ` 。Cherry Markdown 的匹配器已忽略 ` data-line ` 等私有属性。
581
+
582
+ 对于这个测试点,Jest 会比对 ` Cherry.makeHtml(" \tfoo\tbaz\t\tbim\n") ` 生成的 html 与用例中的预期结果 ` "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n" ` 。Cherry Markdown 的匹配器已忽略 ` data-line ` 等私有属性。
571
583
572
584
CommonMark 规范及测试用例可参考:https://spec.commonmark.org/ 。
573
585
@@ -577,10 +589,9 @@ CommonMark 规范及测试用例可参考:https://spec.commonmark.org/ 。
577
589
578
590
快照测试运行速度较慢,仅在易出错且包含 Cherry 特色语法的 Hook 上使用。
579
591
580
-
581
592
## Contributing
582
593
583
- 欢迎加入我们打造强大的 Markdown 编辑器。当然你也可以给我们提交特性需求的 issue。 在写特性功能之前,你需要了解 [ extensions] ( ./docs/extensions.CN.md ) 以及 [ commit_convention] ( ./docs/commit_convention.CN.md ) .
594
+ 欢迎加入我们打造强大的 Markdown 编辑器。当然你也可以给我们提交特性需求的 issue。 在写特性功能之前,你需要了解 [ extensions] ( ./docs/extensions.CN.md ) 以及 [ commit_convention] ( ./docs/commit_convention.CN.md ) .
584
595
585
596
## License
586
597
0 commit comments