一款好用的Markdown编辑器及使用过程中的坑

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 一款好用的Markdown编辑器及使用过程中的坑

Markdown在技术圈越来越受欢迎,今天为大家带来一款国内开源的比较好用的Markdown编辑器——editor.md。同时也聊聊在使用过程中遇到的坑。

editor.md简介

image.png需要预览效果可直接访问url:https://pandao.github.io/editor.md/index.html ,这里是官方网站的一个demo。同时提供了全套的下载安装教程。github开源地址:https://github.com/pandao/editor.md/blob/master/examples/image-upload.html

无论发布含有代码的文章、画流程图、展示数学公式等都有完备的支持。而且此编辑器与后端代码无关,纯前端js实现。

editor.md目录介绍

本文介绍的版本为v1.5.0,在首页下载完成,解压editor.md-master.zip文件,可以看到如下图的目录结构:image.png图中红色框内是我们要引用到项目的文件和目录。

  • css目录中可选择editormd.min.css放在对应的项目css目录中;
  • js可选择editormd.min.js放置在对应项目的js目录中,需要注意的是同时需要引入jQuery,这里使用jquery.min.js;
  • examples文件夹中是一部分核心功能的demo,在使用的过程中用到对应的组件或功能可打开参考;
  • fonts是需要用到字体,可一并引入项目;
  • images是一些加载类的图片;
  • lib是editor.md依赖的第三方js资源,比如流程图的js资源;
  • plugins主要是编辑器上面的操作功能插件,比如图片上传等,可选择使用的进行加载;

editor.md整合使用

在上面提到对应的文件根据项目的需要拷贝至项目中,需要注意的是最好文件夹的名字在项目中一一对照。特别是plugins这个文件夹的名称,在使用插件时editormd.min.js会默认找对应plugins路径下的插件。

引入css和js

在使用到editor.md的页面引入css和js:

  1. <linkrel="stylesheet"href="/css/editormd.css"/>
  2. <#--js可在jsp或其他类型选择页面的底部引入-->
  3. <scriptsrc="/js/jquery.min.js"></script>
  4. <scriptsrc="/js/editormd.min.js"></script>

页面中添加div

在需要添加editor.md编辑器的地方输入以下div:

  1. <divid="content-editormd"class="form-group">
  2.    <textareastyle="display:none;"class="form-control"id="content-editormd-markdown-doc"name="content-editormd-markdown-doc"></textarea>
  3. </div>

div的id为content-editormd,后面的js代码中需要用到。textarea就是我们编写markdown文件的地方,editor.md会将此textarea渲染成在第一种图中看到的效果。默认的textarea的内容为markdown文档的内容,通过form表单提交时后台可通过content-editormd-markdown-doc获取到对应的markdown文档内容。比如Java中可通过request.getParameter("content-editormd-markdown-doc")获得。

注意:此处需要注意的是,无论需要html格式的内容还是markdown格式的内容,都只需要写一个textarea。此处有一个很大的坑。不少其他教程中说需要两个textarea,那么会导致后一个textarea后台获得的数据是一个数组,而不是单纯的HTML内容。

页面添加js代码

js代码用来将上面的textarea进行渲染:

  1. <scripttype="text/javascript">
  2.    $(function(){
  3.        editormd("content-editormd",{
  4.            width   :"100%",
  5.            height  :1000,
  6.            syncScrolling :"single",
  7.            path    :"/lib/",
  8.            saveHTMLToTextarea :true,// 保存HTML到Textarea

  9.        });
  10.    });
  11. </script>

此段js代码中的content-editormd就是上面div的id。其中path路径需要指定到项目中对应的lib的路径。saveHTMLToTextarea设置为true表示,转化为html格式的内容也同样提交到后台。

此时如果用浏览器查看页面元素会发现,不仅有name为content-editormd-markdown-doc的textarea,editor.md还会生成一个name为content-editormd-html-code的textarea。也就是说当saveHTMLToTextarea设置为true时,编辑器会自动生成这么一个textarea,后台只需要根据name获取即可,不需要在前台再次自定义一个textarea。image.png后台接收请求本文采用Springmvc,代码如下:

  1. @RequestMapping("/publish")
  2. publicString publish(HttpSession session,@RequestParam("content-editormd-html-code")String contentHtml,@RequestParam("content-editormd-markdown-doc")String content){
  3.    returnnull;
  4. }

其中content-editormd-html-code对应的html格式的内容,content-editormd-markdown-doc对应的是markdown格式的内容。如果发现无法接收到参数,可采用上面的方法查看一下页面元素。

上传图片

editor.md的上传图片功能实现起来比较简单,只需要在上段代码中再添加一些配置即可。

  1. <scripttype="text/javascript">
  2.    $(function(){
  3.        editormd("content-editormd",{
  4.            width   :"100%",
  5.            height  :1000,
  6.            syncScrolling :"single",
  7.            path    :"/lib/",
  8.            saveHTMLToTextarea :true,// 保存 HTML 到 Textarea
  9.            // 图片上传
  10.            imageUpload :true,
  11.            imageFormats:["jpg","jpeg","gif","png","bmp","webp"],
  12.            imageUploadURL:"/file/upload",
  13.        });
  14.    });
  15. </script>
  • imageUpload设置为true表示支持上传,此时需要plugins中的image-dialog.js插件(默认调用,放在指定路径即可)。
  • imageFormats为支持上传的图片类型。
  • imageUploadURL要上传图片的后台服务器路径。

注意:此处需要注意的是服务器后台返回结果的格式必须json格式,且内容如下:

  1. {
  2.    success :0|1,//0表示上传失败;1表示上传成功
  3.    message :"提示的信息",
  4.    url     :"图片地址"//上传成功时才返回
  5. }

此处有一个大坑,返回的参数success的值不是字符串“0”和“1”,而是数字0和1,后台返回的时候一定要注意,否则会出现图片上传成功之后,返回结果中的图片地址无法填充。

其中message为上传成功或失败之后alert出来提示用户的信息。url为上传成功之后服务器返回的图片地址。

后台接收上传代码如下:

  1. @Controller
  2. @RequestMapping("/file")
  3. publicclassFileUploadController{

  4.    privatestaticfinalLogger LOGGER =LoggerFactory.getLogger(FileUploadController.class);

  5.    privatestaticfinalString SUCCESS ="success";

  6.    @ResponseBody
  7.    @RequestMapping("/upload")
  8.    publicString upload(HttpSession session,@RequestParam(value ="editormd-image-file")MultipartFile file){
  9.        JSONObject res =newJSONObject();

  10.        try{
  11.            Map<String,String> uploadMap =QiniuUtils.upload(file.getInputStream());
  12.            String code = uploadMap.get("code");
  13.            if(SUCCESS.equals(code)){
  14.                res.put("success",1);
  15.                res.put("message","上传成功");
  16.                res.put("url", uploadMap.get("url"));
  17.            }else{
  18.                res.put("success",0);
  19.                res.put("message","上传失败"+ uploadMap.get("error"));
  20.            }

  21.        }catch(IOException e){
  22.            LOGGER.error("上传图片异常", e);
  23.            res.put("success",0);
  24.            res.put("message","上传异常");
  25.        }

  26.        LOGGER.info("上传图片返回结果:{}", res);
  27.        return res.toString();
  28.    }
  29. }

本代码中采用了云存储,大家在使用的过程中可针对自己的情况改写为服务器路径或其他云存储路径。

注意:此处有一坑:服务接收file文件时,对应的参数为editormd-image-file,如果接收不到可采用上面的方式查看页面元素。

上传效果如下图:image.png

markdown页面展示

通过上面的步骤,已经将html格式和markdown格式的内容都上传到服务器了。如果需要编辑则加载markdown的内容,此时只需将服务器存储的内容赋值给上面的textarea即可。

展示内容有两种方式,一种方式是直接展示html格式的内容,第二种方式是页面加载markdown格式内容,然后通过editor.md再次渲染成html格式。

首先看一下直接展示html页面需要做什么。

  1. <linkrel="stylesheet"href="/css/editormd.min.css"/>

  2. <divid="content-editormd">
  3.    ${contentHtml}
  4. </div>


  5. <scriptsrc="/js/jquery.min.js"></script>
  6. <scriptsrc="/js/editormd.min.js"></script>
  7. <scriptsrc="/lib/marked.min.js"></script>
  8. <scriptsrc="/lib/prettify.min.js"></script>

  9. <scripttype="text/javascript">
  10.    $(function(){
  11.        editormd.markdownToHTML("content-editormd");
  12.    })
  13. </script>

其中${contentHtml}为获取后台的html格式内容。

如果使用markdown内容前端渲染,则前端代码如下:

  1. <linkrel="stylesheet"href="/css/editormd.min.css"/>
  2. <divid="content-editormd">
  3.    <textareastyle="display:none;">${content}</textarea>
  4. </div>

  5. <scriptsrc="/js/jquery.min.js"></script>
  6. <scriptsrc="/js/editormd.min.js"></script>
  7. <scriptsrc="/lib/marked.min.js"></script>
  8. <scriptsrc="/lib/prettify.min.js"></script>
  9. <scriptsrc="/lib/raphael.min.js"></script>
  10. <scriptsrc="/lib/underscore.min.js"></script>
  11. <scriptsrc="/lib/sequence-diagram.min.js"></script>
  12. <scriptsrc="/lib/flowchart.min.js"></script>
  13. <scriptsrc="/lib/jquery.flowchart.min.js"></script>


  14. <scripttype="text/javascript">
  15.    $(function(){    
  16.        editormd.markdownToHTML("content-editormd",{
  17.            htmlDecode:"style,script,iframe",//可以过滤标签解码
  18.            emoji:true,
  19.            taskList:true,
  20.            tex:true,               // 默认不解析
  21.            flowChart:true,         // 默认不解析
  22.            sequenceDiagram:true,// 默认不解析
  23.            codeFold:true
  24.        });
  25.    })
  26. </script>

editor.md的更多配置项

可参看example中的full.html。

  1. $.get('test.md',function(md){
  2.    testEditor = editormd("test-editormd",{
  3.        width:"90%",
  4.        height:740,
  5.        path :'../lib/',
  6.        theme :"dark",
  7.        previewTheme :"dark",
  8.        editorTheme :"pastel-on-dark",
  9.        markdown : md,
  10.        codeFold :true,
  11.        //syncScrolling : false,
  12.        saveHTMLToTextarea :true,    // 保存 HTML 到 Textarea
  13.        searchReplace :true,
  14.        //watch : false,                // 关闭实时预览
  15.        htmlDecode :"style,script,iframe|on*",            // 开启 HTML 标签解析,为了安全性,默认不开启    
  16.        //toolbar  : false,             //关闭工具栏
  17.        //previewCodeHighlight : false, // 关闭预览 HTML 的代码块高亮,默认开启
  18.        emoji :true,
  19.        taskList :true,
  20.        tocm            :true,         // Using [TOCM]
  21.        tex :true,                   // 开启科学公式TeX语言支持,默认关闭
  22.        flowChart :true,             // 开启流程图支持,默认关闭
  23.        sequenceDiagram :true,       // 开启时序/序列图支持,默认关闭,
  24.        //dialogLockScreen : false,   // 设置弹出层对话框不锁屏,全局通用,默认为true
  25.        //dialogShowMask : false,     // 设置弹出层对话框显示透明遮罩层,全局通用,默认为true
  26.        //dialogDraggable : false,    // 设置弹出层对话框不可拖动,全局通用,默认为true
  27.        //dialogMaskOpacity : 0.4,    // 设置透明遮罩层的透明度,全局通用,默认值为0.1
  28.        //dialogMaskBgColor : "#000", // 设置透明遮罩层的背景颜色,全局通用,默认为#fff
  29.        imageUpload :true,
  30.        imageFormats :["jpg","jpeg","gif","png","bmp","webp"],
  31.        imageUploadURL :"./php/upload.php",
  32.        onload :function(){
  33.            console.log('onload',this);
  34.            //this.fullscreen();
  35.            //this.unwatch();
  36.            //this.watch().fullscreen();

  37.            //this.setMarkdown("#PHP");
  38.            //this.width("100%");
  39.            //this.height(480);
  40.            //this.resize("100%", 640);
  41.        }
  42.    });
  43. });
目录
相关文章
|
5月前
|
程序员 Linux iOS开发
一款比Typora更简洁优雅的Markdown编辑器神器(完全开源免费)
一款比Typora更简洁优雅的Markdown编辑器神器(完全开源免费)
225 1
|
2月前
|
存储 安全 数据安全/隐私保护
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
79 0
|
8天前
|
JavaScript 前端开发 API
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
本文介绍了如何在Vue 3项目中使用v-md-editor组件库来创建markdown编辑器和预览组件。文章提供了安装步骤、如何在main.js中进行全局配置、以及如何在页面中使用VMdEditor和VMdPreview组件的示例代码。此外,还提供了一个完整示例的链接,包括编辑器和预览组件的使用效果和代码。
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
|
4月前
|
存储 移动开发 编解码
基于HTML5开发的Markdown在线编辑器
Markdown是一种轻量级标记语言,以其简洁易读的格式而备受程序员和作者们的青睐。随着互联网的发展,越来越多的在线Markdown编辑器应运而生,为用户提供了更加便捷、高效的写作和编辑环境。本文将探讨基于HTML5开发的Markdown在线编辑器的设计原理、功能特点以及技术优势。
106 4
|
5月前
|
前端开发 C++ iOS开发
几款主流好用的markdown编辑器介绍
几款主流好用的markdown编辑器介绍
315 1
|
2月前
|
前端开发 Python
60行Python代码开发在线markdown编辑器
60行Python代码开发在线markdown编辑器
|
5月前
|
存储 移动开发 编解码
基于HTML5开发的Markdown在线编辑器
Markdown是一种轻量级标记语言,以其简洁易读的格式而备受程序员和作者们的青睐。随着互联网的发展,越来越多的在线Markdown编辑器应运而生,为用户提供了更加便捷、高效的写作和编辑环境。本文将探讨基于HTML5开发的Markdown在线编辑器的设计原理、功能特点以及技术优势。
66 1
基于HTML5开发的Markdown在线编辑器
|
4月前
|
Linux C++ 开发者
几款主流好用的markdown编辑器介绍
几款主流好用的markdown编辑器介绍
182 0
|
5月前
|
Web App开发 移动开发 搜索推荐
常见的Markdown在线编辑器
在线Markdown编辑器提供了更加稳定和流畅的用户体验。用户无需下载安装任何软件,只需打开浏览器,即可在任何设备上轻松使用这款编辑器,实现随时随地的写作。基于HTML5的在线Markdown编辑器可实现即时的编辑和预览功能
77 2
|
4月前
Markdown编辑器--冷门实用知识总结
Markdown编辑器--冷门实用知识总结
下一篇
无影云桌面