## 简介
一款使用marked和highlight.js开发的一款markdown编辑器,除常见markdown语法外,支持快捷输入、图片粘贴、代码复制、全屏编辑、预览等功能。
使用起来简单方便,只需几行代码,即可在你的页面上引入一个markdown编辑器,编辑区支持像专业编辑器那样。
编辑器涵盖了常用的markdown编辑器功能,可通过已有属性进行配置,对编辑器功能和样式进行基本的配置,也可根据需求进行深度定制。
#### [项目地址](https://github.com/zhaoxuhui1122/vue-markdown)
#### [文档地址](https://zhaoxuhui1122.github.io/vue-markdown-docs/)
**示例**
![image.png](https://upload-images.jianshu.io/upload_images/9390764-f6b0840eca057d61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 特点
- 使用简单,只需要安装npm包,引入项目即可使用,不需要繁琐的初始化配置。
- 方便扩展,根据实际需求,支持常见的功能配置,也可根据实际需求进行深度定制。
- 体积小,加载速度快,npm包删除了highlight.js和codemirror里的依赖。
- 灵活的主题,默认支持四种代码块风格,也可根据实际需求定制自己的主题样式
- 功能强大,支持专业版的编辑器,使用codemirror实现编辑窗口,可识别markdown语法
- 键盘事件监听,如保存、粘贴、回车时上次输入语法判断等
- 可扩展性强,除了提供的属性配置编辑器,也可直接在原有组件基础上进行二次开发
## 实现思路
通过监听文本输入区域内内容的变化,实时将输入的markdown语法进行编译,并渲染到预览区域。
编辑器大致分为头部菜单栏、左侧内容输入区域、右侧预览区域三个部分。
头部菜单主要为定自定义标题区域和菜单按钮,菜单按钮可通过配置文件进行显示和隐藏;左侧编辑区域,简单版使用textarea开发,满足基本需求,
专业版使用codemirror开发,编辑区域支持手动输入文本和通过头部菜单插入;右侧预览区域可实时预览输入文本,并可通过菜单按钮,进行编辑区域和预览区域的切换。
## 安装方式
### 使用npm安装
1. 安装依赖
```
npm i -S vue-meditor
```
### 将组件复制到项目内
1. 将git仓库代码拉到本地
```
git clone https://github.com/zhaoxuhui1122/vue-markdown.git
```
2. 复制src文件夹下内容至components文件夹下
## 在项目使用
#### npm包安装时
简单版
```js
import Markdown from 'vue-meditor'
```
专业版
```js
import { MarkdownPro } from 'vue-meditor'
```
预览组件
```js
import { MarkdownPreview } from 'vue-meditor'
```
#### 复制组件到本地时(推荐)
简单版
```js
import Markdown from '@/components/markdown/...';
```
专业版
```js
import MarkdownPro from '@/components/markdown/pro';
```
预览组件
```js
import MarkdownPreview from '@/components/markdown/preview';
```
#### 在页面内使用
```vue
${hljs.highlightAuto(code).value}
`
}
}
export default index.setOptions({
renderer,
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
highlight: function (code) {
return hljs.highlightAuto(code).value;
}
})
```
### 自定义markdown语法转换
项目内使用的`index.js均为其默认配置功能,如需要特殊转换,可重写其内部的解析方法,即重写其renderer相关方法
[参考文档](https://github.com/markedjs/marked/blob/master/docs/USING_PRO.md)。
## 自动生成文档目录
预览区域和文档预览组件暂不支持自动生成目录,实现自动生成目录思路目前想到的大致有
- 重写`renderer.heading` 方法,为生成的标题添加id,输入特定快捷键,如`[TOC]`时,查找预览区域内的的所有标题标签,分析等级关系,生成目录标签
### icon替换
项目内所有的icon和命名参考`/assets/font/index.html`,替换时需注意,预览区域的checkbox为icon,注意一并替换,
修改`/assets/css/index.less`内的`input[type="checkbox"]`的`:after`样式。
## 代码体积优化
### 公共代码提取
npm包构建时,三个组件完全独立,没有抽离公共文件,所以,当同一个项目内引入其中的两个或三个组件都引入时,存在一定的重复代码,
主要为`highlight.js`、`marked`、`iconfont`、css样式几个部分。
解决方式:将组件复制到本地项目,打包时将这些文件作为公共文件抽离出来。
**注意**:三个组件中使用的iconfont为同一套,如果只是单纯的使用`preview`组件,
将会引入整个项目所使用的iconfont,可删除iconfont的引入,
重写`input[type="checkbox"]`的样式,preview组件体积将会减少一半,样式文件位于`markdown/assets/css/index.less`。
### codemirror体积优化
codemirror主要分为主文件、mode相关文件和样式文件,主文件体积异常的大,mode文件目前只选用了css/jsvascript/markdown/meta/xml五个文件,
其中markdown.js和meta.js为必须引用的,项目中已将常见的编程语言代码风格定义为css/js/xml之一,例如less/sass/scss按照css规则解析,html/vue按照xml规则解析。
优化可从一下方面入手
- 减少codemirror主文件体积
- 减少引用的mode依赖
### highlight.js体积优化
highlight.js原本体积也是较大的,主要原因为,编译时为支持各种代码语言,引入了相应的解析文件,
项目内已根据常见的代码语言进行了一次筛选,进行按需引入,可根据自身需求,再次对引用文件进行删减
参见`src/markdown/libs/js/hljs.js`,目前支持的语言有
```js
import hljs from 'highlight.js/lib/highlight'
import javascript from 'highlight.js/lib/languages/javascript'
import java from 'highlight.js/lib/languages/java';
import css from 'highlight.js/lib/languages/css';
import less from 'highlight.js/lib/languages/less';
import go from 'highlight.js/lib/languages/go';
import markdown from src;
import php from 'highlight.js/lib/languages/php';
import python from 'highlight.js/lib/languages/python';
import ruby from 'highlight.js/lib/languages/ruby';
import stylus from 'highlight.js/lib/languages/stylus';
import typescript from 'highlight.js/lib/languages/typescript';
import xml from 'highlight.js/lib/languages/xml';
const languages = {
javascript,
java,
css,
less,
markdown,
go,
php,
python,
ruby,
stylus,
typescript,
xml
}
Object.keys(languages).forEach(key => {
hljs.registerLanguage(key, languages[key])
})
export default hljs;
```
### 专业版编辑器codemirror/simple.js
优化思路:无
#### iconfont 体积优化
只需要preview组件时,避免引入所有icon,参考功能扩展里icon替换方法。
## 升级路线
- 普通版编辑器对选中文本进行操作功能
- 文档目录功能
- 优化专业版编辑器体积
- react版开发
- ...
## 问题反馈
对于功能上的缺陷、使用方法和希望扩展的功能,可以提 [Issues](https://github.com/zhaoxuhui1122/vue-markdown/issues)。
## license: `MIT`