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

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.dtcms.com/a/312754.html

相关文章:

  • 文明存续的时间博弈:论地球资源枯竭临界期的技术突围与行动紧迫性
  • STM32-驱动OLED显示屏使用SPI(软件模拟时序)实现
  • 【stm32】按键控制LED以及光敏传感器控制蜂鸣器
  • PYTHON从入门到实践-18Django模版渲染
  • 我的世界进阶模组开发教程——伤害(2)
  • 20250803让飞凌OK3576-C开发板在Rockchip的原厂Android14下适配声卡NAU88C22YG【Android部分】
  • C++:STL中的栈和队列的适配器deque
  • 多模态大模型的原理
  • 机器人产业需要技术与资本双驱动,在泡沫期中探索商业化路径
  • Python中的sys.path与PYTHONPATH全解析:模块导入路径的底层机制与最佳实践
  • LDAP身份验证前世今生
  • Corrosion2靶机练习笔记
  • 大语言模型的解码策略:贪婪解码与波束搜索
  • Coze 打通飞书多维表格,实现数据增删改查操作实战详解
  • kraft的设计与实现
  • 嵌入式——数据结构:单向链表的函数创建
  • Linux系统之mcookie 命令详解
  • Java小红书源码1:1还原uniapp_仿小红书源码
  • Nginx负载均衡配置
  • STM32 串口发送
  • sqli-labs:Less-25关卡详细解析
  • c++ --- priority_queue的使用以及简单实现
  • Navicat连接远程服务器上的mysql
  • Java Stream API 编程实战
  • Java学习第一百部分——Kafka
  • Python批处理深度解析:构建高效大规模数据处理系统
  • kubectl基础操作实战-k8s集群安装
  • IO流-字节流-FileInputStream
  • 【设计模式】0.UML类图
  • Python特性工厂函数详解:优雅管理属性验证