试过了使用typora和vscode写markdown,觉得还是typora的所见即所得的体验更好,然而写markdown总会遇到的问题的图床(markdown只是一个文本文件,图片需要以外部链接的方式表示),之前一段时间一直在使用picgo实现上传剪贴板图片文件到github的方式得到图片的链接,从而解决markdown的图床问题,本身这已经是一个非常好的解决方法了,但是仍然存在一些不足:
- 每次截图完成之后,都需要分别上传,显得有些麻烦,能不能一次性完成所有图片的上传呢?
-
图片上传到github可能需要一些时间,会打断写作的思路。然而picgo不能够在图片上传完成之前就返回图片的链接(其实对于github图床是可以实现先给出链接,之后再上传)
思路
于是,我就想到一个思路,能不能先将图片保存到本地目录(typorad支持将剪贴板图片保存到本地指定目录),先完成markdown文档的书写,之后利用python读取markdown源码,查找所有的图片链接,对这些图片进行上传,得到这些图片的github链接之后,完成对于markdown文件图片链接的替换,近乎实现了一键上传所有图片的功能。
上述方案中存在一个本地图床目录和一个github远端图床目录,于是很自然的想到直接新建一个github仓库用于完成线上线下图床文件夹的同步,在本地编写markdown文件时只需要将图片丢进github仓库的本地目录即可。
用一个框图表示整个过程
这里给出查找替换图片链接的python代码
需要根据自己的情况修改path_offline
和path_online
# coding:utf-8
import os
import argparse
# 线上线下图床位置已经确定不变
path_offline = r"E:\我的坚果云\我的坚果云\博客图床\One-click-picgo\imgs" + '\\' # 本地图床目录
path_online = "https://raw.githubusercontent.com/your_github_id/repo_name/master/imgs/" # 线上图床目录
path_out = 'notes/' # 转换完成后的md文件保存路径
if not os.path.exists(path_out):
os.mkdir(path_out)
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--path", help="the path of your md file")
if __name__ == '__main__':
args = ap.parse_args()
path_md = args.path
# 被处理的md文件可以和本py文件处于同一目录,也可以处于py文件的下一级文件夹内
if '\\' in path_md:
folder, name = path_md.split('\\')
else:
name = path_md
path_out_md = "notes\\" + name
print("在线版markdown文件生成在目录:", path_out_md)
with open(path_md, 'r', encoding='utf-8') as f: # 需要手动指定解码的格式
lines = f.readlines()
out = [l.replace(path_offline, path_online) for l in lines]
with open(path_out_md, 'w', encoding='utf-8') as f:
f.writelines(out)