💬前言

以前记录一些笔记文章,都用Notion这款软件🖊️📒 但是有一天我发现连不上🚫Notion的网站了(平时主要在线用网页写文章) 误以为Notion跑路🏃了….后来才发现是我的网络🛜问题 不过数据在别人那里,总归是有风险的,无论是信息安全🔐,还是数据安全🔐 所以我打算把Notion里面所有的笔记导出➡️成markdown📃格式

🔧实施

Notion网页当中就已经包含了导出功能,点击Export按钮,就可以导出PDF,HTML,Markdown

NotionPageExport

ExportMarkdown

导出之后是一个压缩包,解压之后可以看到,里面有很多文件夹,还有markdown文件, 图片就是存放在对应命名的文件夹中

ExportResult

可以看到markdown中的图片是链接到本地的

Path

我们可以将图片一个一个上传到在线的图床上,替换这个连接就可以了 吗❓ 如果我有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编码,然后替换

replaceCommand

📄结果

这些就是输出后的文件

The result after replacement

替换后为了方便编辑和阅读markdown的图片地址,采用的引用的方式

referencePath

具体的base64的编码在文档的最后面

base64code

🎙️总结

💡经过这样处理后的markdown文件,图片就内置在了文件当中,只要文件在图片就一直存在 💡缺点的话可能就是markdown文件体积增大了一点,不过你可以选择降低图片质量