zoukankan      html  css  js  c++  java
  • 一个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/ 请尊重其他人的劳动成功,转载请注明。
  • 相关阅读:
    OCM_第十四天课程:Section6 —》数据库性能调优_各类索引 /调优工具使用/SQL 优化建议
    OCM_第十三天课程:Section6 —》数据库性能调优 _结果缓存 /多列数据信息采集统计/采集数据信息保持游标有效
    OCM_第十二天课程:Section6 —》数据库性能调优_ 资源管理器/执行计划
    使用NuGet时的一个乌龙
    .net调用存储过程碰到的一个问题
    数据库的备份与还原
    创建link server链接服务器碰到的问题及解决办法
    如何管理好项目的DLL
    项目中Enum枚举的使用
    .NET开发知识体系
  • 原文地址:https://www.cnblogs.com/Moon-Face/p/14539813.html
Copyright © 2011-2022 走看看