editor.md实现Markdown编辑器

Markdown和Editor.md简介

Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可以用Markdown,设计一篇精彩绝伦的文档而完全不需要将你的右手从键盘上移到鼠标上去,这是我和很多编程工作者最热爱的。长期使用Leanote的原因,也是基于有着强大的WEB端和客户端的Markdown编辑器(个人甚至偏向于客户端Leanote)。

Editor.md 是国人开发的开源在线Markdown编辑器,单纯基于前端JavaScript,无需后台代码加持,适用于任何语言(仅在上传图片功能时需要一点后台代码与之配合,其余都交给Editor.md吧),因为是中国人开发的,对中文支持得相当到位。在我的个人博客设计过程中,相当长一段时间都是使用的百度的ueditor作为文档编辑器,说实话,配置那玩意儿相当繁琐,而要想把ueditor配置得符合自己心意更是烦上加烦。在经历了一次SpringMVC与ueditor上传组件冲突的bug后,有种彻底想放弃ueditor的冲动。
长期使用Leanote的Markdown编辑器的我,苦苦寻求一种能取代ueditor的Markdown编辑器,Editor.md 正是我想要的。

Editor.md的安装使用

1.基本使用及表单提交

基本使用markdown是相当简单的,比ueditor还要简单,从git上下载回来的Editor.md是1.5版,压缩包里有分门别类详细的文件夹。

在examples文件夹中有一个简单的示例simple.html,可以在浏览器里打开,并查看源代码,我这里做一个简单的总结,并加上表单提交的配置:

    • 在HTML中加载CSS:editormd.css
    • 在HTML中加载JS:顺序为jQuery,editormd.min.js,
    • 在HTML中写一个div节点,包含两个textarea,格式如下:

      <div class="editormd" id="test-editormd">
      <textarea class="editormd-markdown-textarea" name="test-editormd-markdown-doc"></textarea>
      <!-- 第二个隐藏文本域,用来构造生成的HTML代码,方便表单POST提交,这里的name可以任意取,后台接受时以这个name键为准 -->
      <textarea class="editormd-html-textarea" name="text"></textarea>
      </div>
    • 在HTML中写一句javascript:

      <script type="text/javascript">
      $(function() {
      editormd("test-editormd", {
      width : "90%",
      height : 640,
      syncScrolling : "single",
      //你的lib目录的路径,我这边用JSP做测试的
      path : "<%=request.getContextPath()%>/resources/editormd/lib/",
      //这个配置在simple.html中并没有,但是为了能够提交表单,使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中,方便post提交表单。
      saveHTMLToTextarea : true
      });
      });
      </script>

      OK,这样就完成了一个最简单的editor.md的编辑器了,你可以在这里面书写你熟悉的Markdown文档,里面可以包含代码,右侧有实时的预览。如图所示:

      2.图片上传

      有了基本的Markdown功能,集成editor.md就完成了一半了,下面开始处理图片上传。
      图片上传的语法是![alt](url),这个用来嵌入互联网上现成的图片是很方便的,但是如果想要上传本地图片就要后台代码配合了,我下面以JAVA为例(官方文档有PHP的示例),配合SpringMVC和commons-fileupload-1.3.1.jar,简单给个DEMO:
      根据Editor.md的官方文档介绍,上传图片功能需要添加一点配置,如下:

      editormd("test-editormd", {
      width : "90%",
      height : 640,
      syncScrolling : "single",
      path : "<%=request.getContextPath()%>/resources/editormd/lib/",
      imageUpload : true,
      imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
      imageUploadURL : "/uploadfile",
      saveHTMLToTextarea : true,
      });
      //editor.md期望得到一个json格式的上传后的返回值,格式是这样的:
      /*
      {
      success : 0 | 1, // 0 表示上传失败,1 表示上传成功
      message : "提示的信息,上传成功或上传失败及错误信息等。",
      url : "图片地址" // 上传成功时才返回
      }
      */

      以上代码并不难理解,也就加了三行配置,关键的是imageUploadURL : "/uploadfile"这个配置,这里的URL指向了你处理图片上传的action,与之对应的,我的SpringMVC控制器是这样的,这里贴出了整个代码,防止有小伙伴对JAVA以及SpringMVC处理文件上传还不太熟练:

      package com.newflypig.jblog.controller;
      import java.io.File;
      import java.io.IOException;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import org.apache.commons.io.FileUtils;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.multipart.MultipartFile;
      @Controller
      public class UploadController { @RequestMapping(value="/uploadfile",method=RequestMethod.POST)
      public void hello(HttpServletRequest request,HttpServletResponse response,@RequestParam(value = "editormd-image-file", required = false) MultipartFile attach){
      try {
      request.setCharacterEncoding( "utf-8" );
      response.setHeader( "Content-Type" , "text/html" );
      String rootPath = request.getSession().getServletContext().getRealPath("/resources/upload/"); /**
      * 文件路径不存在则需要创建文件路径
      */
      File filePath=new File(rootPath);
      if(!filePath.exists()){
      filePath.mkdirs();
      } //最终文件名
      File realFile=new File(rootPath+File.separator+attach.getOriginalFilename());
      FileUtils.copyInputStreamToFile(attach.getInputStream(), realFile); //下面response返回的json格式是editor.md所限制的,规范输出就OK
      response.getWriter().write( "{\"success\": 1, \"message\":\"上传成功\",\"url\":\"/resources/upload/" + attach.getOriginalFilename() + "\"}" );
      } catch (Exception e) {
      try {
      response.getWriter().write( "{\"success\":0}" );
      } catch (IOException e1) {
      e1.printStackTrace();
      }
      }
      }
      }

      这样就完成了图片上传了,上传后,后台action返回了一个url给editor.md,editor.md使用这个url作为你嵌套在文档中的图片url。
      这样就大功告成了,是不是很爽,要比ueditor的上传配置简单100倍。

      3.Editor.md代码黑色主题

      用惯了sublime text等编辑器,是不是对代码的渲染有点要求呢,先上博主两个IDE的截图吧,一个是sublime text3,一个是myeclipse2015:


      习惯了黑色背景的代码样式,就希望editor.md也能实现代码黑色样式,果然,editor.md从1.5版本以后为大家提供了dark样式主题,但是会让除代码以外的其他编辑区域也变黑色,所以根据个人需要来小小的改造一下:

    • 首先添加样式配置,在原来的editor.md配置基础上,添加配置项:

      $(function() {
      editormd("test-editormd", {
      width : "90%",
      height : 640,
      syncScrolling : "single",
      path : "<%=request.getContextPath()%>/resources/editormd/lib/",
      imageUpload : true,
      imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
      imageUploadURL : "/uploadfile",
      saveHTMLToTextarea : true,
      //下面这一行将使用dark主题
      previewTheme : "dark"
      });
      });

      配置好dark主题以后,编辑区还是原来的编辑区,预览区已经使用了暗黑模式,但是代码以外的部分也都变成黑色背景了,这不是我想要的,所以我对editormd.css做了一些修正,将dark主题代码以外的部分取消了样式定义,这样预览起来只有代码块是暗黑模式,截图如下:

      修改了editormd.css后,别忘了使用CSS压缩工具再压缩一遍,生成editormd.min.css,这样正式部署时能减轻一点服务器压力,提高加载效率。我把压缩好重新生成的editormd.min.css放出来,有需要的可以直接下载。
      editormd.min.css

      4. 文档的显示

      编辑区的代码格式已经调整成为我们喜欢的样式了,在表单POST提交时,editormd将我们的markdown语法文档翻译成了HTML语言,并将html字符串提交给了我们的后台,后台应该将这些HTML字符串持久化到数据库中,在文章显示时将他们显示在页面上。
      具体的做法是:

      <link rel="stylesheet" href="<%=request.getContextPath()%>/resources/editormd/css/editormd.preview.min.css" />
      <link rel="stylesheet" href="<%=request.getContextPath()%>/resources/editormd/css/editormd.css" />
      <!-- 因为我们使用了dark主题,所以在容器div上加上dark的主题类,实现我们自定义的代码样式 -->
      <div class="content editormd-preview-theme-dark" id="content">${article.text }</div>
      <script src="<%=request.getContextPath()%>/resources/js/jquery.min.js"></script>
      <script src="<%=request.getContextPath()%>/resources/editormd/lib/marked.min.js"></script>
      <script src="<%=request.getContextPath()%>/resources/editormd/lib/prettify.min.js"></script>
      <script src="<%=request.getContextPath()%>/resources/editormd/editormd.min.js"></script>
      <script type="text/javascript">
      editormd.markdownToHTML("content");
      </script>

      至此,我们所有的工作都完成了。(另外还有些editor.md高级功能,比如[TOC]标签自动生成文档目录结构、流程图语法等,我还没研究,不过现在已经满足我的所有要求了,感兴趣的朋友可以继续阅读examples文件夹中各种示例。)
      如果您各项基础知识掌握得都还可以的话,将editor.md这个编辑器引入你的项目是相当轻松加愉快的。写这篇blog也确实因为对这个编辑器的喜爱,加上官方尚未有一个系统的cookbook,都是一个个小demo,希望能帮到想使用editor.md的朋友。

editor.md实现Markdown编辑器的更多相关文章

  1. JAVA WEB项目中使用并改造editor.md实现Markdown编辑器

    Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可以用Markdown,设计一篇精彩绝伦的文档而 ...

  2. springboot结合开源editor.md集成markdonw编辑器

    今天来实现一个简单的功能,通常blog后台编辑大多使用的是富文本编辑器,比如百度的Ueditor,比较轻巧的wangEditor,那么如何使用开源editor.md的markdown呢? 搭建一个sp ...

  3. Django集成Markdown编辑器【附源码】

    专注内容写作的你一定不要错过markdown 简单介绍 markdown是一种标记语言,通过简单的标记语法可以使普通的文本内容具有一定的格式,使用非常简单,学习成本极低 目前各大Blog平台都已支持m ...

  4. Markdown编辑器editor.md的使用---markdown上传图片

    http://kindeditor.org/ 确定下有没有查找替换功能 http://pandao.github.io/editor.md/ http://pandao.github.io/edito ...

  5. 基于SpringBoot从零构建博客网站 - 集成editor.md开发发布文章功能

    发布文章功能里面最重要的就是需要集成富文本编辑器,目前富文本编辑器有很多,例如ueditor,CKEditor.editor.md等.这里守望博客里面是集成的editor.md,因为editor.md ...

  6. Markdown编辑器Editor.md使用方式

    摘要: 搭建个人博客时,涉及文章上传,文章展示,这里需要一个Markdown插件,mark一下. Editormd下载地址:http://pandao.github.io/editor.md/ 由于前 ...

  7. thinkphp5使用Markdown编辑器Editor.md并上传图片

    Editor.md官网:https://pandao.github.io/editor.md/index.html 下载后解压放到项目内,和引入ueditor差不多 1.引入项目资源 <!--m ...

  8. Markdown编辑器editor.md的使用

      目录(?)[-] 一Markdown和editormd简介 二editormd的使用 1下载 2简单使用 21在自己的页面上引入相关的css和js代码如下 22在自己的页面中加上DIV 23在同页 ...

  9. 好用的Markdown编辑器一览 readme.md 编辑查看

    https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...

随机推荐

  1. 如何在Protel99se中批量修改元件的封装

    有时候需要批量修改元件的封装,可在原理图和PCB中批量修改.本文以批量修改电阻AXIAL0.3 的封装为AXIAL0.4 为例. 1. 在原理图中批量修改1.1. 方法1双击需要修改封装的其中一个元件 ...

  2. zabbix 启用分区表后需要关闭Housekeeper

    <pre name="code" class="html">Zabbix Housekeeper changes: 使用分区表需要关闭zabbix的 ...

  3. Linux企业级项目实践之网络爬虫(17)——存储页面

    在爬虫系统中数据的流量相当大,要处理的数据内容不仅包括爬虫系统的各种数据结构空间,而且包括从外部节点中得到的各种数据,比如HTTP请求,HTML页面,ROBOT.TXT等等.如果对这些内容处理不当,那 ...

  4. Android——自定义Actionbar左侧覆盖不全的解决方案

    今天遇到一个很蛋疼的问题,就是在自定义Actionbar的时候,setCustomView中,自定义的view怎么也覆盖不了整个视图,左侧一直留有一个空白,看下图: 所写的部分代码如下: protec ...

  5. 运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'

    运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'(用的是绿色的Tomcat7) 解决方法: 打开 ...

  6. github atom 试用

    github的编辑器atom 1.0已经出来了,在https://atom.io/ 我之前在win上一直用notepad++写了两年脚本.最近改写lua了,项目组统一用的sublime text.su ...

  7. STL采用的标准模板库

    一.map,set set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于 ...

  8. UltraEdit 和Notepad++ 使用ftp直接编辑linux上文件

    安装ftp服务 apt-get install vsftpd 安装完后更改相关配置文件 /etc/vsftpd.conf cp /etc/vsftpd.conf /etc/vsftpd.conf.ol ...

  9. iOS 8 自适应 Cell

    在使用 table view 的时侯经常会遇到这样的需求:table view 的 cell 中的内容是动态的,导致在开发的时候不知道一个 cell 的高度具体是多少,所以需要提供一个计算 cell ...

  10. webform开发经验(一):Asp.Net获取Checkbox选中的值

    webform中获取repeat控件列表下的checkbox选中的值: 码农上代码: public static string getSelectedIDs(Repeater Rpt_) { stri ...