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

react native中markdown添加数学公式的支持

在react native中实现markdown最佳选择当然是 react-native-markdown-display,不过有一个问题是它不支持数学公式的显示,我的解决方法是通过rules和markdownit属性进行功能扩展
需要安装的lib

 "katex": "^0.16.22","markdown-it-math": "^4.1.1","markdown-it-texmath": "^1.0.0","react-native-mathjax-svg": "^0.9.9",

功能代码如下:

import React, { useMemo, useCallback } from 'react';
import {Linking, ScrollView, StyleSheet, Text, View} from "react-native";
import Toast from "react-native-simple-toast";
import Markdown, {ASTNode,MarkdownIt,RenderRules,
} from "react-native-markdown-display";
import MathJax from 'react-native-mathjax-svg'
import MarkdownItMath from "markdown-it-math";// 简易 Markdown 预览组件
interface MarkdownViewProps {markdown: string;scrollable?: boolean;
}function MarkdownView({ markdown, scrollable = false }: MarkdownViewProps) {const markdownStyles = useMemo(() => StyleSheet.create({body: {color: '#333',fontSize: 16,lineHeight: 24,flexWrap:'wrap',backgroundColor:'green',overflow:'scroll'},heading1: {fontSize: 24,fontWeight: 'bold',marginVertical: 8,color: 'red',},heading2: {fontSize: 20,fontWeight: 'bold',marginVertical: 8,color: 'blue',},heading3: {fontSize: 18,fontWeight: 'bold',marginVertical: 6,color: 'green',},paragraph: {marginVertical: 8,fontSize: 14,lineHeight: 20,color: '#2E3742',},list_item: {marginVertical: 4,fontSize: 14,},code_inline: {backgroundColor: '#f1f1f1',color: '#e53935',borderRadius: 3,paddingHorizontal: 4,},code_block: {backgroundColor: '#f5f5f5',padding: 12,borderRadius: 6,marginVertical: 8,fontSize: 14,},blockquote: {borderLeftWidth: 4,borderLeftColor: '#3465F5',paddingLeft: 12,marginVertical: 8,backgroundColor: '#F8F9FA',paddingVertical: 6,borderRadius: 4,},link: {color: '#3465F5',textDecorationLine: 'underline',},bullet_list: {marginLeft: 8,},ordered_list: {marginLeft: 8,},}), []);const markdownItInstance = new MarkdownIt({typographer: true,}).use(MarkdownItMath, {inlineOpen: '$',inlineClose: '$',blockOpen: '$$',blockClose: '$$',}).use(MarkdownItMath, {inlineOpen: '\\(',inlineClose: '\\)',blockOpen: '\\[',blockClose: '\\]',})const renderEquation = (node: ASTNode) => {return  <MathJax key={node.key}>{node.content}</MathJax>}const rules: RenderRules = {math_inline: renderEquation,math_block: renderEquation,textgroup: (node, children) => {return (<Text key={node.key} selectable={true}>{children}</Text>)},}const MarkdownContent = useMemo(() => (<Markdownstyle={markdownStyles}rules={rules}markdownit={markdownItInstance}>{markdown}</Markdown>), [markdown, markdownStyles]);if (scrollable) {return (<ScrollView style={styles.markdownPreview}>{MarkdownContent}</ScrollView>);}return (<View style={styles.markdownContainer}>{MarkdownContent}</View>);
}const styles = StyleSheet.create({equationContainer: {overflow: 'hidden',alignSelf: 'flex-start', // 防止拉伸maxWidth: '100%',       // 公式最大宽度},markdownPreview: {flex: 1,padding: 0,},markdownContainer: {padding: 0,borderWidth:1,backgroundColor:'red'},markdownText: {fontSize: 14,lineHeight: 22,color: '#1F2937',},
});export default MarkdownView;

现在有一个已知问题是公式的内容超出一行的时候渲染内容会超出屏幕不会换行,这个我得抽时间来解决

http://www.xdnf.cn/news/16900.html

相关文章:

  • 【大模型核心技术】Agent 理论与实战
  • 【项目日志|苍穹外卖】 Day1:项目环境搭建与架构设计
  • 【Excel】利用函数和Power Query进行数据分析
  • NX969NX972美光固态闪存NX975NX977
  • Java,八股,cv,算法——双非研0四修之路day24
  • javaweb开发之Servlet笔记
  • Android 优化 - 日志 Log
  • 【MySQL进阶】------MySQL程序
  • 自动驾驶控制算法——LQR控制算法
  • MySQL极简安装挑战
  • MySQL事务与存储引擎的学习(一)
  • 智能化设备维护:开启高效运维新时代
  • 新手向:Python制作贪吃蛇游戏(Pygame)
  • 力扣经典算法篇-42-矩阵置零(辅助数组标记法,使用两个标记变量)
  • LangChain4J入门:接入大模型
  • 解决飞书文档中PDF文档禁止下载的问题
  • TCP-单线程版本
  • 配置阿里云与云产品流转发
  • LWIP从FreeRTOS到uC/OS-III的适配性改动
  • 多向量检索:lanchain,dashvector,milvus,vestorsearch,MUVERA
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • visual studio code 怎样将主题修改成亮色,并且配置中文界面
  • 基于transformer的目标检测——匈牙利匹配算法
  • 仓库管理系统-14-前端之侧边栏区域Aside的集中式状态管理菜单和动态路由
  • 死锁深度解析:原理、检测与解决之道
  • Spring Boot 整合 Minio 实现高效文件存储解决方案(本地和线上)
  • 【十九、Javaweb-day19-Linux概述】
  • Pytorch 报错-probability tensor contains either ‘inf‘, ‘nan‘ or element < 0 解决方案
  • Odoo OWL前端框架全面学习指南 (后端开发者视角)
  • 机器学习——决策树