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