md2notion开发详解:从convert到uploadBlock的实现原理
【免费下载链接】md2notionA better Notion.so Markdown importer项目地址: https://gitcode.com/gh_mirrors/md/md2notion
md2notion是一款强大的Markdown转Notion导入工具,它能够将Markdown文件高效转换并上传到Notion平台。本文将深入解析其核心实现原理,从Markdown内容的convert转换过程到Notion块的uploadBlock上传机制,为开发者呈现完整的技术流程。
核心功能概述
md2notion的核心功能是实现Markdown到Notion块的精准转换与上传。项目采用Python开发,通过md2notion/upload.py模块提供主要功能实现,支持标题、列表、图片、表格等多种Markdown元素的转换,以及本地图片的自动上传。
convert函数:Markdown到块描述符的转换
convert函数是md2notion的转换核心,位于md2notion/upload.py第114行。它接收Markdown文件或字符串作为输入,使用mistletoe库结合自定义的NotionPyRenderer渲染器,将Markdown内容转换为Notion块描述符数组。
def convert(mdFile, notionPyRendererCls=NotionPyRenderer): """ Converts a mdFile into an array of NotionBlock descriptors @param {file|string} mdFile The file handle to a markdown file, or a markdown string @param {NotionPyRenderer} notionPyRendererCls Class inheritting from the renderer incase you want to render the Markdown => Notion.so differently """ return mistletoe.markdown(mdFile, notionPyRendererCls)转换过程中,NotionPyRenderer会处理各种Markdown元素,将其映射为对应的Notion块类型。例如,将Markdown标题转换为Notion的标题块,列表转换为Notion的列表块等。对于不支持的元素,会进行降级处理,如将h1、h2标题统一转换为h3标题(md2notion/NotionPyRenderer.py第210行)。
uploadBlock函数:Notion块的创建与上传
uploadBlock函数是块上传的核心实现,位于md2notion/upload.py第50行。它接收块描述符、父块、Markdown文件路径等参数,负责在Notion中创建对应的块,并处理图片上传等特殊逻辑。
基本流程
- 块类型解析:从块描述符中获取块类型,并创建对应的Notion块
- 特殊块处理:
- 图片块:处理本地图片路径,调用upload_file方法上传图片
- 表格块:创建集合视图,设置表格 schema 和行数据
- 子块递归上传:如果块描述符包含子块,递归调用uploadBlock上传子块
图片上传逻辑
对于图片块,uploadBlock会检查图片源是否为本地文件。如果是本地文件,会通过relativePathForMarkdownUrl函数解析正确的文件路径,然后调用upload_file方法将图片上传到Notion(md2notion/upload.py第91行)。
if issubclass(blockClass, EmbedOrUploadBlock): imgRelSrc = blockDescriptor["source"] if re.search(r"(?<!file)://", imgRelSrc, re.I): return #Don't upload images that are external urls if imagePathFunc: #Transform by imagePathFunc insteadif provided imgSrc = imagePathFunc(imgRelSrc, mdFilePath) else: imgSrc = relativePathForMarkdownUrl(imgRelSrc, mdFilePath) if not imgSrc: print(f"ERROR: Local image '{imgRelSrc}' not found to upload. Skipping...") return print(f"Uploading file '{imgSrc}'") newBlock.upload_file(str(imgSrc))表格处理逻辑
对于表格块,uploadBlock会创建集合视图,并根据块描述符中的schema和rows数据初始化表格结构和内容(md2notion/upload.py第92-108行)。
整体工作流程
md2notion的整体工作流程可以分为以下几个步骤:
- 解析Markdown文件:通过filesFromPathsUrls函数处理输入的文件路径或URL,获取Markdown文件内容
- 转换为块描述符:调用convert函数,将Markdown内容转换为块描述符数组
- 上传块到Notion:遍历块描述符数组,调用uploadBlock函数将每个块上传到Notion
这一流程在upload函数中得到体现(md2notion/upload.py第123行):
def upload(mdFile, notionPage, imagePathFunc=None, notionPyRendererCls=NotionPyRenderer): # Convert the Markdown file rendered = convert(mdFile, notionPyRendererCls) # Upload all the blocks for idx, blockDescriptor in enumerate(rendered): pct = (idx+1)/len(rendered) * 100 print(f"\rUploading {blockDescriptor['type'].__name__}, {idx+1}/{len(rendered)} ({pct:.1f}%)", end='') uploadBlock(blockDescriptor, notionPage, mdFile.name, imagePathFunc)总结
md2notion通过convert和uploadBlock两个核心函数,实现了Markdown到Notion的高效转换与上传。convert函数负责将Markdown内容解析为结构化的块描述符,uploadBlock函数则负责将这些描述符转换为实际的Notion块,并处理图片上传等特殊逻辑。这种模块化的设计使得代码结构清晰,易于扩展和维护。
通过深入理解这些核心函数的实现原理,开发者可以更好地使用md2notion工具,或者根据自己的需求进行定制化开发。无论是简单的Markdown导入,还是复杂的文档迁移,md2notion都提供了可靠的技术支持。
【免费下载链接】md2notionA better Notion.so Markdown importer项目地址: https://gitcode.com/gh_mirrors/md/md2notion
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考