自己动手制作更好用的markdown编辑器-01
前段时间用hexo重新搭了个人博客,顺便写了个简单的博客搭建教程.
用markdown写起博客流畅很多,但是用了几个markdown编辑器,都没有一个适合自己使用的。于是就想自己动手做一个,当然不是完全从0开始做,语法高亮和markdown解析都用的是开源的项目.
从这篇开始,我会把整个开发过程记录成系列随笔,因此开发进度较为缓慢.
博客写得少,像这样写长一点的随笔就有点混乱,看不懂的请用力喷,我会努力改进.
简介
先介绍下开发过程中用到的一些比较重要的开源项目:
- nw.js,原名node-webkit,用webkit和node来做基于web技术的跨平台客户端软件.
- CodeMirror,基于web技术实现的文本编辑器,实现了大部分的IDE功能以及几乎全部你会用到的语言的支持.目前我日常开发都是用这个IDE,甚至在做hexomd这个项目时用的IDE也是CodeMirror做的.
- angularjs,google的mvvm开发框架,这个相信不用我多做介绍.我用的不熟,觉得好用就拿来即用,没有深入的了解过.
关于这些开源项目的使用,我在这系列文章里不会详细解释,如果有疑问,可以去看官网的入门教程和wiki,当然也欢迎讨论.
项目结构

图片里的是我目前的项目结构,大概讲解一下一些目录和文件的用途。
icudtl.dat,nw.exe,nw.pak
这3个是nw.js在windows运行所必须的文件.package.json
nw.js的配置文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23{
"name": "HexoMD",
"description": "Markdown for hexo",
"main": "app/index.html",//程序入口页面
"author": "hmjlr123@gmail.com",
"license": "MIT",
"directories": {
"test": "no"
},
"devDependencies": {},
//窗口配置
"window": {
"title": "HexoMD",
"icon": "app/img/logo.png", //logo
"toolbar": true, //是否显示地址栏工具条(调试的时候启用)
"frame": false, //是否显示程序边框
"width": 1000, //默认宽度
"height": 700, //默认高度
"position": "center", //启动时在屏幕中的位置
"min_width": 600, //最小宽度
"min_height": 400 //最小高度
}
}app目录
程序的所有源代码的根目录.app/lib
存放angular,jquery,codemirror等开源库/框架的源代码app/helpers
存放一些node的工具函数app/modules
程序代码在这个目录,按功能模块分成不同的子目录.modules/app.js是整个程序的入口点app/package.json
node模块配置,注意与上层的package.json意义不同app/index.html
程序的主界面窗口
程序主界面
1 |
<!DOCTYPE html> |
只贴出部分代码.以后的所有代码也类似,都只会把重要的贴出来,并给出完整的链接.

界面采用比较简洁的三栏布局,分别为导航栏、内容区、状态栏/工具条.
最顶部的地址栏只有在开发的时候为了方便调试才开启,发布时会关闭掉.
拖动窗口
为了美观,我们在配置里去掉了系统自带的边框.因此要实现自定义的拖动窗口功能还需要增加一些设置.
所谓的设置,其实只要加上对应的样式即可,功能都由nw.js实现了.
1 |
.navbar{
|
带有此样式的元素可以作为窗口的拖拽区域,并且双击时最大化/还原窗口.
1 |
.navbar .navbar-collapse a {
|
被标志为可drag的容器里的链接将不可点击,因此要特别为链接加上no-drag
另外为了让程序看起来更像客户端一点,我默认禁用掉了文本选择,防止一些被作为按钮的a标签的文本被选中
1 |
html {
|
app.js
app.js作为程序的入口点,定义了整个项目代码的结构,需要特别拿出来说明一下.
1 |
angular.module('hmd', ['ui.router','hmd.studio'])
|
定义angular模块,modules所有的业务模块都会放到单独的子目录里,如这里注册的hmd.studio
1 |
//模块根目录 |
regModule方法实现最简单的模块载入,自动加载模块内的所有脚本到页面中,并为每个模块赋予一个单独的数据存储目录dataPath
1 |
hmd.storeDir = require('nw.gui').App.dataPath;
|
程序的数据存储目录
导航栏按钮
导航栏右边有4个按钮,分别为:检查更新、最小化、最大化、关闭
1 |
... |
检查更新等以后再实现.现在先实现后面3个功能
因为这3个功能是全局的,因此在modules根目录新建directives.js用于实现全局的Directive.
1 |
(function () {
|
定义了全局directive模块angular.module('hmd.directives', []),实现了3个Directive.
接下来将directive应用到按钮上
1 |
... |
将脚本引用<script src="modules/directives.js"></script>添加到index.html的app.js之后
app.js里的angular模块注册里增加hmd.directives模块angular.module('hmd', ['ui.router','hmd.directives','hmd.studio'])
刷新程序,三个按钮已经生效.
实现简单的markdown编辑器
先在页面添加相应的codemirror脚本引用
1 |
... |
然后在modules目录下新增studio子目录,所有编辑器功能都在这个模块里实现.
在app.js里增加加载studio模块的代码
1 |
hmd.regModule('studio');
|
每个子模块一般都会包含route.js,controllers.js,directive.js这三个基本的angular功能.以及views子目录,用于存放模块用到的html视图
studio模块多了一个editor.js,我们将编辑器的一些基本功能封装在这个脚本里
定义路由
1 |
hmd.studio.config(function ($stateProvider, $urlRouterProvider) {
|
修改app.js,将默认路由指定到/studio模块
1 |
hmd.config(function ($stateProvider, $urlRouterProvider) {
|
实现controller
1 |
var studio = hmd.studio; |
添加视图模版
1 |
<div class="content studio-wrap"> |
重新打开应用,可以看到模块跳到了studio路由,并且执行了对应的控制器
实现editor
1 |
var util = require('./helpers/util');
|
我们将编辑器的实现封装在hmd.editor这个对象上.
编辑器的模式设置为GFM.
实现directive
1 |
var studio = hmd.studio;
studio.directive('hmdEditor', function () {
|
定义了'hmd-editor,用于绑定hmd.editor的调用.
在视图模版里调用hmd-deitor
1 |
<div class="content studio-wrap"> |
刷新应用,可以看到textarea已经变成markdown编辑器,按ctrl+s保存会有简单的提示.
最终效果

总结
到目前为止,只是搭建了开发环境,实现了基础的编辑器功能,还完全不能真正的使用.
接下来几篇暂定计划是:
- 打开文件,保存新文件,系统设置等基本功能.
- 自动更新功能.
- 实时预览窗口.
- 自动上传图片.
- 表情功能.
- 集成hexo命令.
附件
自己动手制作更好用的markdown编辑器-01的更多相关文章
- 自己动手制作更好用的markdown编辑器-03
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/24/hexomd-03/ 文章目录 1. 系统模块 2. 记录上次打开的 ...
- 自己动手制作更好用的markdown编辑器-02
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im 文章目录 1. 工具条 1.1. 样式 1.2. 工具条截图 2. 状态栏消息 3. 文件 ...
- 自己动手开发更好用的markdown编辑器-04(实时预览)
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/25/hexomd-04/ 程序打包 文章目录 1. 打开新窗口 ...
- 自己动手开发更好用的markdown编辑器-07(扩展语法)
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/05/19/hexomd-07/ 文章目录 1. 准备工作 2. 目录语法 ...
- 自己动手开发更好用的markdown编辑器-06(自动更新)
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/05/12/hexomd-06/ 文章目录 1. 自动更新方案 2. 实现 ...
- 自己动手开发更好用的markdown编辑器-05(粘贴上传图片)
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/28/hexomd-05/ 文章目录 1. 七牛云存储 1.1. 系统 ...
- 任由文字肆意流淌,更自由的开源 Markdown 编辑器
对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...
- 市面上有没有靠谱的PM2.5检测仪?如何自己动手制作PM2.5检测仪
市面上能买到的11中常见的pm2.5检测仪 网上大佬实测并不是很准,我这里没测过(全买下来有点贵,贫穷限制了我的想象力) 这些检测仪多数是复合式.多功能的空气质量检测仪.具体就不一一介绍了.这篇文章 ...
- 更轻便的markdown 编辑器Typora
更轻便的markdown 编辑器 Typora 所见即所得的键入方式 https://typora.io 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论.
随机推荐
- hdu4757(可持久化 Trie )
hdu4757 题意 给出一棵树,每个节点有权值,每次查询节点 \((u, v)\) 以及 \(x\) ,问 \(u\) 到 \(v\) 路径上的某个节点与 \(x\) 异或最大的值是多少. 分析 T ...
- ( 转 ) .net 操作 JWT
GitHub: https://github.com/jwt-dotnet/jwt 1.JWT定义 JWT(Json Web Token)是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明 ...
- Delphi 7生成XML
文件格式为: Day 制1課 U12 ASSY01 Wrist 1009 0 2018/05/18 09:35:59 Day 制1課 U12 ASSY02 Wrist 1010 0 2018/05/1 ...
- 调试手机上网页 (断点 console timeline 选择dom)
用手机看网页,越来越多,手机app套个webview的也很多,那该如何调试手机上的页面了?比如 断点,选dom,console,控制台输出,查看内存,== 嗯,万能的的chrome和safari还是帮 ...
- ORACLE 数据库名、实例名、ORACLE_SID的区别
数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID) 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instanc ...
- python字符串转日期
需要两步 为了从字符串中提取时间,并进行比较,因此有了这个问题,如何将字符串转换成datetime类型 1.字符串与time类型的转换 >>> import time>> ...
- JavaScriptCore全面解析 (上篇)
收录待用,修改转载已取得腾讯云授权 作者 | 殷源 编辑 | 迷鹿 殷源,专注移动客户端开发,微软Imagine Cup中国区特等奖获得者,现就职于腾讯. JavaScript越来越多地出现在我们客户 ...
- Python 自用代码(拆分txt文件)
现有一个28G的txt文件,里面每一行是一个分词过的专利全文文档,一共370多万行.我需要把它按每五万行为单位做成一个json文件,格式大致如下: [{"id":"100 ...
- nginx linux 安装
nginx linux 安装 进入http://nginx.org/en/download.html 下载 n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gc ...
- [TypeScript] Create Explicit and Readable Type Declarations with TypeScript mapped Type Modifiers
Using the optional “+” sign together with mapped type modifiers, we can create more explicit and rea ...