💬前言
以前记录一些笔记文章,都用Notion这款软件🖊️📒 但是有一天我发现连不上🚫Notion的网站了(平时主要在线用网页写文章) 误以为Notion跑路🏃了….后来才发现是我的网络🛜问题 不过数据在别人那里,总归是有风险的,无论是信息安全🔐,还是数据安全🔐 所以我打算把Notion里面所有的笔记导出➡️成markdown📃格式
🔧实施
Notion网页当中就已经包含了导出功能,点击Export按钮,就可以导出PDF,HTML,Markdown
导出之后是一个压缩包,解压之后可以看到,里面有很多文件夹,还有markdown文件, 图片就是存放在对应命名的文件夹中
可以看到markdown中的图片是链接到本地的
我们可以将图片一个一个上传到在线的图床上,替换这个连接就可以了 吗❓ 如果我有1000篇文章,我要一个个替换到🐒🧨🐎🌛去…… 就算上传到图床上去了,玩意在线图床挂了,那就凉凉
🙋如何解决这些问题呢?
答案就是让图片进行base64编码存储 这里有一个网站可以在线base64编解码https://base64.us/
🧑💻编码
为了实现批量处理这些文档中图片的编码 我需要实现一个Python脚步,来帮我自动处理这些文件 脚本代码如下
import os
import base64
import urllib.parse
import re
from PIL import Image
def replace(directory, output_directory,quality):
# 遍历目录中的所有markdown文件
for root, _, files in os.walk(directory):
for filename in files:
if filename.endswith(".md"):
filepath = os.path.join(root, filename)
# 读取markdown文件内容
with open(filepath, "r") as f:
content = f.read()
# 查找所有的图片链接并替换为base64编码
pattern = r"!\[(.*?)\]\((.*?)\)"
matches = re.findall(pattern, content)
ref_dict = {}
for match in matches:
img_path = os.path.abspath(os.path.join(os.path.dirname(filepath), urllib.parse.unquote(match[1])))
print("读取图片:"+img_path)
if not match[1].startswith("https://"):
try:
with Image.open(img_path) as img:
img = img.convert('RGB')
img.save("temp.webp", "WebP", quality=quality)
with open("temp.webp", "rb") as f:
img_data = f.read()
img_base64 = base64.b64encode(img_data).decode("utf-8")
ref_id = f"img-{base64.b32encode(match[1].encode()).decode()}"
ref_dict[ref_id] = f"data:image/webp;base64,{img_base64}"
img_tag = f"![{match[0]}][{ref_id}]"
content = content.replace(f"
![{match![0]}]({match[1]})
", img_tag)
except IOError:
print ("Error: "+img_path+"没有找到文件或读取文件失败")
else:
print("替换"+img_path+"成功")
img.close()
# 取消<aside>标签前后的换行符
content = re.sub(r"\n\s*</aside>", "</aside>", content)
content = re.sub(r"<aside>\s*\n", "<aside>", content)
# 在markdown文件末尾添加引用
ref_content = "\n\n".join([f"[{ref_id}]: {ref_url}" for ref_id, ref_url in ref_dict.items()])
content += f"\n\n{ref_content}"
# 写入修改后的markdown内容
output_filepath = os.path.join(output_directory, filename)
with open(output_filepath, "w") as f:
f.write(content)
if __name__ == '__main__':
replace(input("请输入markdown所在的文件夹路径: "), input("请输入输出文件夹的路径: "),float(input("请输入图片质量(0~100): ")))
在终端当中输入markdown所在的文件夹路径,以及处理后输出的文件夹路径 回车,程序就会从文件夹中自动搜寻图片,并进行base64编码,然后替换
📄结果
这些就是输出后的文件
替换后为了方便编辑和阅读markdown的图片地址,采用的引用的方式
具体的base64的编码在文档的最后面
🎙️总结
💡经过这样处理后的markdown文件,图片就内置在了文件当中,只要文件在图片就一直存在 💡缺点的话可能就是markdown文件体积增大了一点,不过你可以选择降低图片质量


...