github obgnail/typora_plugin 1.14.4

latest releases: 1.15.11, 1.15.10, 1.15.9...
3 months ago

changelog

  1. 【refactor】resourceOperation 重构为 resource_manager,大幅提升性能,有效避免潜在 BUG,重构原因见下文
  2. 【refactor】移除插件 help,将功能迁移到 preferences 中
  3. 【feat】支持 AI Docs,用户可以通过 DeepWiki 向 AI 提问 typora_plugin 的相关技术细节
  4. 【feat】【core \ dialog-form】支持 hint 组件,支持 listener,优化内部接口
  5. 【feat】【preferences】使用上述 hint 组件,为复杂配置选项添加说明文案
  6. 【chg】【updater】【templater】优化 UI,用户交互更友好
  7. 【chg】【window_tab】配置选项 JETBRAINS_DRAG_STYLE 替换为 DRAG_STYLE
  8. 【chg】优化 bin 目录中的安装/卸载脚本
  9. 【chg】【echarts】【fence_enhance】优化代码
  10. 【chg】【help】调整右键菜单选项
  11. 【chore】新增 build 目录,快速构建插件依赖(为了保证插件独立性,typora_plugin 采用分布式依赖)
  12. 【doc】优化 readme 文案
  13. 【refactor】【search_multi】重构 searcher,将 markdownIt 替换为 mdast,提供更多组件支持,实现更优雅(大文件解析性能下降 8x,无奈放弃了)

与 AI 做朋友

此版本后,如有使用上的问题,可以向 AI 提问:

IMG_2025-05-18_20-41-57 (1)

resourceOperation 重构原因
  1. 很多人没有意识到 markdown 的图片语法 ![alt](uri)存在二义性 的。核心问题就是 uri 可能出现小括号。比如:![alt](./img().png)123),图片路径究竟是 ./img( 还是 ./img().png 还是 ./img().png)123

  2. 我看了 CommonMark 的 Spec

    • 要求链接语法中 uri 的小括号必须转义。如:[link](\(foo\))
    • 然而图片语法中的 uri 小括号又没有做要求,完全没解释
  3. 我试了试手头的 Markdown 编辑器,发现存在以下几种方法:

    1. 遵循 CommonMark 的链接语法, uri 的小括号必须转义
    2. 强制转义 uri
    3. 使用 <> 包裹,如 ![alt](<./img().png>)
    4. 限缩语法,要求 uri 的小括号必须平衡,不平衡的 uri 不给用
  4. 为了处理此问题,我之前设计的方案是 回退匹配+检测。逻辑太复杂了,需要回流检测,性能不好。具体做法如下:对于文本 ![alt](./image(1).png)123)456

    1. 首先贪婪匹配到 ![alt](./image(1).png)123),此时 uri 为 ./image(1).png)123,检测是否存在此文件

    2. 若不存在,则回退匹配为 ![alt](./image(1).png)

    3. 递归处理上述逻辑

  5. 经过尝试,我发现 Typora 采用了上述的第四种方法,依照 Typora 的外部表现特征,设计如下文法,并依照此文法做了一个简易的递归向下解析器,在文法层面就去除了二义性,无需回流检测,简单、优雅、高效。

    <MarkdownImage> ::= '![' <AltContent> '](' <UriContent> ')'
    <AltContent> ::= <CharExclCloseBracket> <AltContent> | ε
    <UriContent> ::= <UriItem> <UriContent> | ε
    <UriItem> ::= <CharExclParens> | '(' <UriContent> ')'
    <CharExclCloseBracket> ::= [^\[\]\n]
    <CharExclParens> ::= [^\(\)\n]
    

    吐槽:本来无需文法解析器,使用递归正则表达式即可完成匹配,辣鸡 JavaScript,不支持递归正则,不如 Python 的一根毛

Don't miss a new typora_plugin release

NewReleases is sending notifications on new releases.