@@ -8,11 +8,11 @@ Cherry Markdown Editor 是一款 Javascript Markdown 编辑器,具有开箱即
88
99### ** 开箱即用**
1010
11- 开发者可以使用非常简单的方式调用并实例化Cherry Markdown编辑器,实例化的编辑器默认支持大部分常用的markdown语法 (如标题、目录、流程图、公式等)。
11+ 开发者可以使用非常简单的方式调用并实例化 Cherry Markdown 编辑器,实例化的编辑器默认支持大部分常用的 markdown 语法 (如标题、目录、流程图、公式等)。
1212
1313### ** 易于拓展**
1414
15- 当 Cherry Markdown 编辑器支持的语法不满足开发者需求时,可以快速的进行二次开发或功能扩展。同时,CherryMarkdown编辑器应该由纯JavaScript实现,不应该依赖angular 、vue、react等框架技术 ,框架只提供容器环境即可。
15+ 当 Cherry Markdown 编辑器支持的语法不满足开发者需求时,可以快速的进行二次开发或功能扩展。同时,CherryMarkdown 编辑器应该由纯 JavaScript 实现,不应该依赖 angular 、vue、react 等框架技术 ,框架只提供容器环境即可。
1616
1717## 特性
1818
@@ -34,7 +34,7 @@ Cherry Markdown Editor 是一款 Javascript Markdown 编辑器,具有开箱即
3434
3535### 功能特性
3636
37- 1 . 复制Html粘贴成MD语法
37+ 1 . 复制 Html 粘贴成 MD 语法
38382 . 经典换行&常规换行
39393 . 多光标编辑
40404 . 图片尺寸
@@ -49,7 +49,7 @@ Cherry Markdown Editor 是一款 Javascript Markdown 编辑器,具有开箱即
4949
5050### 安全
5151
52- Cherry Markdown 有内置的安全 Hook,通过过滤白名单以及DomPurify进行扫描过滤 .
52+ Cherry Markdown 有内置的安全 Hook,通过过滤白名单以及 DomPurify 进行扫描过滤 .
5353
5454### 样式主题
5555
@@ -72,8 +72,6 @@ Cherry Markdown 有多种样式主题选择
7272- [ 表格编辑] ( https://tencent.github.io/cherry-markdown/examples/table.html )
7373- [ 标题自动序号] ( https://tencent.github.io/cherry-markdown/examples/head_num.html )
7474
75-
76-
7775## 安装
7876
7977通过 yarn
110108<div id =" markdown-container" ></div >
111109<script src =" cherry-editor.min.js" ></script >
112110<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+ });
117115 </script >
118116```
119117
@@ -149,14 +147,14 @@ const cherryInstance = new Cherry({
149147});
150148```
151149
152- ### 引擎模式 (语法编译)
150+ ### 引擎模式 (语法编译)
153151
154152``` javascript
155153// 引入Cherry引擎核心构建
156154// 引擎配置项与Cherry通用,以下文档内容仅介绍Cherry核心包
157155import CherryEngine from ' cherry-markdown/dist/cherry-markdown.engine.core' ;
158156const cherryEngineInstance = new CherryEngine ();
159- const htmlContent = cherryEngineInstance .makeHtml (' # welcome to cherry editor!' )
157+ const htmlContent = cherryEngineInstance .makeHtml (' # welcome to cherry editor!' );
160158
161159// --> <h1>welcome to cherry editor!</h1>
162160```
@@ -215,7 +213,7 @@ registerPlugin().then(() => {
215213
216214### 默认配置
217215
218- ``` javascript
216+ ```` javascript
219217 {
220218 // 第三方包
221219 externals: {
@@ -254,6 +252,12 @@ registerPlugin().then(() => {
254252 // 'hookName': {
255253 //
256254 // }
255+ autoLink: {
256+ /** 是否开启短链接 */
257+ enableShortLink: true ,
258+ /** 短链接长度 */
259+ shortLinkLength: 20 ,
260+ },
257261 list: {
258262 listNested: false , // 同级列表类型转换后变为子级
259263 indentSpace: 2 , // 默认2个空格缩进
@@ -323,7 +327,7 @@ registerPlugin().then(() => {
323327 codemirror: {
324328 // depend on codemirror theme name: https://codemirror.net/demo/theme.html
325329 // 自行导入主题文件: `import 'codemirror/theme/<theme-name>.css';`
326- theme: ' default' ,
330+ theme: ' default' ,
327331 },
328332 // 编辑器的高度,默认100%,如果挂载点存在内联设置的height则以内联样式为主
329333 height: ' 100%' ,
@@ -391,13 +395,13 @@ registerPlugin().then(() => {
391395 // 外层容器不存在时,是否强制输出到body上
392396 forceAppend: true ,
393397}
394- ```
398+ ````
395399
396400### 关闭浮动菜单和气泡菜单
397401
398402``` javascript
399403 toolbars: {
400- ... // other config
404+ ... // other config
401405 bubble: false , // array or false
402406 float: false , // array or false
403407 },
@@ -413,13 +417,15 @@ registerPlugin().then(() => {
413417点击查看 [ examples] ( ./examples/ )
414418
415419### 客户端
420+
416421[ cherry-markdown 桌面客户端] ( ./docs/cherry_editor_client.CN.md )
417422
418423## 拓展
419424
420425### 自定义语法
421426
422427#### sentence Syntax
428+
423429如果编译内容没有额外特殊要求,使用普通语法
424430
425431``` javascript
@@ -445,20 +451,21 @@ new Cherry({
445451 customSyntax: {
446452 // 注入编辑器的自定义语法中
447453 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',
453459 },
454460 },
455461 },
456462});
457463```
458464
459-
460465#### paragraph Syntax
466+
461467如果编译内容要求不受外界影响,则使用段落语法
468+
462469``` javascript
463470/*
464471 * 生成一个屏蔽敏感词汇的hook
@@ -471,11 +478,11 @@ let BlockSensitiveWordsHook = Cherry.createSyntaxHook('blockSensitiveWords', Che
471478 // 预处理文本,避免受影响
472479 beforeMakeHtml (str ) {
473480 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+ });
479486 },
480487 makeHtml (str , sentenceMakeFunc ) {
481488 return str;
@@ -493,11 +500,11 @@ new Cherry({
493500 customSyntax: {
494501 // 注入编辑器的自定义语法中
495502 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',
501508 },
502509 },
503510 },
@@ -508,10 +515,10 @@ new Cherry({
508515
509516``` javascript
510517/*
511- * 生成一个添加前缀模板的hook
512- * 名字叫AddPrefixTemplate
513- * 图标类名icon-add-prefix
514- */
518+ * 生成一个添加前缀模板的hook
519+ * 名字叫AddPrefixTemplate
520+ * 图标类名icon-add-prefix
521+ */
515522let AddPrefixTemplate = Cherry .createMenuHook (' AddPrefixTemplate' , ' icon-add-prefix' , {
516523 onClick (selection ) {
517524 return ' Prefix-' + selection;
@@ -529,11 +536,15 @@ new Cherry({
529536 ' addPrefix' , // 在顶部菜单栏的尾部添加自定义菜单项
530537 ],
531538 bubble: [
532- ' bold' , /** ...其他菜单项 */ , ' color' ,
539+ ' bold' /** ...其他菜单项 */ ,
540+ ,
541+ ' color' ,
533542 ' addPrefix' , // 在气泡菜单(选中文本时出现)的尾部添加自定义菜单项
534543 ], // array or false
535544 float: [
536- ' h1' , /** ...其他菜单项 */ , ' code' ,
545+ ' h1' /** ...其他菜单项 */ ,
546+ ,
547+ ' code' ,
537548 ' addPrefix' , // 在浮动菜单(在新的空行出现)的尾部添加自定义菜单项
538549 ], // array or false
539550 customMenu: {
@@ -547,7 +558,6 @@ new Cherry({
547558
548559如果你想看更多有关 cherry markdown 的拓展信息,可以看这里 [ extensions] ( ./docs/extensions.CN.md ) .
549560
550-
551561## 单元测试
552562
553563选用 Jest 作为单元测试工具,主要看好其断言、支持异步和快照测试等功能。单元测试分为两个部分,CommonMark 用例测试和快照测试。
@@ -557,6 +567,7 @@ new Cherry({
557567运行 ` yarn run test:commonmark ` 测试 CommonMark 官方用例,运行速度较快。
558568
559569用例位于 ` test/suites/commonmark.spec.json ` , 比如:
570+
560571``` json
561572{
562573 "markdown" : " \t foo\t baz\t\t bim\n " ,
@@ -567,7 +578,8 @@ new Cherry({
567578 "section" : " Tabs"
568579},
569580```
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 ` 等私有属性。
571583
572584CommonMark 规范及测试用例可参考:https://spec.commonmark.org/ 。
573585
@@ -577,10 +589,9 @@ CommonMark 规范及测试用例可参考:https://spec.commonmark.org/ 。
577589
578590快照测试运行速度较慢,仅在易出错且包含 Cherry 特色语法的 Hook 上使用。
579591
580-
581592## Contributing
582593
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 ) .
584595
585596## License
586597
0 commit comments