[python]Markdown图片引用格式批处理桌面应用程序

需求

复制代码
使用python编写一个exe,实现批量修改图片引用,将修改后的文件生成为 文件名_blog.md。有一个编辑框,允许接收拖动过来md文件,拖入文件时获取文件路径,有一个编辑框编辑修改后的文件的输出路径,用户拖入文件时,就能自动得到输出的路径
作用是将md文件中的例如
![image-20240706062921362](./[git]git拯救项目之恢复到之前提交的记录/image-20240706062921362.png)改成{% asset_img image-20240706062921362.png '"..." "文章配图"' %} 
![image-20240706063059015](./[git]git拯救项目之恢复到之前提交的记录/image-20240706063059015.png)改成{% asset_img image-20240706063059015.png '"..." "文章配图"' %}

代码

python 复制代码
import os
import re
import wx
from pathlib import Path

"""

使用python编写一个exe,实现批量修改图片引用,将修改后的文件生成为 文件名_blog.md。有一个编辑框,允许接收拖动过来md文件,拖入文件时获取文件路径,有一个编辑框编辑修改后的文件的输出路径,用户拖入文件时,就能自动得到输出的路径
作用是将md文件中的例如
![image-20240706062921362](./[git]git拯救项目之恢复到之前提交的记录/image-20240706062921362.png)改成{% asset_img image-20240706062921362.png '"..." "文章配图"' %} 
![image-20240706063059015](./[git]git拯救项目之恢复到之前提交的记录/image-20240706063059015.png)改成{% asset_img image-20240706063059015.png '"..." "文章配图"' %}

"""


class DropTarget(wx.FileDropTarget):
    def __init__(self, window):
        super().__init__()
        self.window = window

    def OnDropFiles(self, x, y, filenames):
        self.window.set_filenames(filenames)


class MainFrame(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, title=title, size=(600, 400))
        panel = wx.Panel(self)

        self.text_input = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY)
        self.text_output = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY)
        self.btn_convert = wx.Button(panel, label="开始转换")

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.text_input, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
        vbox.Add(self.text_output, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
        vbox.Add(self.btn_convert, flag=wx.EXPAND | wx.ALL, border=5)

        panel.SetSizer(vbox)

        self.SetDropTarget(DropTarget(self))

        self.Bind(wx.EVT_BUTTON, self.on_convert, self.btn_convert)

        self.Centre()
        self.Show(True)

    def set_filenames(self, filenames):
        self.filenames = filenames
        self.text_input.SetValue('\n'.join(filenames))

    def on_convert(self, event):
        for filename in self.filenames:
            if filename.lower().endswith('.md'):
                input_file_path = Path(filename)
                output_file_path = input_file_path.with_name(input_file_path.stem + '_blog' + input_file_path.suffix)
                self.text_output.AppendText(str(output_file_path) + '\n')
                self.convert_markdown_images(str(input_file_path), str(output_file_path))

    def convert_markdown_images(self, input_file, output_file):
        with open(input_file, 'r', encoding='utf-8') as file:
            content = file.read()

        # 修改正则表达式,以匹配Markdown图片链接
        pattern = r'\!\[(?P<alt_text>.*?)\]\((?P<path>.*/)?(?P<file_name>.*?)(?P<extension>\..*)\)'

        # 遍历所有匹配项并构建新的替换字符串
        new_content = re.sub(pattern, lambda m: f'{{% asset_img {m.group("file_name")}{m.group("extension")} \'"{m.group("alt_text")}" "文章配图"\' %}}', content)

        # 将修改后的内容写入输出文件
        with open(output_file, 'w', encoding='utf-8') as file:
            file.write(new_content)

        wx.MessageBox(f"已成功转换'{input_file}'至'{output_file}'", "转换成功", wx.OK)


if __name__ == '__main__':
    app = wx.App()
    MainFrame(None, title="Markdown 图片链接转换器")
    app.MainLoop()



if __name__ == '__main__':
    app = wx.App()
    MainFrame(None, title="Markdown Image Link Converter@萌狼蓝天(mllt.cc)")
    app.MainLoop()

效果

{% asset_img image-20240706075502201.png '"image-20240706075502201" "文章配图"' %}

相关推荐
念恒1230627 分钟前
Python(列表进阶)
python·学习
AI人工智能+电脑小能手30 分钟前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试
geovindu1 小时前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
27669582921 小时前
阿里最新acw_sc__v2 分析
开发语言·python·acw_sc__v2·acw_sc__v2逆向·acw_sc__v2算法·acw_sc__v2算法分析·cookie逆向
dog2501 小时前
圆锥曲线和二次曲线
开发语言·网络·人工智能·算法·php
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第25题:JDK1.8的新特性有哪些
java·开发语言·后端·面试
开发小程序的之朴1 小时前
基于Go语言的企业级CMS系统架构设计与性能分析——以AnQiCMS为例
开发语言·golang·系统架构
vortex52 小时前
python 库劫持:原理、利用与防御
python·网络安全·提权
叶小鸡2 小时前
Java 篇-项目实战-天机学堂(从0到1)-day9
java·开发语言
小短腿的代码世界2 小时前
Qt券商接口封装深度解析:统一API设计与多源适配
开发语言·qt·单元测试