[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 '"..." "文章配图"' %}

代码

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 = windowdef 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 = filenamesself.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" "文章配图"' %}

image-20240706075502201

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot实战:AI大模型+亮数据代理助力短视频时代

目录 前言1.如何入门亮数据1.1、注册登录1.2、注册账号1.3、登录1.4、购买静态住宅代理1.5、展示购买的代理 2. 使用Springboot、AI大模型构建系统2.1 使用Springboot、AI大模型构建爬虫2.2、在Springboot项目添加工具 3、编写代码&#xff0c;爬取视频素材3.1、代码里使用代理…

Redis核心问题总结(一)

1、为什么要使用Redis做缓存 缓存的好处 使用缓存的目的就是提升读写性能。而实际业务场景下&#xff0c;更多的是为了提升读性能&#xff0c;带来更好的性 能&#xff0c;带来更高的并发量。Redis 的读写性能比 Mysql 好的多&#xff0c;我们就可以把 Mysql 中的热点数据缓 …

如何编译ffmpeg支持h265(hevc)?

推荐使用这里的文件&#xff1a;https://github.com/runner365/ffmpeg_rtmp_h265 根据你ffmpeg的源码 版本&#xff0c;切换到不同分支即可。 国内cdn方式: 新增codecid hevc/vp8/vp9/opus在rtmp中的codecid没有官方协议定义&#xff0c;由国内众多知名cdn共同制定。 FLV_COD…

1. LangChain4j 之入门(简单易学)

一&#xff1a;前言 什么是LangChain&#xff1f;而LangChain4j又是什么&#xff1f;不知道的朋友&#xff0c;可以看我一下两篇文章 1分钟了解LangChain是什么? | 1分钟了解LangChain4j是什么? LangChain4j是LangChain的Java版本&#xff0c;帮助开发者很容易的接入大模型的…

提升结构安全性:应变计在现代建筑中的应用

在现代建筑领域&#xff0c;随着工程技术的不断进步&#xff0c;对结构安全性的要求也日益提高。作为一种关键的工程仪器仪表&#xff0c;应变计在提升结构安全性方面发挥着不可替代的作用。本文将深入探讨应变计在现代建筑中的应用&#xff0c;以及它如何助力工程师们实时监测…

权力之望怎么注册账号创建角色 权利之网角色账号注册教程

权力之望是一款全新的大型MMORPG游戏&#xff0c;拥有9把独特武器和56种职业组合&#xff0c;并搭配了超炫酷的战斗画面&#xff0c;全程采用低俯视角游戏&#xff0c;让玩家能体验到更强的操作感和爽快感。这款游戏主打高养成自由度玩家可以自由更换武器进行战斗&#xff0c;还…

前端面试题30(闭包和作用域链的关系)

闭包和作用域链在JavaScript中是紧密相关的两个概念&#xff0c;理解它们之间的关系对于深入掌握JavaScript的执行机制至关重要。 作用域链 作用域链是一个链接列表&#xff0c;它包含了当前执行上下文的所有父级执行上下文的变量对象。每当函数被调用时&#xff0c;JavaScri…

零基础也能成为产品册设计高手

​在当今数字化时代&#xff0c;产品册设计已成为企业营销的重要手段之一。过去&#xff0c;人们认为只有专业人士才能设计出精美的产品册&#xff0c;然而&#xff0c;随着设计工具的普及和在线学习资源的丰富&#xff0c;零基础的你也能成为产品册设计高手。本文将带你走进这…

MindsDB:一个利用企业数据构建 AI 的平台

MindsDB作为一个开源项目&#xff0c;它旨在将机器学习模型无缝集成到现有的数据库系统中&#xff0c;为用户提供实时的数据预测能力。这个项目的创新之处在于&#xff0c;它能够以简单、直观的方式让开发者和非技术人员都能够利用AI进行数据分析和预测。 它是根据企业数据库定…

航空航天单位保密网文件导出管理难点在哪里?如何解决?

航空航天单位的重要性不言而喻&#xff0c;它们在国家安全、科技进步、经济发展以及国际合作等多个领域都扮演着至关重要的角色。为了保护工作内容中的重要数据&#xff0c;遵守保密规定&#xff0c;对涉密人员、保密要害部门单位、涉密载体、涉密信息传输和涉密活动进行严格管…

glide加载mp4 源码堆栈调用核心代码分析

load 数据走的httpurlfetcher 的loaddata 从MultiLoader 调用而来 load到inputstream流后的处理 核心 图片是glide 首先创建解释器的时候 加了videodecoder 然后这里会从流中加载对应帧的图片保存在手机cache目录中 将这个file 作为bitmap传递 然后加载 private static final…

MySQL物理备份与恢复工具XtraBackend使用总结

文章目录 1.描述2.安装3.使用3.1 备份源数据库3.2 恢复到目标数据库3.2.1 恢复目录3.2.2 解压文件3.2.3 应用日志3.2.4 复制数据 4.使用总结4.1 备份4.2 恢复4.3 例子 1.描述 借助Percona XtraBackup工具实现MySQL的物理备份与恢复&#xff0c;相当于将整个MySQL进行了复制&am…

Django+vue自动化测试平台(25)-- 自动化测试之封装APscheduler定时任务框架

APscheduler简介 APscheduler全称Advanced Python Scheduler&#xff0c;作用为在指定的时间规则执行指定的作业&#xff0c;其是基于Quartz的一个Python定时任务框架&#xff0c;实现了Quartz的所有功能&#xff0c;使用起来十分方便。提供了基于日期、固定时间间隔以及cront…

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片 1 目标效果视频 CamManager 2 CamManager读取本地文件时序 3 BD_Vision_Utility添加代码 3.0 导入链接库 BD_OperatorSets.dllSystem.Windows.Forms.dllOpencvSharp 3.1 导入VisionParam中创建的文件Util_FileO…

安防监控/视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是什么原因?

安防监控EasyCVR视频汇聚平台可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时监控、云端录像、回看、告警、平台级联以及多视频流格式分发等视…

旅游计划定制小程序网页模板源码

手机在线旅游定制服务&#xff0c;定制旅游出行app小程序模板。包含&#xff1a;定制介绍、定制表单填写、我的订单等。 旅游计划定制小程序网页模板源码

C++ STL 文件系统用法介绍

目录 一. 获取当前工作目录 二:设置和读取文件写入时间 三:获取文件目录大小 四:获取文件类型信息 一. 获取当前工作目录 #include <filesystem> #include <iostream> #include <fstream> namespace fs = std::filesystem;int main() {std::cout &l…

交换机接口三种模式Access、Trunk、Hybrid

交换机接口的三种模式 1.access接口模式&#xff08;接入链路&#xff0c;接入模式&#xff09; 接收数据&#xff1a;当接收到一个无标记帧的时候&#xff0c;打上自己的PVid并接受&#xff08;就是自己的vlan标签&#xff09;。当接收到一个有标记帧的时候&#xff0c;对比…

swiftui中NavigationStack布局navigationBarTitleDisplayMode作用,以及内容顶部空白区域解决办法

写了一个小demo用于学习NavigationStack和toolbar/ToolbarItem知识&#xff0c;但是在写一个瀑布流布局的时候&#xff0c;设置了顶部的toolbar&#xff0c;然后内容区域的顶部出现了一大片空白区域&#xff0c;这样的效果并不是很美观很好看&#xff0c;所以就想着研究解决一下…

科普文:一文搞懂SpringBoot(狂神说Java)

1、Hello,World&#xff01; 1.1、SpringBoot简介 回顾什么是Spring Spring是一个开源框架&#xff0c;2003 年兴起的一个轻量级的Java 开发框架&#xff0c;作者&#xff1a;Rod Johnson 。 Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是…