插件接入二次开发(文档编写中)
插件接入二次开发(文档编写中)
因为AnyBlock做了一件Obsidian标准接口里没有提供的功能 ———— 真正地将 “特殊语法” 从块里释放了出来。 得益于OB接口允许插件之间的通信,其他开发者如果想要将使用一种类似的功能,可以接入AB插件进行快速开发。
为了方便接入二次开发,这里 如果你并非程序员,也可以看一下第一节(Tree-Level)的内容,会让你对插件的设计和使用更加熟悉。
Tree-Level
注意:这里的level数越小,代表父层次越高,level表示的其实是 indent-level
。并且这里允许level为非正数或非整数
tree-level [2table]
- list的level |
-
前的空格数量+1(范围[1,n]) - 位于根部正文的level | 0 (哪怕缩进,但注意列表下的缩进会被视为列表项)
- 负级列表的level(实验功能) |
<
的数量的负数(范围 [-3,-1]) - 标题的level |
#
的数量减去十(范围 [-9,-4]) - 特殊规则 - QA层的level | 0.5
此外, 列表选择器只会选择列表层级。 负列表选择器能选择负列表、正文、列表层级。 而标题或首尾选择器能选择全部的标题、负列表、正文、列表层级。
接口
注册新的处理器
<< 这是一种类似于 registerMarkdownPostProcessor()
的方法,主要区别:
- 要处理的文本不会局限于代码块中,而是基于
Range
。Range
可以通过各种局部或全局选择器进行选择,它会告诉你你要处理的是哪一部分的文本内容,你也可以在设置中打开线装饰
功能,来查看被选择的文本范围。 然后,你可以使用新的注册器对该区域进行处理。 - 该新的注册器还允许你使用正则等方式去匹配识别符
- 你可以注册两种处理器:文本处理器和渲染处理器 文本处理器可以叠加多个,渲染处理器之后不能再使用处理器
处理器接口
接口(v1.2旧版)
function registerABProcessor(sim: ABProcessorSpecSimp);
/** ab处理器接口 - 语法糖版 */
interface ABProcessorSpecSimp{
id: string // 唯一标识
name: string // 处理器名字
match?: RegExp|string // 处理器匹配正则(不填则为id,而不是name!name可以被翻译或是重复的)
detail?: string // 处理器描述
is_render?: boolean // 是否渲染处理器,默认为true。false则为文本处理器
process: (el:HTMLDivElement, header:string, content:string)=> HTMLElement|string
// 处理器
}
v1.3调整:扩展了处理器类型,以前仅支持文本处理器/渲染处理器两种,现在支持:
- 文本处理器| 文本->文本
- 文本渲染器| 文本->界面
- 渲染修饰器| 界面->界面(一般通过被包含到一个div实现)
- 文本解析器| 文本->数据(现在只有列表解析器一种)
- 数据转化器| 数据->数据
- 数据渲染器| 数据->界面
我用个树形来解释 [list2mermaid]
- 文本| 文本| 界面
- 文本
- 数据1| 数据1| 界面
- 数据2| 数据2| 界面
- 数据3| 数据3| 界面
- 界面| 界面
所以,新版接口为
function registerABProcessor(sim: ABProcessorSpecSimp);
/** ab处理器接口 - 语法糖版 */
interface ABProcessorSpecSimp{
id: string // 唯一标识
name: string // 处理器名字
match?: RegExp|string // 处理器匹配正则(不填则为id,而不是name!name可以被翻译或是重复的)
detail?: string // 处理器描述
// type_from: TypeProcessorData // (自动识别)处理器输入类型
// type_to: TypeProcessorData // (自动识别)处理器输出类型
is_show: boolean // 是否在推荐栏进行推荐(若否,则只能通过查表发现该处理器)
process: (el:HTMLDivElement, header:string, content:string)=> HTMLElement|string
// 处理器
}
只有当两个处理器的from-to接口相匹配时,才能串联他们
你可能会看到的常见数据:List_TableItem、List_ListItem、Tree
树格式
知识前置:Tree-Level AB插件会自动将局部的列表选择器或全局选择器里的大纲,转化为树形格式 (用列表格式存储,相较于抽象语法树AST更类似于md-it的Tokens,但语法会简单得多)
有多种不同格式的树,根据content的类型来判断
{
level:number,
content: str|Dom|Chat|any
}[]
你可以直接使用这个树形格式快速开发
处理器冲突问题
同种范围管理器的处理器,由于存在注册的先后问题并不会冲突。 不同范围管理器,则可能进行冲突。
如果他们的范围是真包含关系,范围更大的有可能影响范围更小的,也可能不影响(例如大范围的使用md方式)。 如果他们的范围是交错关系,则可能会产生bug。 一般而言不会发生后者这种情况,除非使用自由度较高的首尾范围选择器,这也是为什么我会说要谨慎使用首尾范围选择器,最好能用标题选择器来代替之
范围选择器
有两个范围选择器:Md范围选择器、HTML范围选择器
Md范围选择器接口:
export interface MdSelectorSpec {
from: number, // 替换范围
to: number, // .
header: string, // 头不是信息
selector: string, // 范围选择方式
content: string // 内容信息
}
HTML范围选择器接口:
{
}
sub_el, mdSrc.header, mdSrc.content
一些内部处理器
这些内部处理器对于
(beta)生命周期
(beta)用到的一些工具
Obsidian、CodeMirror、Mermaid 自不用多提。 Doxygen是一个可以根据代码注释生成文档的工具,支持HTML、CHM、LaTex等格式。主要支持C语言、Python语言,还支持C++、Java、C#等语言。