Files
playbook/tools/tsl-codegen/STANDARD.md
T
csh aa8a3e73a8 🐛 fix(tsl-codegen): make TSF conversion best effort
Recover recognizable function, procedure, class, and unit structure from
nonstandard TSF input while preserving strict parsing for compliant files.

Keep STANDARD.md limited to published format requirements and cover
recovery paths with regression tests.
2026-07-30 09:20:18 +08:00

37 KiB
Raw Blame History

TSL API 文档标准

本文件是 TSL codegen API 文档的唯一标准,包含 markdown 存储格式、tsf 源码 文档格式、yaml/json 录入格式和统一索引格式。

适用范围:references/codegen/**/*.md 中的 function、class 和 unit API。

目录

基本原则

  • 发布的 API 文档使用本标准定义的 markdown 存储格式
  • tsf 源码文档、yaml/json 录入数据与 markdown 的字段映射以本标准为准
  • 一个录入文件对应一个 markdown 叶子页;录入根固定为 modulepathdeclarations
  • declarations 是非空有序列表,function、class、unit 可以混合;列表顺序即文档顺序
  • function 调用签名只记录显式名称和参数名,不包含类型、默认值或语义推断内容
  • API 标题的反引号内只写名称或调用签名,不写 function、class、property 等声明术语
  • 每个 API 用独立的 声明:... 行记录声明种类
  • 描述紧跟声明行;tags 是描述的检索补充,位于完整描述之后
  • 描述末尾不写句号
  • 示例输出必须全部写成 // 注释,不得把裸结果写成 TSL 语句
  • 一个 tsl 代码块只放一个独立示例

markdown 存储格式

页面与统一顶级声明

每个 markdown 叶子页使用一个 H1 模块标题,并包含一个或多个 H2 顶级声明。 function、class、unit 都是同级的顶级声明,可以出现在同一页面中;每个 H2 的声明 种类写在自身正文的 声明:function|class|unit 行中。

目录承担领域或模块分组,叶子页承担 API 主题分组,H2 承担顶级声明分组。markdown 不要求一个 class 对应一个 md;多个独立 class 声明可以进入同一叶子页,也可以在 内容过长或主题不同时拆到同一目录下的多个叶子页。例如 OpenXmlAttributeOpenXmlElement 可以作为两个 H2 同处 officexml/openxml/elements.md。一个 markdown 叶子页可以收录多个对外顶级声明。

顶级声明和成员都按文档顺序存储,不按名称、种类或可见性重新排序。每个顶级声明 按以下共同顺序开始:

  1. H2 标题:function 写调用签名,class 和 unit 写简单名称
  2. 唯一且精确的 声明:function声明:class声明:unit
  3. 描述,必填;声明行之后的首个非空正文必须是描述
  4. <!-- tags: 关键词1 关键词2 -->,可选;位于完整描述之后

标题层级和声明值必须符合下表,不允许在其他层级使用这些声明值:

位置 标题层级 允许的声明值
顶级声明 H2 functionclassunit
顶级 class 成员 H3 functionclass functionpropertyfieldstatic fieldconststatic const
unit interface direct member H3 functionvarconstclass
unit interface class 成员 H4 与顶级 class 成员相同

H2、H3、H4 中反引号包围的内容是 API 名称或调用签名。functionclass functionproperty 等声明术语只写在声明行中,不写进标题。

本标准中的“调用签名”只包含名称和参数名,例如 abs(x),不是 TSL 声明语句 function abs(x);。声明行只参与文档结构识别,不属于名称、调用签名或调用语法。 例如 class 下的 H3 标题 Save() 紧跟 声明:function,表示实例 function;可调用 内容仍是 Save(),不能把两行拼成 function Save()

每个 API 必须且只能写一行 声明:...,并将它作为标题后的第一条非空正文。 声明 后使用全角冒号,声明值使用本标准规定的小写形式。普通内容标题不包含 反引号,也不紧跟声明行,因此不进入 API 索引;普通 H2 同时结束前一个顶级声明的 正文范围。

同一所属范围和声明种类内,重复 class/unit 名称或重复 function 调用签名不允许; function 重载和跨声明种类同名允许。

function

页面结构

顶级 function 使用 H2function 的示例标题使用 H3。每个 function 声明按以下 顺序书写:

  1. ## \调用签名``
  2. 声明:function
  3. 函数描述,必填
  4. <!-- tags: 关键词1 关键词2 -->,可选
  5. 参数表,有参数时必填
  6. 参数取值说明,可选
  7. 返回:类型
  8. ### 示例,可选;包含一个或多个“范例NN:说明”和独立的 tsl 代码块

标签

标签位于完整函数描述之后,用空格分隔检索关键词:

<!-- tags: 数组 排序 去重 -->

没有关键词时删除整行,不保留空标签。

参数表

参数表固定为三列:

| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `src` | array | 待处理数组 |

规则:

  • 参数名必须与 function 调用签名一致
  • 必填参数说明直接写用途
  • 可选参数说明以 可选。 开头,并说明默认值
  • 多类型使用 \|,例如 nil\|array
  • 变参使用 ... 作为参数名
  • 无参 function 省略参数表

参数取值

枚举参数在参数表之后、返回类型之前列出:

**mode 取值**

- `0` — 原样返回
- `1` — 去重

返回类型

每个顶层 function 必须包含非空返回类型:

返回:array

示例代码

  • 每个示例以“范例NN:说明”开头,编号按出现顺序排列并至少保留两位
  • 代码围栏使用 tsl
  • 一个代码围栏只放一个独立示例
  • 字符串使用直引号 '"
  • 注释使用 //,不使用 (* *)
  • 每条语句保留分号
  • 没有输出时可以省略输出注释
  • 单行输出写成 // 输出:<值>
  • 多行输出第一行写 // 输出:,后续每一行输出都以 // 开头

多行输出示例:

return demoLines();
// 输出:
// 第一行
// 第二行

完整页面示例

以下 API 仅用于说明存储格式,不代表真实 TSL API:

# 示例 / 数组

## `demoFn(src, mode, factor, ...)`

声明:function

按指定模式处理数组并返回结果

<!-- tags: 示例 数组 -->

| 参数     | 类型       | 说明                             |
| -------- | ---------- | -------------------------------- |
| `src`    | array      | 待处理数组                       |
| `mode`   | integer    | 处理模式,取值见下               |
| `factor` | float      | 可选。默认 1.0,结果乘以该系数   |
| `...`    | nil\|array | 可选。需要追加处理的其他数组     |

**mode 取值**

- `0` — 原样返回
- `1` — 去重

返回:array

### 示例

范例01:指定处理模式和系数

```tsl
src := array(1, 1, 2);
return demoFn(src, 1, 2.0);
// 输出:array(2,4)
```

范例02:使用默认系数

```tsl
src := array(1, 1, 2);
return demoFn(src, 0);
```

## `demoNow()`

声明:function

返回示例值

返回:integer

class

页面结构

顶级 class 使用 H2class 成员使用 H3,function 的参数取值或示例使用 H4。H2 正文 按以下顺序书写:

  1. ## \ClassName``
  2. 声明:class
  3. class 描述,必填
  4. tags,可选;位于完整描述之后
  5. 父类:BaseClass,可选;多父类按声明顺序列出
  6. class 成员,按声明顺序书写

成员标题与正文

class 成员标题统一只写反引号包围的名称或调用签名,例如 ### \Create(name)`### `Title``。成员的声明种类由标题后的声明行表达:

  • 实例方法:声明:function
  • 类方法:声明:class function
  • property声明:property
  • 实例/静态字段:声明:field / 声明:static field
  • 实例/静态常量:声明:const / 声明:static const

每个成员都按“标题、声明行、描述、tags、成员数据”的共同顺序开始。function 的 正文结构与顶级 function 相同,实例 function 和 class function 都按描述、tags、 参数表、参数取值、返回类型、示例的顺序书写。源码声明了返回类型时必须写 返回:类型;没有返回类型时省略,不补写 void。位于 class 中时, 标题及其子标题整体下移一级:function 标题从 H2 变为 H3,参数取值和示例标题从 H3 变为 H4。成员另外必须写 可见性:public|protected,并可写 修饰符;类方法由 声明:class function 表达。

property 必须写访问方式;有类型时写 类型:...,没有类型时省略。field 必须写 类型,const 必须写值。

完整页面示例

以下示例以 OpenXmlAttribute 的公开成员为基础,并加入一个 class function,用于 说明 class 的 markdown 存储格式:

# OfficeXml / OpenXml

## `OpenXmlAttribute`

声明:class

表示一个 OpenXml 属性

<!-- tags: OpenXml XML 属性 -->

### `create(_prefix, _local_name)`

声明:function

创建不带初始值的 OpenXml 属性

<!-- tags: OpenXml 属性 创建 -->

可见性:`public`

修饰符:`overload`

| 参数          | 类型   | 说明         |
| ------------- | ------ | ------------ |
| `_prefix`     | string | 命名空间前缀 |
| `_local_name` | string | 本地名称     |

### `create(_prefix, _local_name, _value)`

声明:function

创建带初始值的 OpenXml 属性

<!-- tags: OpenXml 属性 创建 -->

可见性:`public`

修饰符:`overload`

| 参数          | 类型   | 说明         |
| ------------- | ------ | ------------ |
| `_prefix`     | string | 命名空间前缀 |
| `_local_name` | string | 本地名称     |
| `_value`      | any    | 属性值       |

### `CreateVirtual(position, row_index, _story)`

声明:class function

创建虚段落

可见性:`public`

| 参数        | 类型      | 说明     |
| ----------- | --------- | -------- |
| `position`  | integer   | 段落位置 |
| `row_index` | integer   | 行索引   |
| `_story`    | StoryNode | 故事节点 |

返回:ParagraphSegment

### `Prefix`

声明:property

命名空间前缀

可见性:`public`

类型:string

访问:read / write

### `LocalName`

声明:property

本地名称

可见性:`public`

类型:string

访问:read / write

### `ElementName`

声明:property

包含前缀的完整属性名称

可见性:`public`

类型:string

访问:read / write

### `Value`

声明:property

属性值

可见性:`public`

类型:any

访问:read / write

### `NamespaceUri`

声明:property

命名空间 URI

可见性:`public`

类型:string

访问:read / write

unit

页面结构

顶级 unit 使用 H2interface direct member 使用 H3interface class 的成员或 unit function 的参数取值/示例使用 H4interface class function 的参数取值/示例 使用 H5。H2 正文按以下顺序书写:

  1. ## \UnitName``
  2. 声明:unit
  3. unit 描述,必填
  4. tags,可选;位于完整描述之后
  5. interface direct member,按声明顺序书写

成员标题与正文

H3 direct member 标题只写名称或调用签名。标题后的声明行只允许:

  • interface function声明:function
  • variable声明:var
  • constant声明:const
  • interface class声明:class

每个 direct member 都按“标题、声明行、描述、tags、成员数据”的共同顺序开始。 unit direct member 都来自 interfacevisibility 固定为 public,正文不重复记录。 unit function 复用顶级 function 格式并要求返回 类型,var 必须写类型,const 必须写值。interface class 的 H4 成员复用顶级 class 的成员格式,并显式写 可见性:public|protected

完整页面示例

# 示例 / 文档运行时

## `DocumentUnit`

声明:unit

提供文档运行时接口

<!-- tags: 运行时 文档 -->

### `DefaultSize`

声明:const

默认缓冲区大小

值:`100`

### `CurrentDocument`

声明:var

当前文档

类型:Document

### `OpenDocument(path)`

声明:function

打开文档

| 参数   | 类型   | 说明     |
| ------ | ------ | -------- |
| `path` | string | 文档路径 |

返回:Document

### `Document`

声明:class

文档对象

父类:`BaseDocument`

#### `Save()`

声明:function

保存文档

可见性:`public`

返回:boolean

综合示例

同一叶子页可以按文档顺序混合三种顶级声明。以下 API 仅用于说明存储格式,不代表 真实 TSL API:

# OfficeXml / OpenXml

## `OpenXmlAttribute`

声明:class

表示 OpenXml 属性

<!-- tags: OpenXml XML 属性 -->

### `create(_prefix, _local_name)`

声明:function

创建属性

<!-- tags: OpenXml 属性 创建 -->

可见性:`public`

| 参数          | 类型   | 说明         |
| ------------- | ------ | ------------ |
| `_prefix`     | string | 命名空间前缀 |
| `_local_name` | string | 本地名称     |

## `ParseOpenXml(xml)`

声明:function

解析 OpenXml 文本

<!-- tags: OpenXml XML 解析 -->

| 参数  | 类型   | 说明         |
| ----- | ------ | ------------ |
| `xml` | string | OpenXml 文本 |

返回:OpenXmlElement

### 示例

范例01:解析文本

```tsl
return ParseOpenXml('<root/>');
```

## `OpenXmlRuntime`

声明:unit

提供 OpenXml 运行时接口

<!-- tags: OpenXml 运行时 -->

### `OpenXmlElement`

声明:class

表示文档元素

<!-- tags: OpenXml XML 元素 -->

#### `Save()`

声明:function

保存元素

可见性:`public`

返回:boolean

tsf 源码文档格式

tsf 主要使用 functionunittype 三种顶层组织方式。本标准按这三种方式 分别定义源码文档格式。每个 tsf 源码文档对应一个对外顶级声明。

function

独立顶层 function 可以在源码中记录函数级文档。签名、参数类型、默认参数和返回 类型由源码声明提供,描述、标签、参数说明、枚举值和示例由文档块提供。

  • 一个 function tsf 文件只以第一个顶层 function 作为对外主函数;后续辅助函数不属于 该文件的对外文档
  • 顶层 procedure 不在本节规定的 function 文档格式范围内
  • modulepath 是页面级录入字段,不属于单个函数的文档块

文档块位置

文档块必须是主函数 begin 之后的第一段非空内容,并且位于任何可执行语句、 编译指令或其他注释之前

文档块由连续的 /// 行组成,并允许按照函数体缩进。/// 之前的空白以及其后的 一个可选空格不属于文档内容。遇到第一行非 /// 内容时,文档块结束;函数体后续 位置的注释是普通注释

TSL 解释器将 /// 作为普通的 // 行注释;本标准使用第三个 / 区分文档行与普通 注释

文档块结构

文档块按以下顺序书写:

  1. 函数描述,一行或多行,必填
  2. @tags: 标签1 标签2,可选,最多一行,标签使用空白分隔
  3. 参数组,按声明顺序书写;每组先写 @param: name 参数说明,再按需紧跟一个 @values: name
  4. @returns: 类型,可选,最多一行
  5. 示例组,可选,可以重复;所有示例组必须位于文档块末尾

空的 /// 行可以在多行函数描述或示例中保留空行。指令名固定为小写;未知指令、 重复的 @tags:/@returns:、同一参数重复的 @param:/@values:,以及不符合上述 顺序的指令均不符合本标准。@example: 可以重复,@output: 在同一示例组内最多出现 一次。

写法 必填 json 映射 规则
描述正文 declarations[].desc 第一条指令之前的所有正文,保留换行
@tags: 标签1 标签2 declarations[].tags 使用一个或多个空白字符分隔;忽略首尾空白;标签本身不得包含空白
@param: name 参数说明 有参时 declarations[].params[].desc 第一个词是参数名,其余内容是说明;说明不得为空
@values: name declarations[].params[].values 值表规则见下;参数必须已经由 @param: 声明
@returns: 类型 declarations[].returns 类型不得为空;与声明返回类型同时存在时必须一致
@example: 示例说明 declarations[].examples[].desc 开始一个示例组;说明不得为空
示例代码 示例组内 declarations[].examples[].code 内容行额外缩进两个空格;至少包含一个非空代码行
@output: declarations[].examples[].output 原始输出额外缩进两个空格;存在时不得为空

@param:@values: 中的参数名与函数声明大小写无关地匹配;映射后的参数名保留 函数声明中的拼写。

字段来源与映射

以下字段由主函数声明以及必要的文档指令确定:

tsf 声明内容 json 字段 映射规则
函数名 declarations[].name 保留声明名称
函数名和参数名 declarations[].signature 规范化为只含名称的调用形式,不复制类型或默认值
参数类型 declarations[].params[].type 保留声明中的类型
参数默认值 declarations[].params[].optional 存在默认值时为 true,默认表达式不另建 json 字段
返回类型 declarations[].returns 取自声明和 @returns:,按下述规则合并

完整录入数据必须包含每个参数的显式类型和非空说明,并通过函数声明或 @returns: 提供返回类型。 可选参数的说明仍应写清默认值含义;optional: true 只表达该参数可以省略。

返回类型按以下规则合并:

  • 只有函数声明时,使用声明中的拼写
  • 只有 @returns: 时,去除首尾空白后使用指令中的拼写
  • 两处同时存在时,使用相同的词法规则拆分类型,忽略 token 之间的空白,并按 TSL 标识符大小写无关的规则比较标识符 token;其他 token 必须一致。两处类型必须匹配, 映射后使用声明中的拼写
  • 两处都不存在时,不满足顶级 function 的 returns 必填要求

本标准只定义类型的词法一致性,不定义类型别名等语义等价关系。

枚举值表

枚举值表使用分组格式,每一项在 /// 标记后额外缩进两个空格:

/// @param: mode 处理模式,默认 0
/// @values: mode
///   0: 原样返回
///   1: 去重
///   "auto": 自动判断

规则:

  • 枚举值使用 json 标量写法:数字直接写,字符串使用双引号,布尔值使用 true/falsenil 等符号值按字符串写成 "nil"
  • 不接受数组、对象或 json null
  • 值和说明以值后的第一个分隔冒号分开;说明不得为空
  • 保留枚举项的声明顺序
  • 同一参数最多有一个非空值表,不允许重复值;不同 json 类型的值不视为重复, 例如数字 1 与字符串 "1" 是两个值
  • @values: 引用的参数必须存在
  • tsf 作者必须保证枚举值与参数类型在语义上兼容

示例组

每个示例组以非空的 @example: 示例说明 开始。其后的代码行必须在 /// 标记后 额外缩进两个空格。可选的 @output: 结束代码部分,其后的缩进行记录原始输出;下一个 @example: 开始新的示例组。第一个示例组出现后,不得再写参数、返回类型等其他函数 级指令。

映射到录入数据时,移除代码和输出的两个结构缩进,保留其余空白和换行。示例说明、 代码和输出分别映射为 examples[].descexamples[].codeexamples[].outputdesccode 必填且非空;output 可选,但出现时必须包含至少一个非空行。示例顺序保持 不变。

code 只记录示例源码,不得包含标准输出标记 // 输出:output 只记录原始输出, 不写 // 注释标记。映射到 markdown 时:

  • 所有示例共用一个 ### 示例 标题
  • 每项按顺序写为“范例01:说明”“范例02:说明”
  • 每项使用一个独立的 tsl 代码块
  • 没有 output 时,代码块只包含 code
  • 单行 output 在代码末尾写为 // 输出:<值>
  • 多行 output 先写 // 输出:,再为每个输出行添加 // 和一个空格;空输出行使用 单独的 //

完整 tsf 示例

以下内容应保存为 Normalize.tsf

function Normalize(mode: integer = 0): integer;
begin
    /// 按指定模式处理并返回模式值
    /// @tags: 示例 枚举
    /// @param: mode 处理模式,默认 0
    /// @values: mode
    ///   0: 原样返回
    ///   1: 去重
    ///   2: 排序
    /// @returns: integer
    /// @example: 使用默认模式
    ///   return Normalize();
    /// @output:
    ///   0
    /// @example: 指定模式
    ///   return Normalize(1);
    return mode;
end;

对应的顶级 function 录入对象为:

{
  "kind": "function",
  "name": "Normalize",
  "signature": "Normalize(mode)",
  "desc": "按指定模式处理并返回模式值",
  "tags": ["示例", "枚举"],
  "params": [
    {
      "name": "mode",
      "type": "integer",
      "optional": true,
      "desc": "处理模式,默认 0",
      "values": [
        {"value": 0, "desc": "原样返回"},
        {"value": 1, "desc": "去重"},
        {"value": 2, "desc": "排序"}
      ]
    }
  ],
  "returns": "integer",
  "examples": [
    {
      "desc": "使用默认模式",
      "code": "return Normalize();",
      "output": "0"
    },
    {
      "desc": "指定模式",
      "code": "return Normalize(1);"
    }
  ]
}

class

Counter.tsf

type Counter = class
/// 表示计数器
/// @tags: 示例 计数
public
    /// 创建计数器
    /// @param: initial_value 初始值
    function create(initial_value: integer);

    /// 计算两个整数之和
    /// @tags: 示例 加法
    /// @param: x 第一个整数
    /// @param: y 第二个整数
    /// @returns: integer
    class function Add(x: integer; y: integer): integer;
    begin
        return x + y;
    end;

    /// 增加当前值
    /// @param: step 增量
    /// @returns: integer
    /// @example: 增加计数
    ///   counter := new Counter(1);
    ///   return counter.Increase(2);
    /// @output:
    ///   3
    function Increase(step: integer): integer;

    /// 当前值
    /// @tags: 状态
    property Value read value_ write value_;

    /// 显示名称
    Label: string;

    /// 最小值
    const Minimum = 0;

protected
    /// 已创建的计数器数量
    static CreatedCount: integer;

    /// 最大值
    static const Maximum = 100;

private
    /// 内部值
    value_: integer;
end;

type CounterState = class
/// 表示内部状态
public
    /// 状态码
    Code: integer;
end;

function Counter.create(initial_value: integer);
begin
    value_ := initial_value;
end;

function Counter.Increase(step: integer): integer;
begin
    value_ := value_ + step;
    return value_;
end;

对应的 class 录入对象为:

{
  "kind": "class",
  "name": "Counter",
  "desc": "表示计数器",
  "tags": ["示例", "计数"],
  "members": [
    {
      "kind": "method",
      "name": "create",
      "visibility": "public",
      "binding": "instance",
      "signature": "create(initial_value)",
      "desc": "创建计数器",
      "params": [
        {
          "name": "initial_value",
          "type": "integer",
          "desc": "初始值"
        }
      ]
    },
    {
      "kind": "method",
      "name": "Add",
      "visibility": "public",
      "binding": "class",
      "signature": "Add(x, y)",
      "desc": "计算两个整数之和",
      "tags": ["示例", "加法"],
      "params": [
        {
          "name": "x",
          "type": "integer",
          "desc": "第一个整数"
        },
        {
          "name": "y",
          "type": "integer",
          "desc": "第二个整数"
        }
      ],
      "returns": "integer"
    },
    {
      "kind": "method",
      "name": "Increase",
      "visibility": "public",
      "binding": "instance",
      "signature": "Increase(step)",
      "desc": "增加当前值",
      "params": [
        {
          "name": "step",
          "type": "integer",
          "desc": "增量"
        }
      ],
      "returns": "integer",
      "examples": [
        {
          "desc": "增加计数",
          "code": "counter := new Counter(1);\nreturn counter.Increase(2);",
          "output": "3"
        }
      ]
    },
    {
      "kind": "property",
      "name": "Value",
      "visibility": "public",
      "desc": "当前值",
      "tags": ["状态"],
      "access": "readwrite"
    },
    {
      "kind": "field",
      "name": "Label",
      "visibility": "public",
      "desc": "显示名称",
      "type": "string"
    },
    {
      "kind": "constant",
      "name": "Minimum",
      "visibility": "public",
      "desc": "最小值",
      "value": "0"
    },
    {
      "kind": "field",
      "name": "CreatedCount",
      "visibility": "protected",
      "desc": "已创建的计数器数量",
      "type": "integer",
      "static": true
    },
    {
      "kind": "constant",
      "name": "Maximum",
      "visibility": "protected",
      "desc": "最大值",
      "value": "100",
      "static": true
    }
  ]
}

unit

本标准的 unit 源码文档采用包含显式 interfaceimplementation 并以 end. 结束的 完整形态;简写 unit 不在本标准范围内。unit 名称必须与文件名大小写无关地一致。

unit 文档块位于 unit Name; 之后、interface 之前,只允许描述和可选 @tags:。对外文档按声明顺序包含 interface 中的 function、var、const 和 class uses 只表示依赖,不属于 API。interface class 完整复用独立 class 的成员规则, interface 中的所有 class 均属于对外文档。每个 /// 文档块必须绑定到 unit 或 interface 成员。

implementation 中的函数、类、变量、常量和 /// 文档块不属于对外文档。interface 中的 procedure 和非 class type 不在本标准范围内。interface function 复用 function 文档指令并要求返回类型;var/const 只允许描述和可选 @tags:,且一项一条声明。

录入数据结构

一个录入文件对应一个 markdown 叶子页。录入根只允许 modulepathdeclarationsdeclarations 必须是非空有序列表,function、class、unit 可以 任意混合;数组顺序即 markdown 中的 H2 声明顺序。

顶层字段:

字段 必填 说明
module markdown 一级标题内容;不是目录名或文件名。例如 module: 示例 / 数组 对应 # 示例 / 数组
path markdown 在所属 scope 下的相对路径,使用 / 分隔且不含 .md 后缀。例如 path: base/example 对应 base/example.md
declarations 非空顶级声明列表;每项由 kind 判别并要求 name,数组顺序即 H2 顺序

function

顶级 function 对象字段:

字段 必填 说明
kind 固定为 function
name function 简单名称;必须与 signature 中的名称一致
signature 只包含名称和参数名的调用签名
desc 函数描述,可包含多行
tags 检索关键词列表;推荐填写,有助于更准确地识别和检索函数
params 有参时 参数列表;无参函数省略
returns 返回类型
examples 示例列表;按顺序映射为独立的 TSL 代码块

参数字段:

字段 必填 说明
name 参数名,与签名一致
type 参数类型
desc 参数说明
optional true 表示可选参数;markdown 参数说明以 可选。 开头
values 枚举值列表,对应参数取值说明

values 每项包含:

字段 必填 说明
value 枚举值
desc 枚举含义

examples 每项包含:

字段 必填 说明
desc 示例场景说明;对应“范例NN:说明”
code 不含代码围栏和标准输出注释的 TSL 代码
output 原始输出;按单行或多行规则映射为 // 输出注释

class

class 对象字段:

字段 必填 说明
kind 固定为 class
name class 简单名称
desc class 描述
tags 检索关键词列表
bases 按声明顺序保存的直接父类列表
members method/property/field/constant 的有序列表

所有 class member 都要求 namedescvisibility。 所有 class member 都可以包含可选的 tags。visibility 只能是 publicprotected。成员判别字段如下:

kind 关键字段
method signaturebinding: instance|class;可选 params/returns/modifiers/examples
property access: read|write|readwrite;可选 type,参数化时包含 params
field type;可选 static: true
constant value;可选 typestatic: true

kind: method 对象不使用 static 字段;class function 由 binding: class 唯一 表达。value 的存在性与真假值分开判断,因此数字 0 和布尔值 false 都是合法 常量值。 这里的 method 是录入结构内部用于统一表达实例 function 和 class function 的 kind 不对应 markdown 标题或 声明:... 行中的声明值。

unit

顶级 unit 对象包含固定的 kind: unit,以及必填的 namedescmembers 和可选 tags。direct member 按 interface 源码顺序保存,kind 只允许:

kind 关键字段
function 复用顶层 function 数据;returns 必填
variable namedesctype,可选 tags
constant namedescvalue,可选 tags/type
class 复用完整 class 数据,并以 kind: class 作为成员判别字段

录入数据不保存 unit 的 uses、implementation、initialization 或 finalization。

录入文件格式

yaml

yaml 录入文件应符合以下规则:

  • examples[].code 和多行 examples[].output 使用 | 块标量
  • 参数名 ... 必须加引号
  • nil|array 可直接作为普通字符串值

完整例子:examples/example.yaml

json

json 录入文件应符合以下规则:

  • json 不支持注释
  • 多行 examples[].codeexamples[].output 使用 \n
  • 字符串内部的双引号使用 \"
  • 结构标点必须使用半角字符

完整例子:examples/example.json

统一 API 索引

function_index.tsv 固定为 13 列:

name scope module signature page anchor tags summary kind binding visibility owner qualified_name

字段含义:

  • kindfunction|class|method|property|field|constant|unit|variable
  • binding:不适用时为空,否则为 instance|class|static|unit
  • visibilityclass member 为 public|protectedunit direct member 为 public
  • owner:不含该 API 名称的完整所属路径
  • qualified_name:点分隔的稳定文档身份

索引的 kindbinding 由声明行和所属层级按下表确定:

markdown 位置 声明:... 录入对象表达 索引 kind 索引 binding
H2 顶级声明 function kind: function function
H2 顶级声明 class kind: class class
H2 顶级声明 unit kind: unit unit
顶级/interface class 成员 function kind: method, binding: instance method instance
顶级/interface class 成员 class function kind: method, binding: class method class
顶级/interface class 成员 property kind: property property instance
顶级/interface class 成员 field kind: field field instance
顶级/interface class 成员 static field kind: field, static: true field static
顶级/interface class 成员 const kind: constant constant instance
顶级/interface class 成员 static const kind: constant, static: true constant static
unit interface direct member function kind: function function unit
unit interface direct member var kind: variable variable unit
unit interface direct member const kind: constant constant unit
unit interface direct member class kind: class class unit

表中的 interface class 成员指 unit interface class 的 H4 成员;其允许的声明值和 派生规则与顶级 class 的 H3 成员完全相同。

例如 class function Widget.Create 的 owner 是 Widgetunit interface class function DemoUnit.Document.Save 的 owner 是 DemoUnit.Document。重载共享 qualified_name,由 signature 和唯一的 page#anchor 区分。