cherry-markdown开源markdown组件详细使用教程

news2024/10/6 4:57:07

文章目录

  • 前言
  • 开发定位
  • 目标
  • 调研
  • 技术方案
    • 前提
    • 工作量安排
    • 数据库表设计
    • 实现步骤
      • 1、引入依赖
      • 2、实现cherry-markdown的vue组件(修改上传接口路径)
      • 3、支持draw.io组件
      • 4、支持展示悬浮目录toc
      • 前端使用:编辑状态使用cherry-markdown的vue组件
      • 前端使用:展示markdown(对外展示)
  • 问题解决
    • 问题1:cherrymarkdown不随对应的markdown加载最新的
    • 问题2:在一个vue文件中使用了两次cherrymarkdown组件,打开一个之后,另一个位置打开时就会出现空情况
    • 问题3:cherry-markdown中支持虚拟目录toc

前言

博主介绍:✌目前全网粉丝3W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


开发定位

个人开源项目https://gitee.com/changluJava/studio-vue,位于开发分支:feat_1.2.x_fsstudio,提交哈希码:9fff82c76f5a02e0977455fe53d2c560ca4c0ca7


目标

支持cherry markdown语法编辑博文


调研

Quill富文本编辑器

CherryMarkdown (推荐):https://github.com/Tencent/cherry-markdown

  • 推荐

Tinymce富文本编辑器:

可学习案例:ruo-yi-vue-blog:https://gitee.com/Ning310975876/ruo-yi-vue-blog


技术方案

前提

将studio-ui改造为studio-ui-vite为vite版本,引入cherry-markdown没有报错问题。


工作量安排

改造studio_think表

改造studio_race表

改造studio_ccie表


数据库表设计

针对有包含文本内容编辑的都额外支持一个字段:content_markdown

  • 主要包含两个字段存储博文内容:content(博客文章html)、contentMarkdown(博客文章markdown格式内容)

包含有存储内容形式的表如下

studio_ccie:证书表

原字段:ccie_think

studio_race:竞赛表

原字段:race_summarize

studio_think:个人思考表

原字段:content

改造后:
content
content_markdown

实现步骤

1、引入依赖

package.json添加依赖:

"cherry-markdown": "0.8.22"

安装依赖:

npm install --force

2、实现cherry-markdown的vue组件(修改上传接口路径)

在components目录下添加cherry-markdown组件:

image-20240907083535373

修改该组件的上传图片地址:

import commonConfig from "@/api/common.js";

// 图片上传路径修改为自己连接
request.open('POST', commonConfig.uploadAction) // 上传的图片服务器地址

image-20240921012448257

修改上传资源之后的markdown语法:

if (resp.code === 200) {
  if (/mp4|avi|rmvb/i.test(resp.fileSuffix)) {
    imgMdStr = `!video[${resp.data.originName}](${resp.data.visitUrl})`;
  } else if (/mp3/i.test(resp.fileSuffix)) {
    imgMdStr = `!audio[${resp.data.originName}](${resp.data.visitUrl})`;
  } else if (/bmp|gif|jpg|jpeg|png/i.test(resp.fileSuffix)) {
    imgMdStr = `![${resp.data.originName}](${resp.data.visitUrl})`
  } else {
    imgMdStr = `![${resp.data.originName}](${resp.data.visitUrl})`
  }
}

image-20240921012619487


3、支持draw.io组件

支持引入draw.io:引入该drawio目录

image-20240921012715024

效果展示:

image-20240921012746159

实际打开的时候访问的就是我们对应的public下的目录:

image-20240921012955264


4、支持展示悬浮目录toc

原始:

toc: {
  /** 默认只渲染一个目录 */
  allowMultiToc: false
},

修改后:

toc: {
  updateLocationHash: true, // 要不要更新URL的hash
  defaultModel: 'pure', // pure: 精简模式/缩略模式,只有一排小点; full: 完整模式,会展示所有标题
},

前端使用:编辑状态使用cherry-markdown的vue组件

使用方式如下:

<CherryMarkdown ref="CherryMarkdown" :height='400' v-model='blogText.contentMarkdown' ></CherryMarkdown>

import CherryMarkdown from '@/components/CherryMarkdown'

    components: {
      CherryMarkdown
    },
    data() {
      return {
        // 博客内容
        blogText: {
          contentMarkdown: '',
          content: ''
        }
      }
    },
    methods: {
      submitForm() {
        	this.setFormContent()
        	console.log("submitForm=>", this.blogText)
      },
      // 对于markdown的html需要调用对应markdown组件中的getCherryHtml()方法
      setFormContent(){
        this.blogText.content = this.$refs.CherryMarkdown.getCherryHtml()
      },
    }

最终效果演示:

关注这两个内容即可,分别一个是html内容,另一个是markdown内容:

image-20240921011346778


前端使用:展示markdown(对外展示)

代码如下:这里若是仅仅只需要预览,添加该属性即可:defaultModel="'previewOnly'"

<CherryMarkdown v-if="previewOpen" v-model='curThinkMarkdown' :defaultModel="'previewOnly'"></CherryMarkdown>

import CherryMarkdown from '@/components/CherryMarkdown'

    components: {
      CherryMarkdown
    },

效果:

image-20240923093933644


问题解决

问题1:cherrymarkdown不随对应的markdown加载最新的

**场景:**例如编辑打开了一个markdown,此时又编辑打开另一个markdown,此时依旧是原先的markdown内容。

修复方式:

在cherrymarkdown组件中添加watch:

    watch: {
      // 监控 value 属性
      value(newValue, oldValue) {
        // 当 value 发生变化时,这个函数会被调用
        // console.log(`value changed from ${oldValue} to ${newValue}`);
        this.setMarkdown(newValue)
      }
    },  

问题2:在一个vue文件中使用了两次cherrymarkdown组件,打开一个之后,另一个位置打开时就会出现空情况

**场景:**首先打开预览总结的,然后打开添加或编辑的,此时就会为空

image-20240922225805994

image-20240922225817949

解决方案:

在对应的对框中的组件里分别加上v-if随着预览对话框的是否展示而统一进行变动:

image-20240922230832587

此时即可解决该问题。


问题3:cherry-markdown中支持虚拟目录toc

问题描述:

按照网站的配置参数:https://blog.csdn.net/weixin_73480865/article/details/136604029,发现不生效

问题解决:

首先确认你的cherry版本,我一开始是0.8.22,可以找到node_module中对应cherry-markdown的config.js,在配置文件中看是否支持这个toc,若是有下面的配置项就是支持的:

image-20240923081927465

关于cherry团队在github解决的issue:

  • [docs]自定义语法:https://github.com/Tencent/cherry-markdown/issues/620
  • 添加目录在预览时的右侧[Feature Request]:https://github.com/Tencent/cherry-markdown/issues/658

最终经过验证补充的toc配置方式:

toc: true, // 不展示悬浮目录
toc: {
  updateLocationHash: false, // 要不要更新URL的hash
  defaultModel: 'full', // pure: 精简模式/缩略模式,只有一排小点; full: 完整模式,会展示所有标题
  showAutoNumber: false, // 是否显示自增序号
  position: 'fixed', // 悬浮目录的悬浮方式。当滚动条在cherry内部时,用absolute;当滚动条在cherry外部时,用fixed
  cssText: '', // 自定义样式
},

此时右侧出现了toc悬浮目录:

image-20240923093933644


整理者:长路 时间:2024.9.7-9.21

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像转3D视差视频:DepthFlow

参看: https://github.com/BrokenSource/DepthFlow 通过深度图实现图像3d效果 安装 https://brokensrc.dev/get/pypi/#installing pip insatll depthflow shaderflow broken-source pianola spectronote turbopipe 使用 1、下载项目 git clone https://github.com/BrokenS…

巧用armbian定时任务控制开发板LED的亮灭

新买了个瑞莎 3E 开发板,号称最小SBC,到了之后简直玩开了花,各种折腾后 安装好armbian系统,各种调优。 不太满意的地方:由于太小的原因,导致两个USBTYPEC的接口距离很近,所以买的OTG转接口如果有点宽的话 会显得特别拥挤。 还有就是每天晚上天黑了之后,卧室里的…

大数据处理从零开始————4.认识HDFS分布式文件系统

1.分布式文件系统HDFS 1.1 认识HDFS 当单台服务器的存储容量和计算性能已经无法处理大文件时&#xff0c;分布式文件系统应运而生。什么是分布式系统&#xff0c;分布式系统是由多个独立的计算机或节点组成的系统&#xff0c;这些计算机通过网络连接&#xff…

Map: 地图

对全国2023年各省市的人口分布情况&#xff0c;做出地图展示效果 参考&#xff1a;Map - Map_base - Document (pyecharts.org) 1、模板 # -*- coding: gbk -*- from pyecharts import options as opts from pyecharts.charts import Map from pyecharts.faker import Faker…

如何安全地大规模部署 GenAI 应用程序

大型语言模型和其他形式的生成式人工智能(GenAI) 的广泛使用带来了许多组织可能没有意识到的安全风险。幸运的是&#xff0c;网络和安全提供商正在寻找方法来应对这些前所未有的威胁。 随着人工智能越来越深入地融入日常业务流程&#xff0c;它面临着泄露专有信息、提供错误答…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

队列的实现与讲解

一.概念与结构 1.概念 只允许在⼀端进行插⼊数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) ​ 入队列&#xff1a;进⾏插⼊操作的⼀端称为队尾 ​ 出队列&#xff1a;进⾏删除操作的⼀端称为队头 注意&…

美联储巨亏背后的秘密

听说美联储报告称亏损已破2000亿美元&#xff0c;这一数字无疑触动了市场的敏感神经。 亏损的直接原因是美联储在加息周期期间&#xff0c;为了维持短期利率在目标水平&#xff0c;向金融机构支付的利息超过了其持有债券的利息收入。 然而&#xff0c;美联储官员强调&#xff…

学习C语言(23)

整理今天的学习内容 1.文件的概念 使用文件是为了将数据永久化地保存 按照文件功能&#xff0c;在程序设计中一般把文件分成两类&#xff1a; 每个文件都有一个唯一的文字标识&#xff0c;文字标识常被称为文件名&#xff0c;文件名包含文件路径&#xff0c;文件名主干和文件…

如何快速切换电脑的ip地址

在当今的数字化时代&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其重要性日益凸显。无论是出于保护个人隐私的需要&#xff0c;还是为了访问特定的网络服务等&#xff0c;快速切换电脑的IP地址已成为许多用户的迫切需求。本文将为你介绍几种实用的方法&#xff0c;帮…

【Hadoop】改一下core-site.xml和hdfs-site.xml配置就可以访问Web UI

core-site.xml&#xff1a; hdfs-site.xml&#xff1a; 所有的都改为0.0.0.0 就可以访问Web UI 原因&#xff1a; 使用 0.0.0.0 作为绑定地址时&#xff0c;实际会将服务监听在所有可用的网络接口上。这意味着&#xff0c;任何从外部访问的请求都可以通过任何网络适配器连接到…

黑神话:仙童,数据库自动反射魔法棒

黑神话&#xff1a;仙童&#xff0c;数据库自动反射魔法棒 Golang 通用代码生成器仙童发布了最新版本电音仙女尝鲜版十一及其介绍视频&#xff0c;视频请见&#xff1a;https://www.bilibili.com/video/BV1ET4wecEBk/ 此视频介绍了使用最新版的仙童代码生成器&#xff0c;将 …

算法笔记(六)——链表

文章目录 两数相加两两交换链表中的节点重排链表合并 K 个升序链表K个一组翻转链表 技巧: 画图观察指针指向&#xff1b;添加虚拟头节点&#xff1b;可以多定义几个节点&#xff1b;快慢双指针&#xff1b; 常见操作&#xff1a; 定义new head逆序时&#xff0c;头插 ListNode*…

带你深入浅出设计模式:八、适配器模式:代码世界中的万能转换器

此为设计模式第八谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;适配器模式主要解决的问题是已有类的接口与所需的接口不匹配的问题…

[Python学习日记-38] Python 中的函数的名称空间

[Python学习日记-38] Python 中的函数的名称空间 简介 名称空间 作用域查找顺序 简介 在前面学习函数的时候我们发现&#xff0c;函数内部也有一个内存空间是用于存储函数自己的一些变量的&#xff0c;及时这个变量名与外部的变量名一样是也没关系&#xff0c;Python 会优先…

CGLib动态代理和JDK动态代理Demo、ASM技术尝鲜

本文主要介绍CGLib和JDK动态代理的使用&#xff0c;不对源码进行深入分析。代码可直接复制使用。 类型 机制 回调方式 适用场景 效率 JDK动态代理 委托机制。代理类和目标类都实现了同样的接口。InvocationHandler持有目标类。代理类委托InvocationHandler去调用目标类原…

令牌主动失效机制范例(利用redis)注释分析

介绍该机制 令牌生成 在需要限流的场景中&#xff0c;系统会根据一定的速率生成令牌&#xff0c;存储在 Redis 中。可以设定每秒生成的令牌数量。 令牌获取 当用户请求时&#xff0c;系统会从 Redis 中获取令牌。可以使用原子性操作&#xff08;如 DECR&#xff09;来确保令牌…

SHAP分析

SHAP分析&#xff08;SHapley Additive exPlanations&#xff09;是一种基于博弈论的解释机器学习模型输出的方法。它提供了一种统一的方式来解释模型的预测结果&#xff0c;量化每个特征对模型预测的贡献&#xff0c;能够为复杂的机器学习模型&#xff08;如随机森林、梯度提升…

C语言基础(8)之操作符(2)(详解)

目录 1. 操作符汇总表 2. 关系操作符 3. 条件操作符 4. 逗号表达式 5. 下标引用、函数调用和结构成员 5.1 下标引用 5.2 函数调用操作符 5.3 结构成员 6. 操作符的属性 6.1 操作符的优先级 大家好呀&#xff01;上篇文章中我们详细讲解了操作符的前半部分&#xff0c…

【成长day】SuperPointSuperGlue(01): Superpoint论文算法学习与对应源码解析

两年前自己在实习公司做过superpoint相关的工作&#xff0c;当时是负责利用superpoint代替slam前端的特征点部分&#xff0c;来达到把特征点相关的处理放到推理计算平台上减轻CPU压力并且精度无损的目的&#xff0c;最终也是成功完成了这部分工作。但是当时没有留下任何的记录&…