自己动手制作更好用的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 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论.
随机推荐
- 主席树+LCA【p2633 (bzoj2588】 Count on a tree
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- Android开发工具
Android开发工具: AndroidDevTools: 收集整理Android开发所需的Android SDK.开发中用到的工具.Android开发教程.Android设计规范,免费的设计素材等. ...
- Debian安装VirtualBox增强工具
切换到root用户: apt-get install build-essential 或者 apt-get install gcc make apt-get install dkms apt-get ...
- HTML5:绘制图形
canvas绘图通过属于 canvas 的 JavaScript 方法完成 针对不支持html5的IE浏览器 <!--[if IE]> <script type="text ...
- Session集中式管理
Asp.net Session集中式管理主要有StateServer(状态服务器).Sqlserver(数据库服务器).自定义(如Redis缓存服务器)等,本文主要介绍StateServe ...
- linux 账户锁与解锁
,sudo passwd -l user 锁住user帐号,su 已经不能切换到user下. 2,sudo passwd -u user 解锁user帐号,su可以切换到user下. 3,如果不小心把 ...
- vue假全家桶升级方式,形成类似于小程序的路径管理(新增require-css与require-text)
1.路径布局大致就是这样,完全模拟小程序,主要是靠require来做到的 2.首先index.html是这样的(配置js和css没有用requireJs主要是方便而且载入什么组件比较清晰) <! ...
- GraphicsLab Project之辉光(Glare,Glow)效果 【转】
作者:i_dovelemon 日期:2016 / 07 / 02 来源:CSDN 主题:Render to Texture, Post process, Glare, Glow, Multi-pass ...
- solr6.6 solrJ索引富文本(word/pdf)文件
1.文件配置 在core下面新建lib文件夹,存放相关的jar包,如图所示: 修改solrconfig.xml <lib dir="${solr.install.dir:../../. ...
- PHP性能优化大全
第一章 针对系统调用过多的优化 我这次的优化针对syscall调用过多的问题,所以使用strace跟踪apache进行分析. 1. apache2ctl -X & 使用-X(debug)参 ...