editor.md #js markdown编辑器

文档: editor.md.ipandao.com

editor.md编辑器

  1. 需要依赖 jquery.js 或者 zepto.js
  2. 引入editormd.min.css,editormd.min.js
  3. 除此之外,editor.md项目中的lib/plugins/fonts/images/languages 几个文件夹也不能删除,因为代码运行时,会引入里面的文件
    代码:
 <button onclick="handleEditormdUnWatch()">关闭实时预览</button>
 <button onclick="handleEditormdWatch()">实时预览</button>
 <button onclick="getMarkdown()">getMarkdown</button>
 <button onclick="getHTML()">getHTML</button>
<div id="editor-md">
    <textarea style="display:none;" class="content-markdown" name="content-markdown"></textarea>
</div>

<script type="text/javascript">

        var editor = editormd("editor-md", {
            width  : "100%",            //宽度,不填为100%
            height : "500px",           //高度,不填为100%
            //theme : "dark",             //主题,不填为默认主题
            path   : "editormd/lib/",   //editor.md插件的lib目录地址
            saveHTMLToTextarea : true, // 保存 HTML 到 Textarea
            toolbarAutoFixed:true,      //工具栏自动固定定位的开启与禁用
            watch : false,                // 关闭实时预览
            toolbar  : false,             //关闭工具栏
            emoji : true,
            taskList : true,
            tocm            : true,         // Using [TOCM]
            tex : true,                   // 开启科学公式TeX语言支持,默认关闭
            flowChart : true,             // 开启流程图支持,默认关闭
            sequenceDiagram : true,       // 开启时序/序列图支持,默认关闭,
            imageUpload : true,
            imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
            imageUploadURL : "./php/upload.php",
            onload : function() {
                // console.log('onload', this);
                //this.fullscreen();
                //this.unwatch();
                //this.watch().fullscreen();
                //this.setMarkdown("#PHP");
                //this.width("100%");
                //this.height(480);
                //this.resize("100%", 640);
            }
        });
        
        editormd.katexURL = {
            js  : "./editormd/plugins/KaTeX/katex.min",  // default: //cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min
            css : "./editormd/plugins/KaTeX/katex.min"   // default: //cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min
        };
        
        // editor.gotoLine(90);//转到第90行
 
        // editor.show();//显示编辑器

        // editor.hide();//隐藏编辑器

        // alert(testEditor.getMarkdown());//获取编辑器内容(不含html)

        // alert(editor.getHTML());//获取编辑器html内容
    
        // editor.watch();//开启双窗口对比
                    
        // editor.unwatch();//取消双窗口对比
                
        // editor.previewing();//预览效果
        
        // editor.fullscreen();//全屏(按ESC取消)
        
        // editor.showToolbar();//显示工具栏

        // editor.hideToolbar();//隐藏工具栏
    
        // editor.config({
        //         tocDropdown   : true,
        //         tocTitle      : "目录 Table of Contents",
        // });//TOC下拉菜单
        
        // editor.config("tocDropdown", false);//TOC默认 
        function handleEditormdWatch () {
            editor.watch()
        }
        function handleEditormdUnWatch() {
            editor.unwatch()
        }
        function getMarkdown() {
            console.log(editor.getMarkdown())
        }
        function getHTML() {
            console.log(editor.getHTML())
        }
</script>

vue 集成editor.md:

image.png
// src/components/EditorMd.vue
<template>
  <div :id="id">
    <!-- Tips: Editor.md can auto append a `<textarea>` tag -->
    <textarea style="display:none;" v-model="contentMd"></textarea>
</div>
</template>
<script>
import '/public/editormd/css/editormd.min.css'
if (typeof window !== 'undefined') {
   // scriptjs 是一个加载js文件的插件
    var $s = require('scriptjs');
}
export default {
  name: 'editor.md',
  props: {
    id: {
      type: String,
      default: 'editor-md'
    },
    content: {
      type: String,
      default: '### Hello Editor.md !'
    },
    editorPath: {
      type: String,
      default: '/editormd',
    },
    editorConfig: {
      type: Object,
      default() {
        return {
          width: this.width,
          height: window.innerHeight > 400 ? (window.innerHeight - 100) : 380,
          path: '/editormd/lib/',
          codeFold: true,
          saveHTMLToTextarea: true,
          searchReplace: true,
          htmlDecode: 'style,script,iframe|on*',
          emoji: true,
          onchange : ()=>{
            this.$emit('change',this.instance.getPreviewedHTML(),this.instance.getMarkdown())
          }
        }
      }
    }
  },
  data() {
    return {
      instance: null,
      contentMd: ''
    };
  },
  mounted () {
    //加载依赖
      $s([
        `${this.editorPath}/jquery.min.js`,
        `${this.editorPath}/lib/marked.min.js`,
        `${this.editorPath}/lib/prettify.min.js`,
        `${this.editorPath}/lib/underscore.min.js`,
        `${this.editorPath}/lib/raphael.min.js`,
        // `${this.editorPath}/lib/flowchart.min.js`,
        // `${this.editorPath}/lib/jquery.flowchart.min.js`,
        // `${this.editorPath}/lib/sequence-diagram.min.js`
      ], () => {
        $s(`${this.editorPath}/editormd.js`, () => {
          let editorMD = window.editormd
         this.$nextTick(() => {
            if (editorMD) {
                this.instance = editorMD(this.id, this.editorConfig);
            }
          });
        });
      });
  },
  watch: {
    content: {
      handler(newVal) {
        console.log(newVal)
        this.contentMd = newVal
      },
      immediate: true
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="less">
</style>

// src/views/About.vue
<template>
  <editor-md :content="content" @change="handleChange"></editor-md>
</template>
<script>
// @ is an alias to /src
import EditorMd from '@/components/EditorMd.vue'
export default {
  name: 'About',
  components: {
    EditorMd
  },
  data () {
    return {
      content: '',
      editorPath: '/editormd'
    }
  },
  created () {
    this.fileMd()
  },
  methods: {
    fileMd () {
      let demo = `### Hello Editor.md !!!!!!`
      this.content = demo
    },
    handleChange (html, md) {
      console.log('handleChange: >>>>')
      console.log(html)
      console.log(md)
      console.log('handleChange: <<<<')
    }
  }
}
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容