一段markdown编辑器代码研究
一段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.js
,main.js
,menu.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.html
中id=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编辑器代码研究的更多相关文章
- MarkWord - 可发布博客的 Markdown编辑器 代码开源
因为前一段时间看到 NetAnalyzer 在Windows10系统下UI表现惨不忍睹,所以利用一段时间为了学习一下WPF相关的内容,于是停停写写,用了WPF相关的技术,两个星期做了一个Markdow ...
- [转]Haroopad Markdown 编辑器代码语法高亮支持
代码语法高亮 书写格式为: ` ` ` language_key if (condition){ return true } ` ` ` 在 ` ` ` (三个反引号)之间的是代码,其中languag ...
- 常见网页编辑器(富文本,Markdown,代码编辑等)
编辑器:网页不常用的功能,但却又是不可少的功能,如果要造个编辑器轮子,它可以把人玩死!!前端几大禁忌就有富文本, 为什么都说富文本编辑器是天坑? 下面记录一下常见的一些编辑器,该文随时更新: 富文本编 ...
- *DataSet序列化,这段代码研究
DataSet序列化,这段代码研究研究.学习学习. using System; using System.Collections.Generic; using System.Linq; using S ...
- 基于Java和Bytemd用120行代码实现一个桌面版Markdown编辑器
前提 某一天点开掘金的写作界面的时候,发现了内置Markdown编辑器有一个Github的图标,点进去就是一个开源的Markdown编辑器项目bytemd(https://github.com/byt ...
- editor.md实现Markdown编辑器
editor.md实现Markdown编辑器 Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可 ...
- Typora ---一款简洁的Markdown编辑器
Typora BB in front 如果你是一个佛(lan)系(duo),内心文艺的程序员,并且你对其他Markdown编辑器的使用效果感觉不是很好的话,可以来了解一下该软件Typora. What ...
- Markdown编辑器语法指南2
人的一切痛苦, 本质上都是对自己的无能的愤怒. --王小波 1 Markdown编辑器的基本用法 1.1 代码 如果你只想高亮语句中的某个函数名或关键字,可以使用 `function_name()` ...
- MVC开发Markdown编辑器(1)
MVC markdown MVC开发Markdown编辑器(1) 前言 安装 解析 结束语 前言 想在近段时间通过mvc开发个人博客,编辑器希望是markdown风格的,这样写文字会很方便.首先先解决 ...
随机推荐
- ,SQL语句关键词以及实例
1.select:功能:查找,语法:select 列名 from 表名(注:可以一次从一个表中查询多个列或者从多个表名中查询资料) 实例:select Name from Table1,返回Table ...
- 一:HttpClient知识整理
一:httpclient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支 ...
- 互联网轻量级框架SSM-查缺补漏第六天【级联+延迟加载特辑】
简言:本来这是昨天看的,但是因为想好好写一下[级联]这个东西,所以就看完之后今天来整理一下. 级联 1. 什么是级联 级联是一个数据库实体的概念.比如教师就需要存在学生与之对应,这样就有教师学生表,一 ...
- 快速搭建maven私服 Artifactory on Docker
1.下载官方镜像 docker pull docker.bintray.io/jfrog/artifactory-oss:latest 2.启动容器 docker run --name artifac ...
- hdu 4055 Number String(递推DP)
给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http ...
- webstorm启动后右下角总有进程在扫描
启动webstorm后,右下角有一个扫描的任务总在执行,其他操作很卡. 搜索后找到一个办法:在node-modules右键,选择Mark Directory As选择exclude 具体原因没找到.
- js String字符串对象常见方法总结
String对象常用来保存文本形式的数据. 其转化方法有二种: String(s) new String(s) String对象方法有: charAt() charCodeAt() concat() ...
- Apache Maven 3.5.0配置安装
1.maven 3.5 下载地址:http://maven.apache.org/download.cgi 2.下载了解压到 3.配置环境变量 4.测试看是否安装成功 5.maven配置(全局配置,用 ...
- Redux学习笔记--异步Action和Middleware
异步Action 之前介绍的都是同步操作,Redux通过分发action处理state,所有的数据流都是同步的,如果需要一步的话怎么办? 最简单的方式就是使用同步的方式来异步,将原来同步时一个acti ...
- react 反模式——不使用jsx动态显示异步组件
前言: react反模式 (anti-patterns)指的是违背react思想(flux)的coding方式. 本文在 App 组件中,通过 Model.show 动态显示 Model 组件,通过 ...