一个Markdown文件处理程序
主要功能为扫描markdown文件中的本地图片,如果有,就上传到图床,然后用图床的网络地址替换本地图片。
- 图床服务使用的是sm.ms
- 不会改变原markdown文件,只会生成一个替换了图床图片的副本。
- sm.ms有上传限制,太过频繁会上传图片失败,不过可以过一会再执行。
- sm.ms的图片好像有放盗链,我上传到CSDN的博客图全挂了。
import requests
import os
import shutil
import sys
def uploadToSmms(path):
headers = {'Authorization': '这里替换成你自己的sm.ms令牌'}
files = {'smfile': open(path, 'rb')}
url = 'https://sm.ms/api/v2/upload'
res = requests.post(url, files=files, headers=headers).json()
if res['success']:
return res['data']['url']
elif res['code'] == 'image_repeated':
return res['images']
else:
pass
logOpen = open(file='upload.log', mode='a')
print(res, file=logOpen)
logOpen.close()
return False
def isMarkdownFile(fileName):
filePart = fileName.rpartition('.')
fileExt = filePart[-1]
return fileExt == 'md'
def isOrigMdFile(fileName):
'''判断是否为原始markdown文件'''
if not isMarkdownFile(fileName):
return False
# 检查文件后缀是否为_image
specialMark = "_image"
filePart = fileName.rpartition('.')
# 如果文件名长度过小,肯定是原始文件
if len(filePart[0]) <= len(specialMark):
return True
# 后缀是否能完全匹配
if filePart[0].endswith(specialMark):
return False
return True
def getCopyFileName(fileName):
filePart = fileName.rpartition('.')
fileExt = filePart[-1]
newFileName = filePart[0]+'_image.'+fileExt
return newFileName
def findLocalImageFile(line: str, localImages: set):
'''递归查找某段字符串中中括号包裹的内容是否为本地图片'''
linePart = line.partition('(')
if len(linePart[2]) > 0:
secondPart = linePart[2].partition(')')
content = secondPart[0]
if len(content) > 0:
# print(content)
if content.endswith('.png') and os.path.exists(content):
localImages.add(content)
findLocalImageFile(content, localImages)
def multiUploadImage(images: list, results: dict):
'''批量上传图片'''
if len(images) <= 10:
for localImg in images:
webImage = uploadToSmms(localImg)
if webImage == False:
print("文件上传出错")
exit()
else:
results[localImg] = webImage
else:
multiUploadImage(images[0:10], results)
multiUploadImage(images[10:len(images)], results)
def dealMdFile(mdFile):
imgDict = dict()
localImages = set()
# 逐行扫描,查找本地图片
with open(file=mdFile, mode='r', encoding='UTF-8') as fopen:
for line in fopen:
# 去除行尾的换行
subLine = line[0:len(line)-1]
findLocalImageFile(subLine, localImages)
# 上传本地图片,建立图片映射表
multiUploadImage(list(localImages), imgDict)
# 替换本地图片
copyFileName = getCopyFileName(mdFile)
copyFileOpen = open(file=copyFileName, mode='w', encoding='UTF-8')
with open(file=mdFile, mode='r', encoding='UTF-8') as fwrite:
for line in fwrite:
for localImg, webImg in imgDict.items():
line = line.replace(localImg, webImg)
copyFileOpen.write(line)
copyFileOpen.close()
print("已成功处理markdown文件", mdFile)
# 检索当前目录中的markdown文件
for dir in os.listdir():
if os.path.isfile(dir):
if isOrigMdFile(dir):
# 复制一份拷贝,如果有,则不覆盖
copyFileName = getCopyFileName(dir)
if not os.path.exists(copyFileName):
# shutil.copyfile(dir, copyFileName)
# 对拷贝进行处理
dealMdFile(dir)
使用方法:
- 替换脚本中的ms.sm令牌。
- 将这个Python脚本拷贝到要处理的markdown文件所在目录。
- 代开cmd,工作目录切换到目标目录。
- 运行
python deal.py
即可。