一段markdown编辑器代码研究

说明

代码在 https://github.com/dukeofharen/markdown-editor

之所以选择这个来分析是一方面是因为它的代码结构比较简单,易于扩展,可塑性强;另一方面,自己可以跟着教程边做边学,掌握js的相关知识。

以下内容整理自作者写的tutorial

源码文件结构

源代码有4个目录

  • css用于存放样式
  • html目录下的文件是index.html,是app的主页
  • img是一些图片
  • js里面放的是js的脚本

    此外,还有一个package.json文件,这个文件里面放的是配置信息,在程序运行前nwjs会加载package.json

先来看js目录

jquery目录保存压缩过的jquery源码。

taboverride.min.js这个不知道是什么,先空着。

editor.jsmain.jsmenu.js是我们要重点分析的文件。editor.js是编辑器的脚本,main.js是主程序,menu.js是菜单的脚本。

先来看index.html,我截取了最重要的几行代码

...
<script src="../js/jquery/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="../js/main.js"></script>
<script type="text/javascript" src="../js/taboverride/taboverride.min.js"></script>
<script type="text/javascript">
global.window = window;
global.$ = $;
global.gui = require('nw.gui');
init();
</script>
...

前几行加载了需要的js文件,接着在页面里嵌入了几行js代码。

		global.window = window;
global.$ = $;
global.gui = require('nw.gui');

第一行代码的意义是将DOM中的窗口对象window存放于global中。

第二行代码是把jquery对象存放在global变量中。

第三行是把nw.js中的gui对象存放在global中。

之所以这样做,是因为node.js的上下文中访问不到这三个对象,所以要把这三个对象存放在一个全局变量中。

最后,调用了main.js中的init()方法。

接下来让我们先来看main.js中的init()方法。

function init(){
var menu = require("./../js/menu.js");
menu.initMenu(); global.$(global.window.document).ready(function(){
var editor = require("./../js/editor.js");
if(global.gui.App.argv.length > 0){
editor.loadFile(global.gui.App.argv[0]);
}
var textEditor = global.$('#editor');
textEditor.bind('input propertychange', function() {
editor.reload();
});
tabOverride.set(global.window.document.getElementsByTagName('textarea'));
});
}

首先init函数加载了menu.js模块。require相当于import,不同的是因为js是动态脚本语言,所以可以用到时再加载。获取menu对象后,调用了menu对象的initMenu方法,初始化菜单栏。

接着,调用jquery选择了window.document用于获取页面,并给ready()函数传入一个回调函数,意义是当页面加载完毕时,执行回调函数里面的内容。所谓回调函数,js的api文档是这么解释的:

A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.

意思就是回调函数是 被作为参数传递给另一个父函数,且在父函数执行完毕后才开始执行的子函数。

那么回到正题来,回调函数里面干了什么事情呢?

1.

var editor = require("./../js/editor.js");

获取一个编辑器对象。

var textEditor = global.$('#editor');

用jquery的选择器选择index.htmlid=editor的元素:

<textarea name="markdown" id="editor" class="md_editor"></textarea>

其实就是文本编辑区。

3.

		textEditor.bind('input propertychange', function() {
editor.reload();
});

这段代码含义是给文本编辑区绑定一个事件,当检测到文本框内的内容改变时,就调用函数reload()重新渲染右边的预览区。

让我们看看reload函数

exports.reload = function(){
var marked = require("marked");
marked.setOptions({
renderer: new marked.Renderer(),
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false
});
var resultDiv = global.$('.md_result');
var textEditor = global.$('#editor');
var text = textEditor.val();
resultDiv.html(marked(text));
};

1.首先加载marked

2.接着配置markdown解析器。

  • gfm:应该是github flavored markdown的缩写
  • tables:应该是允许使用表格

    剩下的都不知道什么意思。。。

var resultDiv = global.$('.md_result');

从css中选择类.md_result,这个类代表右边渲染出来的html网页。

4.获得文本编辑区的内容

.html是jquery的函数,是对innerHTML的封装,功能是设置或者获取DOM元素内的html内容。

这里我们用marked渲染文本,然后赋值给.md_result类里面的内容。

exports相当于导出功能,使得其他文件可以用到这里面定义的方法。

exports.loadText = function(text){
var textEditor = global.$('#editor');
textEditor.val(text);
exports.reload();
};

loadText完成的功能是,用text替换掉文本编辑区的内容,目前还不支持多文件。

一段markdown编辑器代码研究的更多相关文章

  1. MarkWord - 可发布博客的 Markdown编辑器 代码开源

    因为前一段时间看到 NetAnalyzer 在Windows10系统下UI表现惨不忍睹,所以利用一段时间为了学习一下WPF相关的内容,于是停停写写,用了WPF相关的技术,两个星期做了一个Markdow ...

  2. [转]Haroopad Markdown 编辑器代码语法高亮支持

    代码语法高亮 书写格式为: ` ` ` language_key if (condition){ return true } ` ` ` 在 ` ` ` (三个反引号)之间的是代码,其中languag ...

  3. 常见网页编辑器(富文本,Markdown,代码编辑等)

    编辑器:网页不常用的功能,但却又是不可少的功能,如果要造个编辑器轮子,它可以把人玩死!!前端几大禁忌就有富文本, 为什么都说富文本编辑器是天坑? 下面记录一下常见的一些编辑器,该文随时更新: 富文本编 ...

  4. *DataSet序列化,这段代码研究

    DataSet序列化,这段代码研究研究.学习学习. using System; using System.Collections.Generic; using System.Linq; using S ...

  5. 基于Java和Bytemd用120行代码实现一个桌面版Markdown编辑器

    前提 某一天点开掘金的写作界面的时候,发现了内置Markdown编辑器有一个Github的图标,点进去就是一个开源的Markdown编辑器项目bytemd(https://github.com/byt ...

  6. editor.md实现Markdown编辑器

    editor.md实现Markdown编辑器 Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可 ...

  7. Typora ---一款简洁的Markdown编辑器

    Typora BB in front 如果你是一个佛(lan)系(duo),内心文艺的程序员,并且你对其他Markdown编辑器的使用效果感觉不是很好的话,可以来了解一下该软件Typora. What ...

  8. Markdown编辑器语法指南2

    人的一切痛苦, 本质上都是对自己的无能的愤怒. --王小波 1 Markdown编辑器的基本用法 1.1 代码 如果你只想高亮语句中的某个函数名或关键字,可以使用 `function_name()` ...

  9. MVC开发Markdown编辑器(1)

    MVC markdown MVC开发Markdown编辑器(1) 前言 安装 解析 结束语 前言 想在近段时间通过mvc开发个人博客,编辑器希望是markdown风格的,这样写文字会很方便.首先先解决 ...

随机推荐

  1. Struts2 学习(三)

    一.访问Servlet API 的三种方式 1.什么是 Action 访问 Servlet 的 API 1.访问 Servlet 的API: 1.获取 request 对象. 2.接受请求参数. 3. ...

  2. 读EntityFramework.DynamicFilters源码_心得_单元测试03

    上个星期我们只是显示了一个示例,怎么在EF的框架内,注入我们拓展的动态过滤器 第一步:安装EntityFramework.DynamicFilters 第二步:重写OnModelCreating方法 ...

  3. Service的启动流程源码跟踪

    前言: 当我们在一个Activity里面startService的时候,具体的执行逻辑是怎么样的?需要我们一步步根据源码阅读. 在阅读源码的时候,要关注思路,不要陷在具体的实现细节中,一步步整理代码的 ...

  4. FastJson 常见问题

    一.场景 在使用序列化的时候,Object里包含了两个一模一样的对象,所以解析的时候,只有第一个能解析出来,另外一个无法显示. 查看了json的序列化源码,发现是DisableCircularRefe ...

  5. layui-学习01-基本api

    全局配置 layui.config({ dir: '/res/layui/', //layui.js 所在路径(注意,如果是script单独引入layui.js,无需设定该参数.),一般情况下可以无视 ...

  6. c/c++ 按照行读取文件

    本文代码都在Windows/VC++6.0下测试过, 在linux/g++下也没有问题. 但是请一定注意linux和Windows文件格式的区别,比如: 1. 当linux上的代码读取Windows文 ...

  7. SpringMVC学习(一)——概念、流程图、源码简析

    学习资料:开涛的<跟我学SpringMVC.pdf> 众所周知,springMVC是比较常用的web框架,通常整合spring使用.这里抛开spring,单纯的对springMVC做一下总 ...

  8. html5自我总结

    2017年7月30日 合抱之木,生于毫末.九层之台,起于累土.软件行业要熟记和训练的东西有很多,在此,写一下如何快速搭建html及自我见解(这里只介绍我自己用到的,还有部分存在但是用不到的就不讲解了) ...

  9. Python文件夹与文件的操作 ZZ

    最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模 ...

  10. UIButton中的**EdgeInsets是做什么用的?

    UIButton中的**EdgeInsets是做什么用的? UIEdgeInsetsMake Creates an edge inset for a button or view.An inset i ...