• 一个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即可。
    本篇文章首发自魔芋红茶的博客https://www.cnblogs.com/Moon-Face/ 请尊重其他人的劳动成功,转载请注明。
  • 相关阅读:
    百度地图js lite api 支持点聚合
    看源码积累知识点
    React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot
    React 16 源码瞎几把解读 【三 点 一】 把react组件对象弄到dom中去(矛头指向fiber,fiber不解读这个过程也不知道)
    React 16 源码瞎几把解读 【二】 react组件的解析过程
    获得BAT技术专家Offer,他到底做了什么?
    Android 日常开发总结的技术经验
    理解Android虚拟机体系结构
    Android开发人员应该选择哪种语言?
    2019年Android岗位BAT等大厂面试题,希望对新的一年的你有所帮助
  • 原文地址:https://www.cnblogs.com/Moon-Face/p/14539813.html
Copyright © 2020-2023  润新知