【vue+marked】marked
一、使用marked
第一步:下载marked和代码块高亮highlight.js
npm i markednpm i highlight.jsnpm i markdown-loadernpm i github-markdown-css
第二步:注册并使用
main.js
import hljs from "highlight.js";
import "github-markdown-css";
import "highlight.js/styles/atom-one-dark.css";Vue.directive("highlight", function (el) {let blocks = el.querySelectorAll("pre code");blocks.forEach((block) => {hljs.highlightBlock(block);});
});
页面内使用
1、其中class的markdown-body是必须要带的,marked的样式,同时如果需要修改样式,也可以通过此修改
2、v-highlight全局注册代码块高亮
3、自定义渲染器我是需要改变标题转换,如果你们有需要可以自行处理
<template><div id="Mindopt" class="Mindopt"><div v-highlight class="replybox markdown-body" v-html="Mindoptinfo"></div></div>
</template><script>
// 创建自定义渲染器
class CustomRenderer extends marked.Renderer {heading (text, level) {// 将一级标题转换为h1标签if (level === 1) {return `<h1 class="hClass"># ${text}</h1>`;} else if (level === 2) {return `<h2 class="hClass">## ${text}</h2>`;} else if (level === 3) {return `<h3 class="hClass">### ${text}</h3>`;} else if (level === 4) {return `<h4 class="hClass">#### ${text}</h4>`;} else if (level === 5) {return `<h5 class="hClass">##### ${text}</h5>`;} else if (level === 6) {return `<h6 class="hClass">###### ${text}</h6>`;}}// text (text) {// console.log(text);// }// code (code, language, isEscaped) {// console.log(language);// if (language && language === 'math') {// return katex.renderToString(code, { throwOnError: false });// }// return marked.Renderer.prototype.code.call(renderer, code, language, isEscaped);// };
}
// 使用自定义渲染器
const renderer = new CustomRenderer();
const markedOptions = {renderer: renderer,breaks: true,
};
import { marked } from "marked";
import { getoptInfo, getGroupMessage, updataGroup, deleteGroupMessages } from '@/api/Mindopt'
export default {name: 'Mindopt',data () {return {Mindoptinfo: '',}},created () {this.getoptInfo()},methods: {// 获取信息async getoptInfo () {const res = await getoptInfo()this.Mindoptinfo = res.datathis.Mindoptinfo = marked(this.Mindoptinfo, markedOptions);},}
}
</script><style lang="scss">
// 回答的格式或者数据回显的格式
.markdown-body {// font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,// Microsoft YaHei, Arial, sans-serif !important;// line-height: 20px;// & ul {// list-style: none;// padding-left: 20px;// }color: #000 !important;p {margin-top: 10px !important;margin-bottom: 10px !important;}pre {padding: 5px !important;margin-bottom: 10px !important;}.hljs {color: #abb2bf;background: #282c34;}.hClass {//出现#则不转换为h1等标签font-size: 16px;color: #8a2328;font-weight: 600;margin: 10px 0;}/* 只改变普通 code 标签的颜色,不影响 pre 中的 code */code:not(pre) {color: red;font-weight: 600;background-color: rgba(175, 184, 193, 0.3);margin: 0 5px;}a {color: #1d71f7 !important;}
}
</style>
二、代码块和块引用添加复制按钮
页面使用
<template><div id="Mindopt" class="Mindopt"><div v-highlight class="replybox markdown-body" v-html="Mindoptinfo"></div></div>
</template><script>
import CodeCopy from './CodeCopy.vue'
export default {name: 'Mindopt',data () {return {Mindoptinfo: '',}},updated () {this.update()},methods: {//获取对应markdown代码块标签update () {setTimeout(() => {// 代码块添加复制按钮document.querySelectorAll('pre').forEach(el => {// console.log(el)if (el.classList.contains('code-copy-added')) return// https://cn.vuejs.org/v2/api/index.html#Vue-extend/* 使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象 */let ComponentClass = Vue.extend(CodeCopy)let instance = new ComponentClass()instance.code = el.innerTextinstance.parent = el/* 手动挂载 */instance.$mount()el.classList.add('code-copy-added')el.appendChild(instance.$el)})// 块引用添加复制按钮document.querySelectorAll('blockquote').forEach(el => {// console.log(el)if (el.classList.contains('code-copy-added')) return// https://cn.vuejs.org/v2/api/index.html#Vue-extend/* 使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象 */let ComponentClass = Vue.extend(CodeCopy)let instance = new ComponentClass()instance.code = el.innerTextinstance.parent = el/* 手动挂载 */instance.$mount()el.classList.add('code-copy-added')el.appendChild(instance.$el)})}, 100)},}
}
</script><style lang="scss">
// 复制按钮
.codeContent {max-width: 400px;margin: 0 auto;padding-top: 25vh;
}
.code-copy-added {background-color: #282c34;color: white;padding: 25px 20px;margin: 10px 0;text-align: left;border-radius: 3px;position: relative;
}
.code-copy-added:hover .copy-btn {opacity: 1;
}
</style>
CodeCopy.vue
<template><div class="copy-content"><!-- 复制按钮 --><divclass="copy-btn code-data-copy"@click="copyMessage"data-clipboard-action="copy":data-clipboard-text="code">复制</div><!-- <div v-if="success" class="copy-success-text">复制成功!</div> --></div>
</template><script>
import Clipboard from 'clipboard' //复制插件
export default {data () {return {code: null,// success: false}},methods: {copyMessage (value) {let _this = this// _this.success = falselet clipboard = new Clipboard('.code-data-copy')clipboard.on('success', function (e) {_this.$message.success('复制成功')// _this.success = true// setTimeout(() => {// _this.success = false// }, 300)clipboard.destroy() // 销毁,避免多次点击重复出现})clipboard.on('error', function () {console.log('复制失败')})}}
}
</script><style lang="scss" scoped>
.copy-content {height: 0;// position: absolute;// top: 0;// right: 0;
}.icon {width: 0.8rem;height: 0.8rem;fill: white;
}
.copy-btn {user-select: none;opacity: 0;position: absolute;right: 5px;top: 5px;cursor: pointer;padding: 5px;border-radius: 3px;transition: 0.3s;// background: rgba(255, 255, 255, 0.2);background: #fff;&:active {// background: rgba(253, 253, 253, 0.575);background: rgba(253, 253, 253, 0.575);}
}
.copy-success-text {color: white;position: absolute;font-size: 12px;top: 8px;right: 2.5rem;font-weight: 200;font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;animation: successCopy 0.5s ease both 1;
}
@keyframes successCopy {70% {opacity: 1;transform: scale(1);}100% {opacity: 0;transform: scale(0.5);}
}
</style>
相关文章:
【vue+marked】marked
一、使用marked 第一步:下载marked和代码块高亮highlight.js npm i markednpm i highlight.jsnpm i markdown-loadernpm i github-markdown-css 第二步:注册并使用 main.js import hljs from "highlight.js"; import "github-markdow…...
无人机之热成像篇
一、定义 无人机热成像技术是指将热成像相机安装在无人机云台上,通过无人机的高空飞行能力和云台的稳定性,结合红外热成像技术对目标区域进行非接触式的温度测量和图像采集。该技术利用物体发出的红外辐射来生成图像,通过测量物体表面温度分布…...
浅谈C/C++指针和引用在Linux和Windows不同环境下的编码风格
目录 0. 前言 1. 代码块、函数体上的 { } 的规范 2. 指针和引用中的 * 和 & 符号的位置 1. Linux 环境下编码风格(gcc) 2. Windows 环境下编码风格(Visual Studio) 3. 简单总结 0. 前言 C/C因为高度的自由性,并没有对一些常见的编码风格进行限制&#…...
【C#】一个项目移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF,解决方法
文章目录 1 问题分析2 本文解决方法 一个项目可以正常运行编译的项目,所有路径均为相对路径。 移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF, 1 问题分析 这个错误信息表明在处理文件时,Files 的值出…...
代码随想录算法训练营第五十八天|拓扑排序精讲 、dijkstra(朴素版)精讲
拓扑排序 117. 软件构建 from collections import deque, defaultdictdef topological_sort(n, edges):inDegree [0] * n # inDegree 记录每个文件的入度umap defaultdict(list) # 记录文件依赖关系# 构建图和入度表for s, t in edges:inDegree[t] 1umap[s].append(t)# 初…...
【ARM】ULINK Pro如何和SWD接口进行连接调试
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决ULINK Pro和JTAR接口进行连接问题。 2、 问题场景 因为ULINK Pro本身自带的接口是Cortex-M ETM Interface 20-pin Connector。所以无法和JTAR接口直接进行连接。 图2-1 3、软硬件环境 1)、软件版…...
react框架安全设计
react框架安全设计 1、易受攻击的React版本 React库在过去有一些严重性很高的漏洞,因此最好保持稳定版中的最新版本。 2、数据绑定 使用默认的{}进行数据绑定,React会自动对值进行转义以防止XSS攻击。但注意这种保护只在渲染textContent时候有用,渲染 HTML attributes的…...
Kafka生产调优实践。Kafka消息安全性、消息丢失、消息积压、保证消息顺序性
文章目录 搭建Kafka监控平台合理规划Kafka部署环境合理优化Kafka集群配置优化Kafka客户端使用方式合理保证消息安全消费者防止消息重复消费 生产环境常见问题分析消息零丢失方案消息积压如何处理如何保证消息顺序 搭建Kafka监控平台 官网地址 下载efak-web-3.0.2-bin.tar.gz安…...
DDColor部署安装,在服务器Ubuntu22.04系统——点动科技
DDColor图片上色项目的部署安装,在服务器Ubuntu22.04系统——点动科技 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表:2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动…...
使用 SSL/TLS 加密保障 RocketMQ 的安全传输
引言 在现代分布式系统中,数据传输的安全性至关重要。Apache RocketMQ作为一款高性能、高吞吐量的消息中间件,在许多关键应用场景中被广泛使用。为了确保消息传输的安全性,SSL/TLS 加密提供了一种可靠的解决方案。本文将详细介绍如何在 Rock…...
uni-app开发
参考帖 uniapp官方文档 组件库 项目中肯定需要使用第三方组件库,因为现有的这些不够方便我们去使用 uview: 演示 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 ThorUI: 介绍 | ThorUI文档 创建uni-app项目 有HBuilder…...
2024社招面经_存储DB广告架构方向
总结 第一次社招,主要是三四月份面的,offer的有高德、拼多多、腾讯、美团、快手、携程,后面面的比较累了,因为美团定级和涨幅都还行就去了美团,没再继续面别的。 因为时间比较久了,只在这里贴一下当时有记…...
android10 系统定制:增加应用锁功能
实现效果如下,上锁应用在桌面或最近任务打开弹出解锁界面,需要解锁成功才能打开应用。解锁界面可点击返回或Home键关闭,非上锁应用可直接打开。 基本思路:拦截系统应用启动,判断应用是否在锁住状态,弹出解锁Window。解锁完成后再正常启动应用。分为从桌面启动和最近任务…...
数据结构----队列
一、队列 1)队列定义 队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 允许插入的端是队尾,允许删除的端是队头。队列是一个先进先出(FIFO)的线性表,相应 的也有顺序存储和链式存储两种方式。 2&#…...
【python】实现对文件夹中的图像连续重命名方法
import os import shutildef rename_images(input_folder):# 获取输入文件夹下的所有图片文件(假设都是.jpg格式)image_files [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f)) and f.endswith(".jpg"…...
【nginx 第一篇章】认识一下 NGINX 服务器
一、简介 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。由俄罗斯程序员 Igor Sysoev 开发,并在2004年首次公开发布。Nginx 以其高并发处理能力、低内存消耗、稳定性、丰富的功能集、简单的配置以及低学…...
【物联网】(防水篇)哪些电子产品需要通过 IPX7 防水级别测试?
哪些电子产品需要通过 IPX7 防水级别测试? 举例一些可能需要通过 IPX7 防水级别测试的产品 - 电子产品:如智能手机、平板电脑、智能手表、运动手环等,以满足用户在不同场景下的使用需求,例如在潮湿环境或意外沾水时仍能正常工作。…...
高级java每日一道面试题-2024年8月09日-网络篇-什么是XSS攻击如何避免?
如果有遗漏,评论区告诉我进行补充 面试官: 什么是XSS攻击如何避免? 我回答: XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web应用程序安全漏洞,攻击者通过在网页中注入恶意脚本,当其他用户浏览这些网页时&…...
Linux时间管理:命令与脚本的完美结合
目录 前言 Linux时间管理命令 date命令 cron定时任务 at命令 sleep命令 脚本与时间命令的结合使用 备份脚本示例 设置cron任务 监控脚本执行时间 结论 致谢 前言 在Linux系统中,时间管理是一项基础而关键的任务。无论是安排周期性的备份、监控任务的执…...
基于ssm+vue+uniapp的微信外卖小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
【WRF-Chem工具】grid_finn_fire_emis_v2020 工具官方用户指南解析
目录 1. 工具概述 (General Introduction)2. 针对 WRF 用户的特别说明 (SPECIAL NOTES FOR WRF)A. 输出文件与烟羽抬升 (Plume Rise)B. 变量、单位与植被类型C. 运行前提条件(非常重要)D. 时间分辨率与日变化E. WRF namelist.input 配置要求 3. fire_emi…...
终极EdgeRemover指南:专业卸载Windows Edge浏览器的完整解决方案
终极EdgeRemover指南:专业卸载Windows Edge浏览器的完整解决方案 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover EdgeRemover是一款专业的P…...
OpenClaw+千问3.5-9B学习助手:自动整理课程笔记与生成测验
OpenClaw千问3.5-9B学习助手:自动整理课程笔记与生成测验 1. 为什么需要AI学习助手? 去年备考PMP认证时,我每天需要处理3-4小时的视频课程。最痛苦的环节不是听课,而是课后整理:暂停视频记录重点、梳理知识框架、制作…...
比话降AI和嘎嘎降AI哪个好知网用户怎么选
比话降AI和嘎嘎降AI是2026年降AI率工具里被讨论最多的两款。两款都有真实用户实测数据,都有退款保障,都不是"交学费型"的工具。 但它们不一样,适合不同的人。 这篇文章专门从知网用户的角度来对比,说清楚什么情况选比…...
如何用CodeMaker将Java/Scala开发效率提升300%?5个核心技巧带你掌握智能代码生成
如何用CodeMaker将Java/Scala开发效率提升300%?5个核心技巧带你掌握智能代码生成 【免费下载链接】CodeMaker A idea-plugin for Java/Scala, support custom code template. 项目地址: https://gitcode.com/gh_mirrors/co/CodeMaker 作为Java/Scala开发者&a…...
MFC界面现代化---自定义标题栏与控件美化实战
1. 为什么需要MFC界面现代化改造 很多老牌企业软件和工业控制系统都基于MFC框架开发,这些系统通常运行了十几年甚至更久。我接手过不少这类项目,最直观的感受就是界面实在太"复古"了——灰底蓝框的窗口、生硬的按钮、像素感明显的图标…...
Windows右键菜单终极清理指南:3步让你的右键菜单重获新生
Windows右键菜单终极清理指南:3步让你的右键菜单重获新生 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为每次右键点击文件时弹出的杂乱菜单而…...
从数据孤岛到智能决策中枢:一体化系统如何重构 HR 数据流
去年某制造企业 HR 总监跟我抱怨:员工入职要在招聘系统录一遍信息,转正时人事系统再录一遍,发工资时薪酬系统又要重新核对。三个系统互不相通,一个员工的完整档案要从三个地方拼凑。这不是个例,而是很多企业正在经历的…...
重要提醒:2026年6月PMP考试报名时间已确定
2026年4月2日,中国国际人才交流基金会与PMI(项目管理协会)联合发布官方通知,明确中国大陆地区2026年第二期PMP认证考试将于6月14日正式举办,且本次考试中文报名将分地区、分批次开放,核心报名时间为4月16日…...
保姆级教程:用sw_urdf_exporter插件将Solidworks机械臂模型转为ROS可用的URDF
从Solidworks到ROS:机械臂URDF转换全流程实战指南 机械臂作为工业自动化和服务机器人的核心部件,其运动仿真在ROS生态中占据重要地位。许多工程师习惯使用Solidworks进行机械结构设计,却苦于如何将设计成果无缝迁移到ROS环境。本文将彻底解决…...
