前段时间写了一个博客主题, 模板引擎是 rust tera
mikoto thememikoto.ea.chat然后我顺便想写个 markdown render 以便支持一些扩展语法.
然后我发现各种扩展兼容性很差, 这个扩展语法那个扩展语法符号冲突来冲突去的...
最后想想还不如自己重新发明, 然后就发明了 notedown
样式
基本样式的话就这些, 比 markdown 多一个 undercover, 当你鼠标移上去的话就会显示内容.
注意这里的公式, $$ 并不会自己换行, 只是单纯的变成 displaystyle 而已
其他也没啥好讲的, 就是 markdown 那一套
指令
很烦的一个事情就是 markdown 的每个扩展都要不同的词法, 记都记不住.
不如返璞归真, 直接向 tex 学习, 一个斜杠加一个单词搞定.
单行指令, 用于主要参数只有一个的情况, 有选项的话就没法这么用了.
字符指令, 用于有几个参数要传的情况
具名参数指令是标准化的传参方式. 虽然现在一般都是小括号表示函数调用, 但是 tex 里传统的就是大括号.
接下来看这个效果
notedown 把 code block 也看成了一种指令, 内容相当于自动传入 body 参数.
一般对于需要 body 参数的指令来说, 首个参数一定是 body.
下面类似 vue 的方式虽说不是无效的, 但是并不推荐使用, 我在想为了安全性考虑取消掉得了.
html 比 tex 排版复杂的一点在于, html 可以状态层叠.
比如什么选项卡之类的东西怎么处理呢? 这相当于有多个 body 参数啊.
原来的 vue syntax 主要就是这个用途, 后来我想到了 tex 里的宏单元
用 begin - end 块包围一个区域, 然后 push 分割区域给相应的参数不就行了吗.
这个是刚想到的还没完全测试过, 比如嵌套情况如何处理这些细节还要推敲下.
这样的话表达力应该是够了, 没有什么写着很麻烦的排版了, 主要工作量就是实现指令了.
比如插入音乐直接一个 netease 指令 so easy
然后下一步就是开发一个 vscode 插件, 现在的话高亮和格式化搞定了.
接下去写个预览功能, 这个就比较麻烦了, notedown 支持 import 一个其他文档或者图片或者音乐, 这就涉及 IO 了, 不是简单的字符串输入字符串输出了, 搞不懂调哪个 api.