TUIEditor插件扩展

前言
随着markdown越来越受欢迎,也出现了很多不错的工具,比如本篇文章就是使用了markdown写法。
tui.editor就是一款不错的markdown编辑器;由于之前项目里已经集成了tui.editor,但是仅仅靠自带的一些功能还不足以算得上强大,所以就在tui.editor基础之上再次集成了markMap插件和mermaid插件;
markMap:是一款思维导图插件,当然也是支持markdown写法的,除此之外还支持json、字符串等写法;
mermaid :主要是看中了它在图表上的能力,比如精美的流程图、甘特图、时序图等;包括印象笔记都在用;

tui.editor部分

首先在需要的页面引入,这部分不多说了,具体可参考tui.editor

import 'tui-editor/dist/tui-editor.css' // editor ui
import 'tui-editor/dist/tui-editor-contents.css' // editor content
import 'codemirror/lib/codemirror.css'
import 'highlight.js/styles/github.css' //语法高亮
import Editor from 'tui-editor'
import mermaid from 'mermaid'
import 'tui-editor/dist/tui-editor-extUML.js' //uml需要
import 'tui-editor/dist/tui-editor-Editor-full.js'

import $ from 'jquery'
//markmap相关
import 'markmap/style/view.mindmap.css'
// const d3 = require('d3');
require('markmap/lib/d3-flextree');
const markmap = require('markmap/lib/view.mindmap');
const parse = require('markmap/lib/parse.markdown');
const transform = require('markmap/lib/transform.headings');
_this.editor = new Editor({
  el: document.querySelector('#editorSection'),
  initialEditType: 'markdown',
  previewStyle: 'vertical',
  height: '300px',
   exts: ['mermaid','mindmap','uml']
});

需要注意的是这边的扩展有3个,即 exts = ['mermaid','mindmap','uml'];

 mounted() {
      let _this = this;
      let config = {
        theme:'neutral',//'default', 'forest', 'dark', 'neutral'
        logLevel:'fatal',
        securityLevel:'strict',
        startOnLoad:true,
        arrowMarkerAbsolute:false,
        flowchart:{
          htmlLabels:false, //设为true宽度会变窄
          curve:'linear',//cardinal
          useMaxWidth:true,
        },
        sequence:{
          diagramMarginX:50,
          diagramMarginY:10,
          actorMargin:50,
          width:150,
          height:65,
          boxMargin:10,
          boxTextMargin:5,
          noteMargin:10,
          messageMargin:35,
          mirrorActors:true,
          bottomMarginAdj:1,
          useMaxWidth:true,
          rightAngles:false,
          showSequenceNumbers:false,
        },
        gantt:{
          titleTopMargin:25,
          barHeight:40,
          barGap:5,
          topPadding:50,
          leftPadding:75,
          gridLineStartPadding:35,
          fontSize:11,
          fontFamily:'"Open-Sans", "sans-serif"',
          numberSectionStyles:4,
          axisFormat:'%Y-%m-%d',
        }
      };
      mermaid.flowchartConfig = {
        width: '100%',
      }
      mermaid.initialize(config);

      //todo: mermaid 部分
      Editor.defineExtension('mermaid', function() {
        Editor.codeBlockManager.setReplacer('mermaid', function(content) {
          var mermaidId = 'mermaid-' + Math.random().toString(36).substr(2, 10);
          setTimeout(renderMermaid.bind(null, mermaidId, content), 0);
          return '
'; }); }); function renderMermaid(mermaidId, content) { var el = document.querySelector('#' + mermaidId); const cb = function(svgGraph){ el.innerHTML = svgGraph; }; const id = mermaidId+"-svg" mermaid.render(id,content,cb); } //todo: mindmap 脑图部分 Editor.defineExtension('mindmap', function() { Editor.codeBlockManager.setReplacer('mindmap', function(content) { var mindmapId = 'mindmap-' + Math.random().toString(36).substr(2, 10); setTimeout(renderMindmap.bind(null, mindmapId, content), 0); let h = content.split(" ").length * 30;//大概算了下父容器div的高度 return `
`; }); }); function renderMindmap(mindmapId, content) { var el = document.querySelector('#' + mindmapId); const id = mindmapId+"-svg" setTimeout(()=>{ markmap('#'+id, transform(parse(content)), { preset: 'default', // or colorful linkShape: 'diagonal' // or bracket }); },0) el.innerHTML = ``; } },

markMap部分

可参考markMap配置;

自定义toolbar

 initToolbars(){
      let _this = this;
      let toolbar =  _this.editor.getUI().getToolbar()
      //网盘
      _this.editor.eventManager.addEventType('wpClick');
      _this.editor.eventManager.listen('wpClick', function() {
        _this.wpClick();
      });
     //帮助
      _this.editor.eventManager.addEventType('helpClick');
      _this.editor.eventManager.listen('helpClick', function() {
        _this.helpClick();
      });
      //mermaid扩展
      _this.editor.eventManager.addEventType('umlClick');
      _this.editor.eventManager.listen('umlClick', function() {
        _this.umlClick();
      });
      //思维导图
      _this.editor.eventManager.addEventType('mindmapClick');
      _this.editor.eventManager.listen('mindmapClick', function() {
        _this.mindmapClick();
      });

      _this.editor.eventManager.addEventType('insertImg');
      //这个事件监听就是添加自定义功能的地方
      _this.editor.eventManager.listen('insertImg', function() {
        _this.insertImgClick();
      });
      //为功能条添加自定义按钮
      toolbar.addButton({
        name: 'toolbar-item',
        tagName: "button",
        className: 'toast toast-img-icon',//自定义按钮的类名
        event: 'insertImg',//对应上文的eventManager添加的监听事件类型,通过点击触发
        tooltip: '上传图片',//鼠标hover自定义按钮的提示信息
      });
      toolbar.addButton({
        name: 'toolbar-item',
        tagName: "div",
        event: 'wpClick',
        tooltip: '添加网盘文件',
        $el: $('
') },1);//虽然都是插入到1这个位置,但是统一用了绝对定位,包括下面几个按钮 // toolbar.addButton({ name: 'toolbar-item', tagName: "div", event: 'umlClick', tooltip: '绘制UML图', $el: $('
' + '' + '
' + '
' + '' + '' + '' + '' + '
' + '
' + '
') }, 1); toolbar.addButton({ name: 'toolbar-item', tagName: "div", event: 'mindmapClick', tooltip: '思维导图', $el: $('
')}, 1); toolbar.addButton({ name: 'toolbar-item', tagName: "div", event: 'helpClick', tooltip: '帮助', $el: $('
')}, 1); $(".custom-button-item .umlDropDown .graph").click(function () { _this.$emit('addFileLink','Mermaid-graph') }) $(".custom-button-item .umlDropDown .sequenceDiagram").click(function () { _this.$emit('addFileLink','Mermaid-sequenceDiagram') }) $(".custom-button-item .umlDropDown .gantt").click(function () { _this.$emit('addFileLink','Mermaid-gantt') }) $(".custom-button-item .umlDropDown .plantUML").click(function () { _this.$emit('addFileLink','PlantUML') }) },

其实这部分真的是很尴尬很尴尬,tui.editor官方文档明明说 addButton()这个API已经弃用,所以我就准备使用最新提供的insertItem(),但是非常奇怪的是控制台报错不能插入item,后来还是使用了被弃用的API,而且连官方示例使用的也是被弃用的addButton(),,尴尬!如果你有更好的办法,请在评论告诉我一下哦!

markMap markdown写法与效果图

``` mindmap
# A General Theory of Reactivity
## Concepts
### Singular and temporal
### Plural and temporal
## Primitives
### Iterators
\```

请忽略一下这个反斜杠,真的不知道怎么转义了

属于第几级别,就在前一级别后面加一个#即可,很容易上手。

效果图类似于:


TUIEditor插件扩展_第1张图片
屏幕快照 1.png

mermaid markdown写法与效果图

``` mermaid
graph LR
    A[Hard edge] -->|Link text| B(Round edge)
    B --> C{Decision}
    C -->|One| D[Result one]
    C -->|Two| E[Result two]
\`\`\`
TUIEditor插件扩展_第2张图片
屏幕快照 2.png

以上只是流程图的写法,其实mermaid真的很强大,具体写法就参考mermaid官方文档吧
最后再啰嗦一句,该篇tui.editor的版本有点老,好像是1.3.x;
升版本的话可参考:有关于tui.editor升版

你可能感兴趣的:(TUIEditor插件扩展)