自己动手制作更好用的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 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论.
随机推荐
- 集训考试题(CF510C Fox And Names的简化版)
题目描述给定n个由小写字母组成的字符串,请你求出一个字母表顺序,使得这n个字符串是按照字典序升序排列的,数据保证存在合法的字母表顺序.如果存在多个解,输出字典序最小的那个. 输入格式第一行一个整数n. ...
- 【枚举】Codeforces Round #394 (Div. 2) C. Dasha and Password
纪念死去的智商(虽然本来就没有吧……) 三重循环枚举将哪三个fix string作为数字.字母和符号位.记下最小的值就行了. 预处理之后这个做法应该是O(n^3)的,当然完全足够.不预处理是O(n^3 ...
- 【博弈论】【SG函数】bzoj3404 [Usaco2009 Open]Cow Digit Game又见数字游戏
#include<cstring> #include<cstdio> #include<algorithm> #include<set> using n ...
- 【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划
10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强 ...
- python基础-协程函数、递归、模块、包等内容
1. 协程函数 1.1 yield基本用法 yield作用 1.把函数的执行结果封装好,即封装__iter__和__next__,即得到一个迭代器 2.与return功能类似,都可以返回值,但不同的是 ...
- Problem D: 零起点学算法24——判断奇偶数
#include<stdio.h> int main() { int a; while(scanf("%d",&a)!=EOF) ==) printf(&quo ...
- webstorm 2016
2017.2.27更新 选择“license server” 输入:http://idea.imsxm.com/ 2016.2.2 版本的破解方式: 安装以后,打开软件会弹出一个对话框:选择“lice ...
- springmvc-框架学习
https://www.androiddev.net/springmvc-框架学习一-helloworld/
- CSS3: box-shadow 阴影
box-shadow是给元素块添加周边阴影效果 语法: 对象选择器 {box-shadow:X轴偏移量 Y轴偏移量阴影 模糊半径 阴影扩展半径 阴影颜色 [投影方式] } box-shadow: h- ...
- ubuntu_software_install
1.atom PPA安装 命令行上依次输入即可完成安装: sudo add-apt-repository ppa:webupd8team/atom sudo apt-get update sudo a ...