在设计博客过程中有考虑过文章编辑器的选择,是选择富文本编辑器还是使用 markdown 编辑器。因为 markdown 在日常中使用的比较多,写技术相关笔记的话还是比较方便,故最终选择使用 markdown 编辑器。
通过一番搜索最终发现 editor.md 功能比较强大。下面是 Vue 使用 editor.md 编辑器的过程。
Github download,下载该项目放入 ./static 目录中。
其中我把 jquery.min.js 移动到了 ./static/editor.md 目录中。
因为编辑器自带的代码高亮太简洁了,所以自己搜索下载了代码高亮 css 文件。放入到了 ./static/editor.md/css/google_code_prettify_themes/ 目录中。代码高亮 css 库可以搜索 google code prettify themes 关键字查找。例如:这个感觉够用了。也可以自己去修改 css 配置相应的高亮规则。
我是把该编辑器继续用 Vue 封装了个组件组件:markdown-editor.vue
<template><div class="markdown-editor-box"><link rel="stylesheet" href="/static/editor.md/css/editormd.min.css"><link rel="stylesheet" :href="'/static/editor.md/css/google_code_prettify_themes/' + codeTheme"><div :id="editorId"></div></div></template><script>import scriptjs from 'scriptjs';import { defaultConfig, codeThemes } from '../../config/editor.md';export default {props: {editorId: {'type': String,'default': 'markdown-editor',},onchange: { // 内容改变时回调,返回(html, markdown, text)type: Function},config: { // 编辑器配置type: Object},codeTheme: { // 代码高亮主题'type': String,'default': 'vibrant-ink.min.css'},initData: {'type': String},initDataDelay: {'type': Number, // 延迟初始化数据时间,单位毫秒'default': 0}},data: function() {return {editor: null,codeThemes,editorLoaded: false,};},methods: {fetchScript: function(url) {return new Promise((resolve) => {scriptjs(url, () => {resolve();});});},getConfig: function () {return {...defaultConfig, ...this.config };},initEditor: function () {(async () => {await this.fetchScript('/static/editor.md/jquery.min.js');await this.fetchScript('/static/editor.md/editormd.min.js');// await this.fetchScript('/static/editor.md/editormd.js');this.$nextTick(() => {let editor = window.editormd(this.editorId, this.getConfig());editor.on('load', () => {setTimeout(() => { // hack bug: 一个页面多个编辑器只能初始化其中一个数据问题this.editorLoaded = true;this.initData && editor.setMarkdown(this.initData);}, this.initDataDelay);});this.onchange && editor.on('change', () => {let html = editor.getPreviewedHTML();this.onchange({markdown: editor.getMarkdown(),html: html,text: window.$(html).text()});});this.editor = editor;});})();}},mounted: function() {this.initEditor();},watch: {'initData': function (newVal) {if(newVal) {this.editorLoaded && this.editor.setMarkdown(newVal);}}}}</script>配置文件:config/editor.md.js
const defaultConfig = {width: "100%",height: 600,path: '/static/editor.md/lib/',// theme: "dark",// previewTheme: "dark",// editorTheme: "pastel-on-dark",// markdown: "默认填充内容", // 默认填充内容lineWrapping: true, // 编辑框不换行codeFold: true, // 代码折叠placeholder: '请输入...',syncScrolling: true,saveHTMLToTextarea: true, // 保存 HTML 到 TextareasearchReplace: true,watch: true, // 实时预览// htmlDecode: "style,script,iframe|on*", // 开启 HTML 标签解析,为了安全性,默认不开启toolbar: true, //工具栏previewCodeHighlight: true, // 预览 HTML 的代码块高亮,默认开启emoji: true,taskList: true,tocm: true, // Using [TOCM]tex: true, // 开启科学公式TeX语言支持,默认关闭flowChart: true, // 开启流程图支持,默认关闭sequenceDiagram: true, // 开启时序/序列图支持,默认关闭,// dialogLockScreen: false, // 设置弹出层对话框不锁屏,全局通用,默认为true// dialogShowMask: false, // 设置弹出层对话框显示透明遮罩层,全局通用,默认为true// dialogDraggable: false, // 设置弹出层对话框不可拖动,全局通用,默认为true// dialogMaskOpacity: 0.4, // 设置透明遮罩层的透明度,全局通用,默认值为0.1// dialogMaskBgColor: "#000", // 设置透明遮罩层的背景颜色,全局通用,默认为#fff// imageUpload: false,// imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp"],// imageUploadURL: "./php/upload.php",// onload: function() {// // this.fullscreen();// // this.unwatch();// // this.watch().fullscreen();// // this.setMarkdown("#PHP");// // this.width("100%");// // this.height(480);// // this.resize("100%", 640);// },};const codeThemes = [{label: 'monokai',value: 'monokai.min.css',},{label: 'atelier-cave-dark',value: 'atelier-cave-dark.min.css',},{label: 'atelier-cave-light',value: 'atelier-cave-light.min.css',},{label: 'atelier-dune-dark',value: 'atelier-dune-dark.min.css',},{label: 'atelier-dune-light',value: 'atelier-dune-light.min.css',},{label: 'atelier-estuary-dark',value: 'atelier-estuary-dark.min.css',},{label: 'atelier-estuary-light',value: 'atelier-estuary-light.min.css',},{label: 'atelier-forest-dark',value: 'atelier-forest-dark.min.css',},{label: 'atelier-forest-light',value: 'atelier-forest-light.min.css',},{label: 'atelier-heath-dark',value: 'atelier-heath-dark.min.css',},{label: 'atelier-heath-light',value: 'atelier-heath-light.min.css',},{label: 'atelier-lakeside-dark',value: 'atelier-lakeside-dark.min.css',},{label: 'atelier-lakeside-light',value: 'atelier-lakeside-light.min.css',},{label: 'atelier-plateau-dark',value: 'atelier-plateau-dark.min.css',},{label: 'atelier-plateau-light',value: 'atelier-plateau-light.min.css',},{label: 'atelier-savanna-dark',value: 'atelier-savanna-dark.min.css',},{label: 'atelier-savanna-light',value: 'atelier-savanna-light.min.css',},{label: 'atelier-seaside-dark',value: 'atelier-seaside-dark.min.css',},{label: 'atelier-seaside-light',value: 'atelier-seaside-light.min.css',},{label: 'atelier-sulphurpool-dark',value: 'atelier-sulphurpool-dark.min.css',},{label: 'atelier-sulphurpool-light',value: 'atelier-sulphurpool-light.min.css',},{label: 'github',value: 'github.min.css',},{label: 'github-v2',value: 'github-v2.min.css',},{label: 'hemisu-dark',value: 'hemisu-dark.min.css',},{label: 'hemisu-light',value: 'hemisu-light.min.css',},{label: 'tomorrow',value: 'tomorrow.min.css',},{label: 'tomorrow-night',value: 'tomorrow-night.min.css',},{label: 'tomorrow-night-blue',value: 'tomorrow-night-blue.min.css',},{label: 'tomorrow-night-bright',value: 'tomorrow-night-bright.min.css',},{label: 'tomorrow-night-eighties',value: 'tomorrow-night-eighties.min.css',},{label: 'tranquil-heart',value: 'tranquil-heart.min.css',},{label: 'vibrant-ink',value: 'vibrant-ink.min.css',},];export {defaultConfig,codeThemes,};问题 1,2 解决记录:Commits Log。
问题 3 解决方案:多个编辑器 setMarkdown 操作隔开一段时间即可。
原网址: 访问
创建于: 2021-06-20 14:52:14
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论