模块转换
为什么要自定义转换?
Notion Flow 转换 Notion 内容的格式是按照 Github 的 Markdown 格式,但是 Notion 中的模块有些无法转换成标准 Markdown 格式,这里有两个典型场景:
- Notion Bookmark 在标准 Markdown 中无对应格式,Notion Flow 默认转成链接格式。
- Notion 中的图片中的 Caption,想要在博客中将其设置为图片的图片描述,Notion Flow 默认忽略该属性。
支持的模块
也许你不想要我给你预设好的 Notion 模块转 Markdown 格式,因此,本插件支持你自己写如何转换 Notion 模块,除了下面所述的三种模块不支持转换外,其他的全部模块均支持,有些模块为了方便我还添加了额外的属性(见下面)。
不支持的模块处理
对于不支持的模块,如 embed、toggle、template 等,你需要自己按照下面描述的要求自行书写模块转换函数,如果一个模块不是标准 Markdown 模块,你又没有自己写对应的模块转换函数,那么该模块将会被忽略。
标准 Markdown 不能转换的模块
列表类型,由于其在 Notion 中可以嵌套,因此其内的子元素是通过接口递归获取的,相对其他模块而言比较麻烦,而且它的 Markdown 语法比较统一,因此不支持自定义转换,其中包括:
- to_do
- numbered_list_item
- bulleted_list_item
额外添加的模块属性
各个模块的函数,除了 Notion 给的模块默认属性 外,我还添加了额外的属性,各个模块额外属性分别如下(部分字段可能覆盖 Notion 模块字段, 如无特殊说明均为 string
):
- paragraph
- text: 文本内容,不带格式
- bookmark
- title: 标题
- desc: 描述
- img: bookmark 左侧的小图片(地址是 bookmark 引用链接的 favicon,可能由于同源策略无法正确显示)
- image
- url: 图片地址(上传到 OSS 及添加 CDN 地址后的最终地址)
- caption: 图片描述
// 内部处理为
``
- heading_1/2/3
- text: 文本内容,不带格式
- table
- rows: 表格的 row 子元素列表,里面包含了 cells 字段,具体参看 Notion API 文档,内部对此的默认处理是:
block.rows.reduce((prev: string, curr: string, index: number) => {
const cells = curr[curr.type].cells;
let divider = '';
const cellsString = cells.map((cell: any, key: number) => {
// Note: cell is rich_text, here transform to string
const str = `| ${_inline(cell)} `;
if (key === cells.length - 1) {
divider += `| ---------- |\n`;
return `${str}|`
}
divider += `| ---------- `;
return str;
}).join('');
return prev += `${cellsString}\n${index === 0 ? divider : ''}`;
}, '')
- rows: 表格的 row 子元素列表,里面包含了 cells 字段,具体参看 Notion API 文档,内部对此的默认处理是:
- quote
- text: 文本内容,不带格式
- color: quote 左侧的边框颜色,从 Notion 官网窃得
- callout
- icon: callout 左侧的图标
- text: 文本内容,不带格式
- color: callout 字体颜色
- bgColor: callout 背景颜色
- divider
- 无额外属性
- video(包括文件类型和 Youtube、Bilibili 外部链接)
- block.type === 'file'
- url: 上传到 OSS 后同时加上 CDN 地址的最终地址
- caption: 视频描述
- suffix: 视频后缀
- block.type === 'external'
- yid: YouTube 的视频 id
- bid: Bilibili 的视频 id
- caption: 视频的描述
- url: 外部视频地址
- block.type === 'file'
- code
- text: 代码文本内容,不带格式
- equation
- text: 公式文本内容,不带格式
如何使用自定义模块转换?
首先在插件配置中打开发布功能(废话),然后在「模块处理插件」中,书写对应代码即可:
书写格式要求
提示
如果书写的函数不符合要求,将使用默认的模块转换逻辑。
配置书写非常简单,只要满足以下条件即可:
-
配置是一个对象,对象的键为模块名,值 必须为带有函数名 的函数,使用匿名函数将会报错,如
{
bookmark: function (block) {} // Error!
} -
配置对象首行不能为空。
-
配置对象的键对应的函数值,参数即为上面所述的模块(加上我给的额外属性),名字为
block
。 -
函数的返回值即为最终的模块转换成 Markdown 的值。
配置举例:
{ // <-- 首行不能为空!
bookmark: function any_name_you_want(block) {
return `[${block.title}](${block.url})`;
},
image: function any_name_you_want(block) {
return ``;
}
}