利用Python开发一个功能全面的Markdown编辑工具

 更新时间:2025年03月08日 11:32:22   作者:winfredzhang  
这篇文章主要为大家详细介绍了如何利用Python开发一个功能全面的Markdown编辑工具,支持Markdown内容的编辑,HTML预览等功能,需要的可以参考下

在这篇博客中,我将详细分析和讲解一段用Python开发的Markdown编辑工具代码。这款工具支持Markdown内容的编辑、HTML预览、导出为PDF和保存为图片的功能,同时还可以实现代码高亮。

功能介绍

这款Markdown编辑工具基于wxPython开发,核心功能包括:

Markdown编辑与HTML实时预览:

  • 提供编辑区域(Memo)供用户录入Markdown内容。
  • 使用wx.html2.WebView组件将Markdown内容转为HTML并实时预览。

代码高亮:

使用Highlight.js实现Markdown代码段的语法高亮。

导出功能:

  • 支持将Markdown保存为.md文件。
  • 将HTML预览内容导出为PDF文件。
  • 将HTML内容保存为JPEG格式的图片。

环境准备

所需的依赖库:

  • wxPython:构建图形界面
  • markdown:将Markdown解析为HTML
  • pdfkit:将HTML转换为PDF文件
  • imgkit:将HTML保存为图片
  • Pillow:处理图像

可以通过以下命令安装:

pip install wxPython markdown pdfkit imgkit pillow

安装wkhtmltopdf和wkhtmltoimage工具:

pdfkit和imgkit需要wkhtmltopdf和wkhtmltoimage工具的支持。

下载地址:wkhtmltopdf

安装后,将工具路径(如C:\Program Files\wkhtmltopdf\bin)加入环境变量,或在代码中显式指定路径。

代码分析

下面是实现Markdown编辑工具的完整代码:

import wx
import wx.html2  # HTML浏览器控件
import markdown  # Markdown解析模块
import pdfkit    # HTML转PDF模块
from PIL import Image
from io import BytesIO
import imgkit


def markdown_to_html_with_highlight(md_content):
    """将Markdown转换为HTML并添加代码高亮支持"""
    html_content = markdown.markdown(md_content, extensions=['fenced_code'])
    # 添加Highlight.js脚本和样式
    highlight_js = '''
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/default.min.css" rel="external nofollow" >
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script>
    <script>hljs.highlightAll();</script>
    '''
    return f"{highlight_js}<body>{html_content}</body>"


class MarkdownApp(wx.Frame):
    def __init__(self):
        super().__init__(None, title="Markdown编辑工具", size=(1000, 700))
        self.InitUI()

    def InitUI(self):
        # 工具栏
        toolbar = self.CreateToolBar()
        toolbar.AddTool(wx.ID_SAVE, "保存 Markdown", wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE))
        toolbar.AddTool(wx.ID_PREVIEW, "预览", wx.ArtProvider.GetBitmap(wx.ART_FIND))
        toolbar.AddTool(wx.ID_PRINT, "生成 PDF", wx.ArtProvider.GetBitmap(wx.ART_PRINT))
        toolbar.AddTool(wx.ID_SAVEAS, "保存为图片", wx.ArtProvider.GetBitmap(wx.ART_PASTE))
        toolbar.Realize()

        # 绑定工具栏按钮事件
        self.Bind(wx.EVT_TOOL, self.OnSaveMarkdown, id=wx.ID_SAVE)
        self.Bind(wx.EVT_TOOL, self.OnPreview, id=wx.ID_PREVIEW)
        self.Bind(wx.EVT_TOOL, self.OnGeneratePDF, id=wx.ID_PRINT)
        self.Bind(wx.EVT_TOOL, self.OnSaveImage, id=wx.ID_SAVEAS)

        # 布局
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        self.memo = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        self.browser = wx.html2.WebView.New(panel)

        vbox.Add(self.memo, 1, wx.EXPAND)
        vbox.Add(self.browser, 1, wx.EXPAND)

        panel.SetSizer(vbox)
        self.Show()

    def OnPreview(self, event):
        """预览Markdown内容为HTML"""
        md_content = self.memo.GetValue()
        html_content = markdown_to_html_with_highlight(md_content)
        self.browser.SetPage(html_content, "")

    def OnSaveMarkdown(self, event):
        """保存Markdown为.md文件"""
        with wx.FileDialog(self, "保存 Markdown", wildcard="Markdown 文件 (*.md)|*.md",
                           style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog:
            if dialog.ShowModal() == wx.ID_CANCEL:
                return
            path = dialog.GetPath()
            with open(path, 'w', encoding='utf-8') as file:
                file.write(self.memo.GetValue())

    def OnGeneratePDF(self, event):
        """生成PDF文件"""
        md_content = self.memo.GetValue()
        html_content = markdown.markdown(md_content)
        with wx.FileDialog(self, "保存 PDF 文件", wildcard="PDF 文件 (*.pdf)|*.pdf",
                           style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog:
            if dialog.ShowModal() == wx.ID_CANCEL:
                return
            path = dialog.GetPath()
            config = pdfkit.configuration(wkhtmltopdf='C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe')
            pdfkit.from_string(html_content, path, configuration=config)

    def OnSaveImage(self, event):
        """保存HTML内容为JPEG图片"""
        md_content = self.memo.GetValue()
        html_content = markdown.markdown(md_content)
        with wx.FileDialog(self, "保存图片", wildcard="JPEG 文件 (*.jpeg)|*.jpeg",
                           style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog:
            if dialog.ShowModal() == wx.ID_CANCEL:
                return
            path = dialog.GetPath()
            config = imgkit.config(wkhtmltoimage='C:/Program Files/wkhtmltopdf/bin/wkhtmltoimage.exe')
            img_data = imgkit.from_string(html_content, False, config=config)
            image = Image.open(BytesIO(img_data))
            image.save(path, format="JPEG")


if __name__ == "__main__":
    app = wx.App()
    MarkdownApp()
    app.MainLoop()

功能解析

1.Markdown解析与HTML预览:

markdown.markdown()方法将Markdown内容转为HTML。

通过Highlight.js实现代码块的语法高亮。

2.生成PDF:

使用pdfkit模块的from_string()方法将HTML内容保存为PDF。

需要确保wkhtmltopdf工具正确安装并指定路径。

需要安装wkhtmltopdf应用程序

https://wkhtmltopdf.org/downloads.html

3.保存为图片:

使用imgkit模块生成HTML内容的图片。

使用Pillow库将生成的图像数据保存为JPEG格式。

4.界面交互:

使用wxPython的工具栏和对话框实现文件保存等功能。

提供预览功能让用户直观地查看Markdown效果。

运行结果

以上就是利用Python开发一个功能全面的Markdown编辑工具的详细内容,更多关于Python Markdown编辑的资料请关注脚本之家其它相关文章!

相关文章

  • python3使用sqlite3构建本地持久化缓存的过程

    python3使用sqlite3构建本地持久化缓存的过程

    日常python开发中会遇到数据持久化的问题,今天记录下如何使用sqlite3进行数据持久化,并提供示例代码及数据查看工具,需要的朋友可以参考下
    2023-11-11
  • python如何把字符串类型list转换成list

    python如何把字符串类型list转换成list

    这篇文章主要介绍了python如何吧字符串类型list转换成list,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python使用UDP实现720p视频传输的操作

    Python使用UDP实现720p视频传输的操作

    这篇文章主要介绍了Python使用UDP实现720p视频传输的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 如何基于pandas读取csv后合并两个股票

    如何基于pandas读取csv后合并两个股票

    这篇文章主要介绍了如何基于pandas读取csv后合并两个股票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • python 解压、复制、删除 文件的实例代码

    python 解压、复制、删除 文件的实例代码

    这篇文章主要介绍了python 解压、复制、删除 文件的实例代码,代码简单易懂非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Matplotlib控制坐标轴刻度间距与标签实例代码

    Matplotlib控制坐标轴刻度间距与标签实例代码

    在matplotlib中,记号是图形两个轴上的小标记,到目前为止,我们让matplotlib处理轴图例上记号的位置,下面这篇文章主要给大家介绍了关于Matplotlib控制坐标轴刻度间距与标签的相关资料,需要的朋友可以参考下
    2021-10-10
  • 利用Python开发一个简单实用的文本转语音工具

    利用Python开发一个简单实用的文本转语音工具

    在日常工作和学习中,我们经常会遇到需要将文本内容转换为语音的场景,比如听小说、读文档、制作语音提示等,今天就带大家用Python开发一个简单实用的文本转语音工具,适合Python初学者和想快速实现TTS功能的开发者,需要的朋友可以参考下
    2025-10-10
  • python打包成 .so的实现步骤

    python打包成 .so的实现步骤

    当需要将产品发布到外部环境的时候,源码的保护尤为重要,因此需要将python文件打成so文件的目的就是为了保护源码,本文主要介绍了python打包成.so的实现步骤,感兴趣的可以了解一下
    2023-12-12
  • 介绍Python的Urllib库的一些高级用法

    介绍Python的Urllib库的一些高级用法

    这篇文章主要介绍了Python的Urllib库的一些高级用法,是用Python编写爬虫的一些基础知识,需要的朋友可以参考下
    2015-04-04
  • python用selenium打开浏览器后秒关闭浏览器的解决办法

    python用selenium打开浏览器后秒关闭浏览器的解决办法

    最近朋友在学Selenium的时候遇到一个问题,当执行完selenium程序后,浏览器会闪退也就是自动关闭,这篇文章主要给大家介绍了关于python用selenium打开浏览器后秒关闭浏览器的解决办法,需要的朋友可以参考下
    2023-07-07

最新评论