一个Markdown文件处理程序

一个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)

使用方法:

  1. 替换脚本中的ms.sm令牌。
  2. 将这个Python脚本拷贝到要处理的markdown文件所在目录。
  3. 代开cmd,工作目录切换到目标目录。
  4. 运行python deal.py即可。
上一篇:jsp页面从标签属性中获取值


下一篇:GPU编程和流式多处理器