python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Markdown编辑

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

作者:winfredzhang

这篇文章主要为大家详细介绍了如何利用Python开发一个功能全面的Markdown编辑工具,支持Markdown内容的编辑,HTML预览等功能,需要的可以参考下

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

功能介绍

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

Markdown编辑与HTML实时预览:

代码高亮:

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

导出功能:

环境准备

所需的依赖库:

可以通过以下命令安装:

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编辑的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文