跳至主要內容

插件接入二次开发(文档编写中)

LincZero大约 5 分钟

插件接入二次开发(文档编写中)

因为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() 的方法,主要区别:

  1. 要处理的文本不会局限于代码块中,而是基于 RangeRange 可以通过各种局部或全局选择器进行选择,它会告诉你你要处理的是哪一部分的文本内容,你也可以在设置中打开 线装饰 功能,来查看被选择的文本范围。 然后,你可以使用新的注册器对该区域进行处理。
  2. 该新的注册器还允许你使用正则等方式去匹配识别符
  3. 你可以注册两种处理器:文本处理器和渲染处理器 文本处理器可以叠加多个,渲染处理器之后不能再使用处理器

处理器接口

接口(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、LaTexopen in new window等格式。主要支持C语言、Python语言,还支持C++、Java、C#等语言。