当前位置: 首页 > news >正文

【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 第一步&#xff1a;下载marked和代码块高亮highlight.js npm i markednpm i highlight.jsnpm i markdown-loadernpm i github-markdown-css 第二步&#xff1a;注册并使用 main.js import hljs from "highlight.js"; import "github-markdow…...

无人机之热成像篇

一、定义 无人机热成像技术是指将热成像相机安装在无人机云台上&#xff0c;通过无人机的高空飞行能力和云台的稳定性&#xff0c;结合红外热成像技术对目标区域进行非接触式的温度测量和图像采集。该技术利用物体发出的红外辐射来生成图像&#xff0c;通过测量物体表面温度分布…...

浅谈C/C++指针和引用在Linux和Windows不同环境下的编码风格

目录 0. 前言 1. 代码块、函数体上的 { } 的规范 2. 指针和引用中的 * 和 & 符号的位置 1. Linux 环境下编码风格(gcc) 2. Windows 环境下编码风格(Visual Studio) 3. 简单总结 0. 前言 C/C因为高度的自由性&#xff0c;并没有对一些常见的编码风格进行限制&#…...

【C#】一个项目移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF,解决方法

文章目录 1 问题分析2 本文解决方法 一个项目可以正常运行编译的项目&#xff0c;所有路径均为相对路径。 移动了位置&#xff0c;或者换到其他电脑上&#xff0c;编译报错 Files 的值“IGEF&#xff0c; 1 问题分析 这个错误信息表明在处理文件时&#xff0c;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&#xff09;、软件版…...

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图片上色项目的部署安装&#xff0c;在服务器Ubuntu22.04系统——点动科技 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动…...

使用 SSL/TLS 加密保障 RocketMQ 的安全传输

引言 在现代分布式系统中&#xff0c;数据传输的安全性至关重要。Apache RocketMQ作为一款高性能、高吞吐量的消息中间件&#xff0c;在许多关键应用场景中被广泛使用。为了确保消息传输的安全性&#xff0c;SSL/TLS 加密提供了一种可靠的解决方案。本文将详细介绍如何在 Rock…...

uni-app开发

参考帖 uniapp官方文档 组件库 项目中肯定需要使用第三方组件库&#xff0c;因为现有的这些不够方便我们去使用 uview&#xff1a; 演示 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 ThorUI&#xff1a; 介绍 | ThorUI文档 创建uni-app项目 有HBuilder…...

2024社招面经_存储DB广告架构方向

总结 第一次社招&#xff0c;主要是三四月份面的&#xff0c;offer的有高德、拼多多、腾讯、美团、快手、携程&#xff0c;后面面的比较累了&#xff0c;因为美团定级和涨幅都还行就去了美团&#xff0c;没再继续面别的。 因为时间比较久了&#xff0c;只在这里贴一下当时有记…...

android10 系统定制:增加应用锁功能

实现效果如下,上锁应用在桌面或最近任务打开弹出解锁界面,需要解锁成功才能打开应用。解锁界面可点击返回或Home键关闭,非上锁应用可直接打开。 基本思路:拦截系统应用启动,判断应用是否在锁住状态,弹出解锁Window。解锁完成后再正常启动应用。分为从桌面启动和最近任务…...

数据结构----队列

一、队列 1&#xff09;队列定义 队列(Queue)是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 允许插入的端是队尾&#xff0c;允许删除的端是队头。队列是一个先进先出(FIFO)的线性表&#xff0c;相应 的也有顺序存储和链式存储两种方式。 2&#…...

【python】实现对文件夹中的图像连续重命名方法

import os import shutildef rename_images(input_folder):# 获取输入文件夹下的所有图片文件&#xff08;假设都是.jpg格式&#xff09;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 和反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。由俄罗斯程序员 Igor Sysoev 开发&#xff0c;并在2004年首次公开发布。Nginx 以其高并发处理能力、低内存消耗、稳定性、丰富的功能集、简单的配置以及低学…...

【物联网】(防水篇)哪些电子产品需要通过 IPX7 防水级别测试?

哪些电子产品需要通过 IPX7 防水级别测试&#xff1f; 举例一些可能需要通过 IPX7 防水级别测试的产品 - 电子产品&#xff1a;如智能手机、平板电脑、智能手表、运动手环等&#xff0c;以满足用户在不同场景下的使用需求&#xff0c;例如在潮湿环境或意外沾水时仍能正常工作。…...

高级java每日一道面试题-2024年8月09日-网络篇-什么是XSS攻击如何避免?

如果有遗漏,评论区告诉我进行补充 面试官: 什么是XSS攻击如何避免? 我回答: XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的Web应用程序安全漏洞&#xff0c;攻击者通过在网页中注入恶意脚本&#xff0c;当其他用户浏览这些网页时&…...

Linux时间管理:命令与脚本的完美结合

目录 前言 Linux时间管理命令 date命令 cron定时任务 at命令 sleep命令 脚本与时间命令的结合使用 备份脚本示例 设置cron任务 监控脚本执行时间 结论 致谢 前言 在Linux系统中&#xff0c;时间管理是一项基础而关键的任务。无论是安排周期性的备份、监控任务的执…...

基于ssm+vue+uniapp的微信外卖小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...