标题vue引入markdown富文本编辑器
gitee仓库代码在文章尾部
markdown使用v-md-editor
v-md-editor 是基于 Vue 开发的 markdown 编辑器组件
http://ckang1229.gitee.io/vue-markdown-editor/zh/
npm安装
$ npm install @kangc/v-md-editor@next --save
进阶版vue3中引入(web\src\main.js)
import { createApp } from 'vue';
import VMdEditor from '@kangc/v-md-editor/lib/codemirror-editor';
import '@kangc/v-md-editor/lib/style/codemirror-editor.css';
import githubTheme from '@kangc/v-md-editor/lib/theme/github.js';
import '@kangc/v-md-editor/lib/theme/style/github.css';
// highlightjs
import hljs from 'highlight.js';
// codemirror 编辑器的相关资源
import Codemirror from 'codemirror';
// mode
import 'codemirror/mode/markdown/markdown';
import 'codemirror/mode/javascript/javascript';
import 'codemirror/mode/css/css';
import 'codemirror/mode/htmlmixed/htmlmixed';
import 'codemirror/mode/vue/vue';
// edit
import 'codemirror/addon/edit/closebrackets';
import 'codemirror/addon/edit/closetag';
import 'codemirror/addon/edit/matchbrackets';
// placeholder
import 'codemirror/addon/display/placeholder';
// active-line
import 'codemirror/addon/selection/active-line';
// scrollbar
import 'codemirror/addon/scroll/simplescrollbars';
import 'codemirror/addon/scroll/simplescrollbars.css';
// style
import 'codemirror/lib/codemirror.css';
VMdEditor.Codemirror = Codemirror;
VMdEditor.use(githubTheme, {
Hljs: hljs,
});
const app = createApp(/*...*/);
app.use(VMdEditor);
使用
<template>
<v-md-editor v-model="text" height="400px"></v-md-editor>
</template>
<script>
export default {
data() {
return {
text: '',
};
},
};
</script>
github主题拓展引入
引入代码高亮语言包highlight.js (web\src\main.js)
import VueMarkdownEditor from '@kangc/v-md-editor';
import '@kangc/v-md-editor/lib/style/base-editor.css';
import githubTheme from '@kangc/v-md-editor/lib/theme/github.js';
import '@kangc/v-md-editor/lib/theme/style/github.css';
// highlightjs 核心代码
import hljs from 'highlight.js/lib/core';
// 按需引入语言包
import json from 'highlight.js/lib/languages/json';
hljs.registerLanguage('json', json);
VueMarkdownEditor.use(githubTheme, {
Hljs: hljs,
});
引入emoji表情包(web\src\main.js)
import VueMarkdownEditor from '@kangc/v-md-editor';
import createEmojiPlugin from '@kangc/v-md-editor/lib/plugins/emoji/index';
import '@kangc/v-md-editor/lib/plugins/emoji/emoji.css';
VueMarkdownEditor.use(createEmojiPlugin());
Katex 插件与Mermaid 插件
cdn 引入 mermaid 资源(web\public\index.html)
//
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.css" />
<script src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js"></script>
// mermaid
<script src="https://unpkg.com/mermaid/dist/mermaid.min.js"></script>
引入插件(web\src\main.js)
import VueMarkdownEditor from '@kangc/v-md-editor';
import createKatexPlugin from '@kangc/v-md-editor/lib/plugins/katex/cdn';
import createMermaidPlugin from '@kangc/v-md-editor/lib/plugins/mermaid/cdn';
import '@kangc/v-md-editor/lib/plugins/mermaid/mermaid.css';
VueMarkdownEditor.use(createKatexPlugin());
VueMarkdownEditor.use(createMermaidPlugin());
使用katex
<template>
<v-md-editor v-model="text" height="500px" />
</template>
<script>
export default {
data() {
return {
text: '$$sum_{i=1}^n a_i=0$$',
};
},
};
</script>
使用mermaid
<template>
<v-md-editor v-model="text" height="500px" />
</template>
<script>
const text = `\`\`\`mermaid
graph LR
A --- B
B-->C[fa:fa-ban forbidden]
B-->D(fa:fa-spinner);
\`\`\`
`;
export default {
data() {
return {
text,
};
},
};
</script>
line-number
copy-code
总代码
main.js
import VMdEditor from '@kangc/v-md-editor/lib/codemirror-editor';
import '@kangc/v-md-editor/lib/style/codemirror-editor.css';
import githubTheme from '@kangc/v-md-editor/lib/theme/github.js';
import '@kangc/v-md-editor/lib/theme/style/github.css';
// emoji
import createEmojiPlugin from '@kangc/v-md-editor/lib/plugins/emoji/index';
import '@kangc/v-md-editor/lib/plugins/emoji/emoji.css';
// katex
import createKatexPlugin from '@kangc/v-md-editor/lib/plugins/katex/cdn';
//mermaid
import createMermaidPlugin from '@kangc/v-md-editor/lib/plugins/mermaid/cdn';
import '@kangc/v-md-editor/lib/plugins/mermaid/mermaid.css';
//lineNumber
import createLineNumbertPlugin from '@kangc/v-md-editor/lib/plugins/line-number/index';
//copyCode
import createCopyCodePlugin from '@kangc/v-md-editor/lib/plugins/copy-code/index';
import '@kangc/v-md-editor/lib/plugins/copy-code/copy-code.css';
// 进阶markdown
import Codemirror from 'codemirror';
// mode
import 'codemirror/mode/markdown/markdown';
import 'codemirror/mode/javascript/javascript';
import 'codemirror/mode/css/css';
import 'codemirror/mode/htmlmixed/htmlmixed';
import 'codemirror/mode/vue/vue';
// edit
import 'codemirror/addon/edit/closebrackets';
import 'codemirror/addon/edit/closetag';
import 'codemirror/addon/edit/matchbrackets';
// placeholder
import 'codemirror/addon/display/placeholder';
// active-line
import 'codemirror/addon/selection/active-line';
// scrollbar
import 'codemirror/addon/scroll/simplescrollbars';
import 'codemirror/addon/scroll/simplescrollbars.css';
// style
import 'codemirror/lib/codemirror.css';
VMdEditor.Codemirror = Codemirror;
import hljs from 'highlight.js/lib/core';
import cpp from 'highlight.js/lib/languages/cpp';
hljs.registerLanguage('cpp', cpp);
VMdEditor.use(githubTheme, {
Hljs: hljs,
// extend(md) {
// // md为 markdown-it 实例,可以在此处进行修改配置,并使用 plugin 进行语法扩展
//
// },
});
VMdEditor.use(createKatexPlugin());
VMdEditor.use(createMermaidPlugin());
VMdEditor.use(createEmojiPlugin());
VMdEditor.use(createLineNumbertPlugin());
VMdEditor.use(createCopyCodePlugin());
const app = createApp(App);
app.use(VMdEditor);
app.mount('#app');
index.html
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.jpg">
<title>PGMA</title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.css" />
<script src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js"></script>
<script src="https://unpkg.com/mermaid@9.2.1/dist/mermaid.min.js"></script>
</body>
</html>
加入file-saver依赖保存文件
$ npm install file-saver --save
创建MarkdownIndexView.vue
<template>
<v-md-editor
v-model="text"
left-toolbar="undo redo clear | h bold italic strikethrough quote emoji | ul ol table hr | link image code | save"
@save="save"
height="500px"
/>
</template>
<script>
import { saveAs } from 'file-saver';
export default {
data() {
return {
text: "编写内容",
};
},
methods: {
save(text){
console.log(text);
let strData = new Blob([text], { type: 'md/plain;charset=utf-8' });
saveAs(strData, "mkd.md");
},
},
};
</script>
效果
完结
上传git
https://gitee.com/wanhzhaoxuan0/oj/tree/e530721bbce1c894b838e890896a1fc49f19dc8b