腾讯的cherry-markdown如何在vue项目中自定义视频播放器?

news/2025/3/19 19:22:16/文章来源:https://www.cnblogs.com/liuscraft/p/18341340

调研

  好久没给维护的社区增加新内容了,想到社区的播放器还是浏览器原生的,看着挺丑的,因此我打算给社区的cherry-markdown渲染的markdown文章里的视频样式给改改。

  首先为了让事情不复杂化,我打算引入西瓜视频播放器(https://h5player.bytedance.com ),它支持的功能挺多的,还能通过插件的形式进行扩展。

  我们已经找好播放器了,那么我还得调研下 cherry-markdown如何实现自定义视频播放器的样式,我们第一时间想到的就是去看看它的仓库中的文档描述以及issue里搜索下有没有人提起过,然后其他开发者是如何解决的。

  功夫不负有心人,我在issue中搜索“video”后,立马在issue list中看到了一个videonative视频播放器(并且还是close的,看来是已经得到了解决!):https://github.com/Tencent/cherry-markdown/issues/746

  我通过这篇issue得知,该markdown在0.8.4之前和之后的实现方案,并且哪个简单和复杂,甚至还贴心的给出了示例,这将大大的提高我的实现速度。那么废话不多说,开始实现。

实现

我为了简单以及看着该markdown项目的发布版本的log来看,修复了挺多内容我就直接讲它更新到最新版本,并且编辑和渲染了一篇文章检查了是否影响我以前的功能是否正常使用(防止升级带来明显bug)


首先我们已经从issue中得知如何自定义html:

engine: {syntax: {image: {videoWrapper: (link, type, defaultWrapper) => {if (type !== 'video')return defaultWrapper;return 自己的视频解析(link);},},}
}

只需要return出去你希望的html内容就算是自定义了,但是我要用vue组件实现一些功能啊!怎么办呢?需要让html内容先渲染出来,拿到html再给这返回出去,我们都知道在vue项目的mian.js里我们会通过createApp(component)得到一个vue app,然后我们可以将组件渲染挂在的 el上,得到vm:调用app.mount(el),挂在最终得到vm,可以通过vm得到最终渲染好的html!它也带有vue的任何能力!但是如果我们的component有用到ui库呢?那需要用这个app.use一下它哦!具体代码如下:

onst renderComponentToHTML = (component, props) => {// 创建一个临时 DOM 元素用于挂载const container = document.createElement('div');// 创建 Vue 应用实例const app = createApp(component, props);app.use(PrimeVue, { ripple: true })// 手动挂载到临时容器const vm = app.mount(container);// 获取生成的 HTMLconst html = container.innerHTML;// 清空临时容器container.innerHTML = '';return html;
}

最终挂载成功效果:
image

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1284. Minimum Number of Flips to Convert Binary Matrix to Zero Matrix

原题链接在这里:https://leetcode.com/problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix/description/ 题目: Given a m x n binary matrix mat. In one step, you can choose one cell and flip it and all the four neighbors of it if they exi…

【安全技术系列】用户实体行为分析(UEBA)

一、背景 数字新时代正在加速全面到来,网络环境变得更加多元、人员变得更复杂、接入方式多种多样,网络边界逐渐模糊甚至消失,同时伴随着企业数据的激增。数字化转型促进组织的业务发展的同时,也带来了重大的网络安全挑战。 1.越来越多的外部攻击,包括被利益驱动或国家驱动…

2024 暑假友谊赛 3

2024 暑假友谊赛 3 A - A CodeForces - 1187E 思路 设 \(f_i\) 表示以 \(i\) 为根的子树产生的贡献,则有 \(f_i=size_i+\sum\limits_{j\in son_i} f_j\),即起初选定 \(i\) 为起点后产生 \(size_i\) 的贡献,后续是它的子树产生的贡献。 但这样以不同根节点去求贡献是 \(O(n^2…

LeetCode 2189. Number of Ways to Build House of Cards

原题链接在这里:https://leetcode.com/problems/number-of-ways-to-build-house-of-cards/description/ 题目: You are given an integer n representing the number of playing cards you have. A house of cards meets the following conditions:A house of cards consists…

全网最适合入门的面向对象编程教程:31 Python的内置数据类型-对象Object和类型Type

Python 中的对象和类型是一个非常重要的概念。在 Python 中,一切都是对象,包括数字、字符串、列表等,每个对象都有自己的类型。全网最适合入门的面向对象编程教程:31 Python 的内置数据类型-对象 Object 和类型 Type摘要: Python 中的对象和类型是一个非常重要的概念。在 Pyt…

Golang语言goroutine协程并发安全及锁机制

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.多协程操作同一数据问题引出二.互斥锁Mutex1 互斥锁概述2使用互斥锁Mutex同步协程三.读写互斥锁RWMutex1 读写互斥锁概述2 读写锁RWMutex引入 一.多协程操作同一数据问题引出package mainimport (&quo…

[rCore学习笔记 021]多道程序与分时任务

写在前面 本随笔是非常菜的菜鸡写的。如有问题请及时提出。 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 导读 这里就是第三章的开头了,由于我的巨菜,导致天天半天理解不了关键点所在,唉,实在是太折磨人. 遵照上一章开头的时候的优良传…

基于FPGA的2FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR

1.算法仿真效果本系统在以前写过的FSK调制解调系统的基础上,增加了高斯信道模块,误码率统计模块,可以验证不同SNR情况下的FSK误码情况。vivado2019.2仿真结果如下(完整代码运行后无水印):SNR=16dbSNR=10dbSNR=5dbSNR=0dbRTL结构图如下:2.算法涉及理论知识概要频移键控是…

Contest5400 - 网络流-1

RTContest A 签到题 B 最大流 Dinic 板子。 Dinic 的整体结构: ll dinic() {ll ans = 0;while (bfs()) { // 如果 s 还有能到 t 的增广路fill(cur+1, cur+n+1, 0); // 当前弧优化的预处理,暂时不用管ans += dfs(s, INF); // 多路增广}return ans; }BFS 建分层图: bool bfs()…

MySQL45讲基础篇

基础篇 01 | 基础架构:一条SQL查询语句是如何执行的? 你好,我是林晓斌。 这是专栏的第一篇文章,我想来跟你聊聊 MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平…