最近入坑了Notion。被它的简洁设计与高效率打动,毅然决然舍弃Typora,转战Notion。
但是,原来在Typora上的写的文章笔记,直接import进notion时,发现latex公式全都无法显示。这就很离谱。对文章中写了大量公式的我来说,十分不友好!
抱着试一试的心态,上github看看有没有解决这个问题。一看还真有,果然github无所不能?。
github上有个叫 md2notion 的python库,它提供的方法是直接 pip install md2notion 就能使用,不过我安装完跑它代码时提示 md2notion is not a package ,只好把在pip安装文件夹里找到package,放到代码文件夹里,才能使用。
ok先来看他的github使用教程:
from notion.client import NotionClient
from notion.block import PageBlock
from md2notion.upload import upload
client = NotionClient(token_v2="<token_v2>")
page = client.get_block("https://www.notion.so/myorg/Test-c0d20a71c0944985ae96e661ccc99821")
with open("TestMarkdown.md", "r", encoding="utf-8") as mdFile:
newPage = page.children.add_new(PageBlock, title="TestMarkdown Upload")
upload(mdFile, newPage)
针对latex,最后的upload要改成:
upload(mdFile, newPage, notionPyRendererCls=addLatexExtension(NotionPyRenderer))
简单说明一下这里要改的几个参数:
- token_v2是你登录进网页版的notion,浏览器对
www.notion.so.com 这个站点的cookies。F12控制台就可以看到,复制过来就好。
- page里的url是需要添加进的notion页面地址
- TestMarkdown.md就是你的md文件
我们试一下发现
按他的方法确实可以把md转到notion,不过仍然存在一个问题,就是行内的latex是可以显示的,即这种$...$ 包起来的latex语句,但对于行间公式 即 $$...$$ 这种是不行的,原因是他必须前后都有一个空格,才能被识别出来。我们在Typora中写的公式块(如下)前后是没有空格的
所以,我们只需要在包含 $$...$$ 的前后手动加上换行符就ok。
直接上代码:
with open("TestMarkdown.md", "r", encoding="utf-8") as mdFile:
newPage = page.children.add_new(PageBlock, title="TestMarkdown Upload")
lines=mdFile.readlines()
new_lines = lines.copy()
flag = 0
insert_nums = 0
for (i, line) in enumerate(lines):
if i > 0 and i < len(lines) - 2:
if flag == 0 and line == '$$\n':
pos = i + insert_nums
new_lines.insert(pos, '\n')
insert_nums += 1
flag = 1
elif flag == 1 and line == '$$\n':
pos = i + insert_nums + 1
new_lines.insert(pos, '\n')
insert_nums += 1
flag = 0
rendered = convert(new_lines, addLatexExtension(NotionPyRenderer))
for blockDescriptor in rendered:
uploadBlock(blockDescriptor, newPage, mdFile.name)
这里还有一个坑,这样子实现后,latex行间公式是可以显示了,但是公式的内容却有问题,
原来是每个 / 字符在 NotionPyRender 这个渲染模块里被强制转义成 // ,这个还好解决,直接定位到 NotionPyRender 代码文件,找到 render_block_equation 这个函数,把图中对应的代码改成如下形式就好了
最终Notion的结果:
完结撒花!
|