当前位置: 首页 > 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…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...