发送markdown给别人时,图片路径老是让人恼火~
使用python脚本把markdown文件中图片提取,放到指定文件夹中,并修改md文件内路径为相对路径
包含python包
当前文件夹只有一个md文件时,默认把该文件作为输入,输出的md文件默认为原文件名
file_list = os.listdir() count_md = 0 md_file = '' for file in file_list: if file[-3:] == '.md': count_md += 1 # 计算当前文件夹md文件个数 md_file = file parser = argparse.ArgumentParser() # 给这个解析对象添加命令行参数 if count_md == 1: # 当前文件夹只有一个md文件 parser.add_argument('--input', type=str, default=md_file, help='markdown file') else: parser.add_argument('--input', type=str, help='markdown file') parser.add_argument('--imgdir', type=str, default='img', help='存图片文件夹') parser.add_argument('--output', type=str, help='输出md文件名') args = parser.parse_args()
使用re进行正则提取md中文件路径,markdown中图片格式有
img_md = re.findall(r'![.*?]((.*?))', md) img_html = re.findall(r'<img src="(.*?)" .*?/>', md) img_paths = img_md + img_html
完整代码为:
import argparse import os import shutil import re # 当前文件夹内md个数计算 file_list = os.listdir() count_md = 0 md_file = '' for file in file_list: if file[-3:] == '.md': count_md += 1 md_file = file # 添加命令行参数 parser = argparse.ArgumentParser() if count_md == 1: parser.add_argument('--input', type=str, default=md_file, help='markdown file') else: parser.add_argument('--input', type=str, help='markdown file') parser.add_argument('--imgdir', type=str, default='img', help='存图片文件夹') parser.add_argument('--output', type=str, help='输出md文件名') args = parser.parse_args() imgdir = args.imgdir mdout = 'mdout' # 输出内容所在文件夹 print(f"输入文件: {args.input} 图片文件夹: {args.imgdir} 输出文件: {args.output}") if args.output == None: # 没有规定输出md文件名,则默认用原文件名 args.output = os.path.join(mdout, os.path.basename(args.input)) print(f"输入文件: {args.input} 图片文件夹: {args.imgdir} 输出文件: {args.output}") # 文件夹创建 if not os.path.exists(mdout): os.makedirs(mdout) if not os.path.exists(os.path.join(mdout, imgdir)): os.makedirs(os.path.join(mdout, imgdir)) with open(args.input, 'r', encoding='utf-8') as f: md = f.read() # 正则提取 img_md = re.findall(r'![.*?]((.*?))', md) img_html = re.findall(r'<img src="(.*?)" .*?/>', md) img_paths = img_md + img_html for i in img_paths: img = os.path.join(imgdir, os.path.basename(i)) shutil.copy(i, os.path.join(mdout, img)) md = md.replace(i, img) with open(args.output, 'w', encoding='utf-8') as f: f.write(md)
之后可以在
效果为:
原md文件内容:
<img src="/Users/a/Library/Application Support/typora-user-images/image-20231229172044214.png" alt="image-20231229172044214" style="zoom:50%;" /> ![image-20240122114932405](../../../../Library/Application Support/typora-user-images/image-20240122114932405.png)
这里文件夹内只有test.md一个markdown文件,不输入参数,用默认处理
处理后md文件内容:
<img src="img/image-20231229172044214.png" alt="image-20231229172044214" style="zoom:50%;" /> ![image-20240122114932405](img/image-20240122114932405.png)
之后就可以把整个mdout文件夹压缩发给别人,在别人电脑上也可以正常显示了
有问题欢迎交流呢~