当前位置: 代码网 > it编程>前端脚本>Python > 使用Python开发Markdown兼容公式格式转换工具

使用Python开发Markdown兼容公式格式转换工具

2025年05月04日 Python 我要评论
一、工具背景在技术写作中经常遇到公式格式问题:mathml无法显示、latex格式错乱…本工具实现以下核心功能:自动转换mathml到katex标准化latex公式格式保留原文其他内容图

一、工具背景

在技术写作中经常遇到公式格式问题:mathml无法显示、latex格式错乱…

本工具实现以下核心功能:

  • 自动转换mathml到katex
  • 标准化latex公式格式
  • 保留原文其他内容
  • 图形化操作界面

工具效果演示

二、环境配置(windows 10/11)

1. 创建conda环境

# 打开powershell执行
conda create -n formula_tool python=3.8
conda activate formula_tool
pip install tk lxml pyinstaller

2. 获取xslt转换文件

# 下载mathml转latex的xslt文件
invoke-webrequest -uri "https://raw.githubusercontent.com/ronaldo1967/mathml-to-latex/master/mathml2tex.xsl" -outfile mathml2tex.xsl

三、完整python代码(带gui)

# formula_converter_gui.py
import tkinter as tk
from tkinter import scrolledtext, filedialog
import re
from lxml import etree
import os

class formulaconvertergui:
    def __init__(self, master):
        self.master = master
        master.title("公式格式转换工具 v1.0")
        master.geometry("800x600")
        
        # 界面组件
        self.create_widgets()
        self.xslt_path = "mathml2tex.xsl"
        
    def create_widgets(self):
        # 输入框
        self.input_label = tk.label(self.master, text="输入内容:")
        self.input_label.pack(pady=5)
        
        self.input_text = scrolledtext.scrolledtext(self.master, wrap=tk.word, height=15)
        self.input_text.pack(fill=tk.both, expand=true, padx=10)
        
        # 操作按钮
        self.button_frame = tk.frame(self.master)
        self.button_frame.pack(pady=10)
        
        self.convert_btn = tk.button(self.button_frame, text="转换公式", command=self.convert)
        self.convert_btn.pack(side=tk.left, padx=5)
        
        self.clear_btn = tk.button(self.button_frame, text="清空内容", command=self.clear)
        self.clear_btn.pack(side=tk.left, padx=5)
        
        self.save_btn = tk.button(self.button_frame, text="保存结果", command=self.save_file)
        self.save_btn.pack(side=tk.left, padx=5)
        
        # 输出框
        self.output_label = tk.label(self.master, text="转换结果:")
        self.output_label.pack(pady=5)
        
        self.output_text = scrolledtext.scrolledtext(self.master, wrap=tk.word, height=15)
        self.output_text.pack(fill=tk.both, expand=true, padx=10)
        
        # 状态栏
        self.status_bar = tk.label(self.master, text="就绪", bd=1, relief=tk.sunken, anchor=tk.w)
        self.status_bar.pack(side=tk.bottom, fill=tk.x)

    def convert(self):
        content = self.input_text.get("1.0", tk.end)
        converted = self.process_content(content)
        self.output_text.delete("1.0", tk.end)
        self.output_text.insert(tk.end, converted)
        self.status_bar.config(text="转换完成")

    def process_content(self, content):
        patterns = {
            'latex_block': re.compile(r'\$\$(.*?)\$\$', re.dotall),
            'latex_inline': re.compile(r'\$(.*?)\$'),
            'mathml': re.compile(r'<math.*?>(.*?)</math>', re.dotall)
        }
        
        # 处理块级公式
        content = patterns['latex_block'].sub(
            lambda m: f'$$\n{m.group(1).strip()}\n$$', 
            content
        )
        
        # 处理行内公式
        content = patterns['latex_inline'].sub(
            lambda m: f'${m.group(1).strip()}$', 
            content
        )
        
        # 处理mathml
        mathml_matches = patterns['mathml'].finditer(content)
        for match in mathml_matches:
            try:
                tex = self.mathml_to_tex(match.group(0))
                content = content.replace(match.group(0), f'$$ {tex} $$')
            except exception as e:
                self.status_bar.config(text=f"转换失败:{str(e)}")
        
        return content

    def mathml_to_tex(self, mathml_str):
        xslt = etree.parse(self.xslt_path)
        transform = etree.xslt(xslt)
        doc = etree.fromstring(mathml_str)
        result = transform(doc)
        return str(result).strip()

    def clear(self):
        self.input_text.delete("1.0", tk.end)
        self.output_text.delete("1.0", tk.end)
        self.status_bar.config(text="已清空")

    def save_file(self):
        file_path = filedialog.asksaveasfilename(
            defaultextension=".md",
            filetypes=[("markdown文件", "*.md"), ("所有文件", "*.*")]
        )
        if file_path:
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(self.output_text.get("1.0", tk.end))
            self.status_bar.config(text=f"文件已保存至:{file_path}")

if __name__ == "__main__":
    root = tk.tk()
    app = formulaconvertergui(root)
    root.mainloop()

四、核心功能解析

1. mathml转换原理

def mathml_to_tex(mathml_str):
    xslt = etree.parse("mathml2tex.xsl")
    transform = etree.xslt(xslt)
    return str(transform(etree.fromstring(mathml_str)))

2. 正则匹配引擎

# 块级公式匹配
re.compile(r'\$\$(.*?)\$\$', re.dotall)

# 行内公式匹配
re.compile(r'\$(.*?)\$')

五、工具使用说明

1. 界面操作流程

粘贴或输入包含公式的内容

点击"转换公式"按钮

查看右侧转换结果

使用"保存结果"导出markdown文件

2. 支持格式示例

原始格式转换后格式
<math>...</math>$$ x = \frac{-b}{2a} $$
\gamma(z)...$$\gamma(z)...$$
$e=mc^2$$e=mc^2$

到此这篇关于使用python开发markdown兼容公式格式转换工具的文章就介绍到这了,更多相关python markdown格式转换内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com