首页 > 其他分享 >自动移除Typora多余图片

自动移除Typora多余图片

时间:2024-02-29 15:25:39浏览次数:21  
标签:remote img self Typora list 多余 移除 print ref

  1 # -*- coding: utf-8 -*-
  2 # @Time    : 8/25/2020 7:40 PM
  3 # @Author  : OhiyoX
  4 # @FileName: MDImgScripts.py
  5 # @Software: PyCharm
  6 # @Blog    :https://blog.ohiyox.in/
  7 # @Desc    : 1、用于自动清除typora写作后多余的图片,简洁文件夹
  8 #            2、也可以自动上传图片到图床,同时修改文档中的图片链接
  9 #            3、若图片为网络图片,将自动转移到图床,同时修改文档中的图片链接
 10 #            4、若图片在图床,但存放位置不规范,也会自动转移位置,同时修改文档中的图片链接
 11 
 12 
 13 import os
 14 import re
 15 import json
 16 import shutil
 17 import sys
 18 import time
 19 from urllib.parse import quote, unquote
 20 
 21 from datetime import datetime
 22 
 23 
 24 
 25 # 配置
 26 # {
 27 #     "test_mode": True,  # 调试模式
 28 #     "date": {"year": "2019",  # 设置文件夹日期,留空默认为本年
 29 #              "month": "1" # 设置文件夹日期,留空默认为本月
 30 #              },
 31 #     "clean_local_assets": True,
 32 #     "main_oss_folder_ref": "blogimg",  # 设置图床文件夹
 33 #     "style": "!xwbp",  # 设置默认上传的图片规则,以后缀!标识
 34 #     "relocate_oss_existing_file": True,  # 对于已在图床中的图片,设置是否需要重新移动整理图片
 35 #     "delete": True  # 对于移动图片,是否删除原位置
 36 # }
 37 
 38 with open('config.json') as cfig:
 39     config = json.load(cfig)
 40 
 41 
 42 class ImgMD:
 43     """MD图片处理类"""
 44 
 45     def __init__(self):
 46         # 与MD文档有关的
 47         self.article_filepath = None
 48         self.assets_dirpath = None
 49         self.content = ""
 50         # 文档中的图片信息
 51         self.imgs_list = []
 52         self.imgs_url_list = []
 53         # 图片在本地中的存储信息
 54         self.assets_list = []
 55 
 56         self.get_doc_imgs_list()
 57         self.get_assets_list()
 58 
 59         self.temp_dir = 'temp_img'
 60 
 61     def get_content(self, article_filepath="", force=False):
 62         """获得文本内容"""
 63         if self.content and not force:
 64             return self.content
 65         else:
 66             foo = False
 67             count = 0
 68             while not foo:
 69                 if count <= 5:
 70                     try:
 71                         if not config['test_mode']:
 72                             if not article_filepath:
 73                                 self.article_filepath = input("Input the article path: ").strip('\"')
 74                                 #print(self.article_filepath)
 75                                 
 76                                 if "\"" in self.article_filepath:
 77                                     self.article_filepath = re.search("\"(.*)\"", self.article_filepath).group(1)
 78                                 article_filepath = self.article_filepath
 79                         else:
 80                             article_filepath = self.article_filepath
 81                         with open(article_filepath, 'r', encoding="UTF-8") as f:
 82                             self.content = f.read()
 83                         foo = True
 84                         return self.content
 85                     except:
 86                         print("Notice! File is not found or an error occurs, retry.")
 87                         count += 1
 88                 else:
 89                     exit('failed getting article file path.')
 90 
 91     def get_doc_imgs_list(self, url=False, force=False):
 92         """获得文档中的图片列表"""
 93         if not force:
 94             if self.imgs_list and not url:
 95                 return self.imgs_list
 96             if self.imgs_url_list and url:
 97                 return self.imgs_url_list
 98 
 99         content = self.get_content(force=force)
100         
101         #self.imgs_url_list = re.findall('!\[.*?]\((.*?)\)', content, re.S)
102         self.imgs_url_list = re.findall('image-[0-9]{4,18}.png', content, re.S)
103         imgs_list = []
104         for img_url in self.imgs_url_list:
105             img_full_name = self.get_doc_imgs_list(img_url)  # 不支持绝对路径
106             imgs_list.append(img_full_name)
107         if not url:
108             print("Done, %s img(s) found in article." % len(imgs_list))
109             #for i, img in enumerate(imgs_list):
110             #   print(f"{i}: {img}")
111 
112             self.imgs_list = imgs_list
113             return imgs_list
114         else:
115             return self.imgs_url_list
116 
117 
118     def get_assets_list(self):
119         """获得图片文件夹中的图片列表"""
120         bar = False
121         count = 0
122         while not bar and count <= 5:
123             try:
124                 if not config['test_mode']:
125                     self.assets_dirpath = input("input the imgs path (Leave it empty to use default folder): ")
126                     if self.assets_dirpath == '':
127                         self.assets_dirpath = self.article_filepath.replace('.md', '.assets')
128                 for a, b, c in os.walk(self.assets_dirpath):
129                     assets_list = c
130                     print("Done, %s img(s) found in assets." % len(assets_list))
131                     print('As below:')
132                     for i, a in enumerate(assets_list):
133                         print(f"{i}: {a}")
134                     self.assets_list = assets_list
135                     return assets_list
136                 bar = True
137             except:
138                 print(Exception)
139                 count += 1
140                 if count > 5:
141                     exit(-1)
142 
143     def clear_local_imgs(self):
144         """用于清除文件夹中无用的图片"""
145         flag = False
146         redundant_list = []
147         print("------------------OUTPUT assets_list 1111---------------- \n")
148         print(self.assets_list)
149         print("------------------OUTPUT imgs_list 222---------------- \n")
150         print(self.imgs_list)
151         print("------------------OUTPUT list end---------------- \n")
152         for file in self.assets_list:
153             print(file)
154             u_file = quote(file)  # typora中使用了unicode-escape
155             #if str(u_file) not in str(self.imgs_list):
156             if str(self.imgs_list).find(str(u_file)) == -1 :
157                 redundant_list.append(self.assets_dirpath + '\\' + file)
158                 flag = True
159         if flag:
160 
161             for x in redundant_list:
162                 os.remove(x)
163                 print(x + " is removed.")
164         else:
165             print("Scan finished, no redundant img is found in assets.")
166 
167     def img_relocate(self, remote_img_ref, new_remote_img_ref, delete=True):
168         """将图床图片移动到合适位置"""
169         print('relocate_oss_existing_file process:', end='')
170 
171         def delete_(_remote_img_ref):
172             # delete 指示是否删除旧位置的文件
173             if delete:
174                 if bucket.delete_object(_remote_img_ref):
175                     print('deleted "' + self.get_filename_from_url(_remote_img_ref) + '" in original loc.')
176                     return True
177                 return False
178             p_dir = re.search('(.*)/', _remote_img_ref, re.S).group(1)
179             if bucket.delete_object(p_dir):
180                 # 清理掉旧的文件夹
181                 print('deleted empty loc.')
182             return True
183 
184         bucket = oss2.Bucket(self.auth, self.endpoint, self.oss_info['Bucket'])
185         exist = bucket.object_exists(new_remote_img_ref)
186         if exist:
187             return delete_(remote_img_ref)
188         else:
189             if bucket.copy_object(self.oss_info['Bucket'], remote_img_ref, new_remote_img_ref):
190                 return delete_(remote_img_ref)
191             else:
192                 return False
193 
194 if __name__ == '__main__':
195     md = ImgMD()
196     if config['clean_local_assets']:
197         md.clear_local_imgs()

   以上代码是根据文章开头的代码出处来修改的,请将以上文件保存成python文件 .py,然后运行即可。

标签:remote,img,self,Typora,list,多余,移除,print,ref
From: https://www.cnblogs.com/xiaokangkp0602/p/18044329

相关文章

  • python移除/删除非空文件夹/目录的最有效方法是什么?
    1.标准库参考:shutil.rmtree。根据设计,rmtree在包含只读文件的文件夹树上失败。如果要删除文件夹,不管它是否包含只读文件,请使用importshutilshutil.rmtree('/folder_name',ignore_errors=True)2.从os.walk()上的python文档中:#Deleteeverythingreachablefromthedirec......
  • 203. 移除链表元素C
    写了个递归/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*delect(structListNode*head,intx){if(!head)returnNULL;if(head->val==x){structListNode*......
  • 27. 移除元素C
    原本我想用头尾交换的双指针的,但是又要判断头尾是否相等,感觉不干净的感觉。就换成了类似筛选的前后双指针。一个是指向要放的位置,一个指向查看的位置。intremoveElement(int*nums,intnumsSize,intval){inti=0,j=0;while(j<numsSize){if(nums[j]!=va......
  • EasyBlogImageForTypora 上传报错,重新配置
    EasyBlogImageForTypora上传报错,重新配置先前使用EasyBlogImageForTypora上传图片正常,但是最近报错了(先前没弄明白报错原因,下载了项目代码,手动进行了调试)。上传图片接口服务器方法如下:查看VS监视结果发现:此时突然发现UserName与Password应该保持一致,是WebLogApi的参数,于......
  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • 代码随想录算法训练营day02 | leetcode 977. 有序数组的平方、35.搜索插入位置、34.在
    题目链接:977.有序数组的平方-简单题目描述:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9,16,100]......
  • Protable 树结构移除选中行
    信铁寒胜:它里面这个迭代的思想还是比较有用的。要在ProTable树形结构中实现移除选中行的功能,你需要做以下几步:在ProTable的父组件中定义数据源 data 和一个函数用于移除行。在ProTable组件中传入数据源和定义一个列,其中包含一个操作列,可以在该列中添加一个移除按钮。......
  • # 代码随想录算法训练营day01 | leetcode 704. 二分查找、35.搜索插入位置、34.在排序
    题目链接:704.二分查找-简单题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示......
  • dremio source 禁用source 不可用禁止移除与反射的一些问题
    实际上dremio的反射比较有意思,而且也比较强大,比如我们可以会想通过反射,当上游系统不可用的时候依然可以查询但是实际效果并不是这样的参考配置如下问题Thesource[s3]iscurrentlyunavailable.Metadataisnotaccessible;pleasechecknodehealth(orexternals......
  • 在Typora中设置文字颜色
    原文:https://developer.baidu.com/article/detail.html?id=307966&wd=&eqid=ef25a4f30000c19c0000000364702555在Typora中设置文字颜色的三种方法如下:方法一:使用内联公式开启使用内联公式。依次点击“文件”→“偏好设置”(或使用快捷键Ctrl+逗号),在弹出的窗口中选择“Markdown......