uniapp中解析markdown支持网页和小程序

news2024/9/26 1:16:20

对于markdown相信大家都不陌生,日常写文档或日常记录都用到的比较多,书写的是markdown的格式,实时预览的是转换后的html样式。本次实现的需求是在uniapp中转换markdown文本展示在不同的平台,主要平台是浏览器使用和微信小程序使用。

对于这两个平台目前没有一个比较通用的解决方案,本次实现也是针对不同的平台单独实现,以下就是具体的实现过程。

浏览器实现

浏览器实现主要基于marked,由于文本中会存在对代码的转换,所以还需要增加highlight.js处理代码高亮的情况。另外为了保障HTML的安全性,增加了DOMPurify库过滤HTML,DOMPurify可过滤不可信HTML和保护应用程序免受恶意用户输入来帮助防止跨站脚本攻击(XSS攻击)。

核心依赖包安装如下:

npm install marked --save
npm install dompurify --save
npm install highlight.js --save

核心依赖包引用如下:

import { marked } from 'marked';
import DOMPurify from 'dompurify';
import hljs from "highlight.js/lib/common";
// 代码主体样式文件
import 'highlight.js/styles/github.css';

marked使用前先进行初始配置初始化:

marked.setOptions({
    renderer: new marked.Renderer(),
    highlight: function(code) {
        return hljs.highlightAuto(code).value;
    },
    pedantic: false,
    gfm: true,
    tables: true,
    breaks: false,
    sanitize: false,
    smartLists: true,
    smartypants: false,
    xhtml: false
});

然后即可对原始markdown文本进行html转换和安全过滤:

this.html = DOMPurify.sanitize(marked.parse(text));

转换之后的数据在html中渲染展示:

<div v-html="parseHtml"></div>

到此浏览器端实现就完成了,基本实现流程相对比较简单。默认引入的样式不一定满足需求,可通过覆盖样式重写,这个在小程序端也是同理。

微信小程序实现

微信小程序里面实现较为复杂一些,主要是基于Towxml 3.0实现。首先需要克隆项目到本地或直接到项目地址下载压缩包。

git clone https://github.com/sbfkcel/towxml.git

安装依赖后在本地执行build编译代码

npm install
npm run build

新构建出来的文件在dist目录下,把构建好的文件夹dist改名为towxml,在uni-app项目根目录中新建wxcomponents目录,将towxml复制进去即可。

towxml/decode.json中默认引入的组件依赖有些是用不上的,可以根据实际的情况进行删改。

towxml

{
  "component": true,
  "usingComponents": {
    "decode": "./decode",
    "audio-player": "./audio-player/audio-player",
    "echarts": "./echarts/echarts",
    "latex": "./latex/latex",
    "table": "./table/table",
    "todogroup": "./todogroup/todogroup",
    "yuml": "./yuml/yuml",
    "img": "./img/img"
  }
}

下一步需要在需要使用的页面pages.json中添加组件配置,引入towxml组件。

{
  "path": "pages/page/page",
  "style": {
  "usingComponents": {
  	"towxml": "/wxcomponents/towxml/towxml"
  }
}

由于本次需求中会在多个页面中使用,已经将markdown抽离到公共组件。所以将其配置到全局globalStyle中:

"globalStyle": {
    // #ifdef MP-WEIXIN
    "usingComponents": {
        "towxml": "/wxcomponents/towxml/towxml",
        "decode": "/wxcomponents/towxml/decode"
    },
    // #endif
}

html中使用towxml组件

<towxml :nodes="html" />

在JS中markdown转换赋值:

import towxml from "../wxcomponents/towxml/index.js"
this.html = towxml(text, 'markdown')

到此基本的转换功能就实现完成了,由于小程序端和浏览器端是通过不同的实现方式,导致对应展示的UI也有所区别,小程序端的UI重写可以修改 wxcomponents / towxml / style / theme 中的样式文件即可。

上线效果预览:

最后

本文介绍了如何在uni-app框架中解析Markdown,并且支持在网页和小程序端展示。在小程序端的实现过程还是踩了不少坑,浏览器端实现相对简单也比较成熟,有兴趣的可以自己尝试看看。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

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

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

相关文章

Instagram安全运营的10条策略

Instagram每月活跃用户15亿&#xff0c;是跨境外贸开发客户与广告引流的常用工具。本文总结10条Instagram运营基本策略与原则&#xff0c;帮助各位跨境人更好的了解平台规则&#xff0c;规避风险&#xff0c;提高投放效率&#xff01; 1、使用商业账号 企业在instagram 上进行…

北斗RTK高精度定位技术原理及优势

北斗RTK&#xff08;Real-Time Kinematic&#xff09;高精度定位技术是一种利用卫星导航系统进行实时定位的方法&#xff0c;它通过测量卫星信号的相位差来获得非常精确的位置信息。其原理和优势如下&#xff1a; 原理&#xff1a; 1. 载波相位差测量&#xff1a; RTK技术通过…

卷积过程详细讲解

1&#xff1a;单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道&#xff0c;宽为5&#xff0c;高为5。假设卷积核大小为3x3&#xff0c;padding0&#xff0c;stride1。 卷积过程如下&#xff1a; 相应的卷积核不断…

保姆级教程之VMD-SABO-KELM优化核极限学习机的西储大学轴承诊断

从数据处理&#xff0c;优化VMD特征提取&#xff0c;再到SABO&#xff08;减法平均优化器&#xff09;优化核极限学习机的故障诊断&#xff0c;实现故障诊断的全流程&#xff0c;其他类型的故障诊断均可参考此流程。 友情提示&#xff1a;对于刚接触故障诊断的新手来说&#xf…

安装Node(脚手架)

目录 一&#xff0c;安装node&#xff08;脚手架&#xff09;1.1&#xff0c; 配置vue.config.js1.2&#xff0c; vue-cli3x的目录介绍1.3&#xff0c; package.json 最后 一&#xff0c;安装node&#xff08;脚手架&#xff09; 从官网直接下载安装即可&#xff0c;自带npm包管…

spring依赖注入详解(下)

Autowired注解依赖注入过程 一、findAutowireCandidates()实现 找出BeanFactory中类型为type的所有的Bean的名字&#xff0c;注意是名字&#xff0c;而不是Bean对象&#xff0c;因为我们可以根据BeanDefinition就能判断和当前type是不是匹配&#xff0c;不用生成Bean对象把re…

【多天线传输技术】BPSK调制信号在复高斯瑞利信道下Alamouti的误码率分析

%% [预处理] clc; clear; close all;%% [配置参数] N3000000; %数据点数&#xff08;个&#xff09; SNR_dB0:1:45; %信噪比&#xff08;dB形式&#xff09; SNR10.^(SNR_dB/10); %信噪比&#xff08;一般形式&#xff0c;Eb/N0&#xff09; Ps1; …

Linux Day10 ---Mybash

目录 一、Mybash介绍 1.1.mybash.c 打印函数 分割函数 命令函数 二、Mybash实现 2.1.打印函数 2.1.1需要使用到的功能函数 1.获取与当前用户关联的UID 2.获取与当前用户的相关信息---一个结构体&#xff08;passwd&#xff09; 3.获取主机信息 4.获取当前所处位置 5.给…

论文阅读 FOCUS-AND-DETECT: A SMALL OBJECT DETECTION FRAMEWORK FOR AERIAL IMAGES

文章目录 FOCUS-AND-DETECT: A SMALL OBJECT DETECTION FRAMEWORK FOR AERIAL IMAGESABSTRACT1 Introduction2 Related Work3 Focus-and-Detect3.1 Overview3.2 Focus Stage3.2.1 Generating Ground-Truth Boxes of Focal Regions Using Gaussian Mixture Model 3.3 Detection …

物种气候生态位动态量化与分布特征模拟

在全球气候快速变化的背景下&#xff0c;理解并预测生物种群如何应对气候变化&#xff0c;特别是它们的地理分布如何变化&#xff0c;已经变得至关重要。利用R语言进行物种气候生态位动态量化与分布特征模拟&#xff0c;不仅可以量化描述物种对环境的需求和适应性&#xff0c;预…

StableVideo:使用Stable Diffusion生成连续无闪烁的视频

使用Stable Diffusion生成视频一直是人们的研究目标&#xff0c;但是我们遇到的最大问题是视频帧和帧之间的闪烁&#xff0c;但是最新的论文则着力解决这个问题。 本文总结了Chai等人的论文《StableVideo: Text-driven consistency -aware Diffusion Video Editing》&#xff…

高性能网络模式-Reactor

事实上&#xff0c;Reactor 模式也叫Dispatcher模式&#xff0c;即I/O 多路复⽤监听事件&#xff0c;收到事件后&#xff0c;根据事件类型分配&#xff08;Dispatch&#xff09;给某个进程/线程。Reactor 模式也是一种非阻塞同步网络模式。 Reactor 模式主要由 Reactor部分和处…

Django基础3——视图函数

文章目录 一、基本了解1.1 Django内置函数1.2 http请求流程 二、HttpRequest对象&#xff08;接受客户端请求&#xff09;2.1 常用属性2.2 常用方法2.3 服务端接收URL参数2.4 QueryDict对象2.5 案例2.5.1 表单GET提交2.5.2 表单POST提交2.5.3 上传文件 三、HttpResponse对象&am…

NV PTX ISA 文档的增量说明

无它&#xff0c;维截图尔&#xff0c;汇总一下&#xff0c;找找规律&#xff1b; cuda 12.0 PTX 8.0 关键字&#xff1a; 从cuda 8.0开始&#xff1a; 显然&#xff0c;每次增量的主要因素是对应着对新的硬件功能的提炼&#xff1b;

构建 NodeJS cinema API 网关并部署到 Docker(04/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 我们前几章的快速回顾 第一篇文章介绍了微服务架构模式&#xff0c;并讨论了使用微服务的优缺点。第二篇…

Unity报错DllNotFoundException:sqlite3

Unity项目中要使用轻型数据库sqlite&#xff0c;除了导入sqlite3.dll外&#xff0c;还需要导入Mono.Data.Sqlite.dll和System.Data.dll&#xff08;工程里或者编辑器里面有System.Data.dll时就不需要&#xff09;两个文件。 如果在编辑器中运行出现 “DllNotFoundException:sql…

pyside6最小化的核心调用代码

pyside6最小化的核心调用代码&#xff1a; 一、格式代码 你认为是 制式代码&#xff0c;下面图中的就是核心代码&#xff0c;以后就是这样记住以及使用即可 二、图形代码【生成代码】 2.1designer设计界面 2.2设计的界面转换为代码 注意图纸划线的地方&#xff0c;后续导入…

卓码软件测评简析:软件压力测试工具和流程有哪些?

在软件开发过程中&#xff0c;压力测试是非常重要的一项工作&#xff0c;它可以帮助客户评估软件系统在正常或异常负载下的性能表现。在这个领域&#xff0c;有很多不同的工具可供选择&#xff0c;每个工具具有其独特的特点和优势。那么常见的压力测试工具有哪些以及进行压力测…

外网访问家里虚拟机的两种方法

从外网访问家里虚拟机的两种方法 起因 在公司&#xff0c;当我不想干的时候就想着跑路&#xff0c;但是自己又太菜了&#xff08;饭碗要紧&#xff09;&#xff0c;所以想通过ssh登录到自己的家里一台linux上&#xff0c;去敲一敲 linux命令&#xff0c;sql命令&#xff0c;do…

Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

我们都之前在封装mobx作为数据存储的时候&#xff0c;使用到了useContext作为包裹&#xff0c;将store变成了一个hooks使用&#xff0c;封装代码: import React from react import UserInfo from ./user import Setting from ./seting import NoteStore from ./noteclass Stor…