37 KiB
TSL API 文档标准
本文件是 TSL codegen API 文档的唯一标准,包含 markdown 存储格式、tsf 源码 文档格式、yaml/json 录入格式和统一索引格式。
适用范围:references/codegen/**/*.md 中的 function、class 和 unit API。
目录
基本原则
- 发布的 API 文档使用本标准定义的 markdown 存储格式
- tsf 源码文档、yaml/json 录入数据与 markdown 的字段映射以本标准为准
- 一个录入文件对应一个 markdown 叶子页;录入根固定为
module、path、declarations 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 声明可以进入同一叶子页,也可以在
内容过长或主题不同时拆到同一目录下的多个叶子页。例如
OpenXmlAttribute 和 OpenXmlElement 可以作为两个 H2 同处
officexml/openxml/elements.md。一个 markdown 叶子页可以收录多个对外顶级声明。
顶级声明和成员都按文档顺序存储,不按名称、种类或可见性重新排序。每个顶级声明 按以下共同顺序开始:
- H2 标题:function 写调用签名,class 和 unit 写简单名称
- 唯一且精确的
声明:function、声明:class或声明:unit - 描述,必填;声明行之后的首个非空正文必须是描述
<!-- tags: 关键词1 关键词2 -->,可选;位于完整描述之后
标题层级和声明值必须符合下表,不允许在其他层级使用这些声明值:
| 位置 | 标题层级 | 允许的声明值 |
|---|---|---|
| 顶级声明 | H2 | function、class、unit |
| 顶级 class 成员 | H3 | function、class function、property、field、static field、const、static const |
| unit interface direct member | H3 | function、var、const、class |
| unit interface class 成员 | H4 | 与顶级 class 成员相同 |
H2、H3、H4 中反引号包围的内容是 API 名称或调用签名。function、
class function、property 等声明术语只写在声明行中,不写进标题。
本标准中的“调用签名”只包含名称和参数名,例如 abs(x),不是 TSL 声明语句
function abs(x);。声明行只参与文档结构识别,不属于名称、调用签名或调用语法。
例如 class 下的 H3 标题 Save() 紧跟 声明:function,表示实例 function;可调用
内容仍是 Save(),不能把两行拼成 function Save()。
每个 API 必须且只能写一行 声明:...,并将它作为标题后的第一条非空正文。
声明 后使用全角冒号,声明值使用本标准规定的小写形式。普通内容标题不包含
反引号,也不紧跟声明行,因此不进入 API 索引;普通 H2 同时结束前一个顶级声明的
正文范围。
同一所属范围和声明种类内,重复 class/unit 名称或重复 function 调用签名不允许; function 重载和跨声明种类同名允许。
function
页面结构
顶级 function 使用 H2,function 的示例标题使用 H3。每个 function 声明按以下 顺序书写:
## \调用签名``声明:function- 函数描述,必填
<!-- tags: 关键词1 关键词2 -->,可选- 参数表,有参数时必填
- 参数取值说明,可选
返回:类型### 示例,可选;包含一个或多个“范例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 使用 H2,class 成员使用 H3,function 的参数取值或示例使用 H4。H2 正文 按以下顺序书写:
## \ClassName``声明:class- class 描述,必填
- tags,可选;位于完整描述之后
父类:BaseClass,可选;多父类按声明顺序列出- 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 使用 H2,interface direct member 使用 H3,interface class 的成员或 unit function 的参数取值/示例使用 H4,interface class function 的参数取值/示例 使用 H5。H2 正文按以下顺序书写:
## \UnitName``声明:unit- unit 描述,必填
- tags,可选;位于完整描述之后
- interface direct member,按声明顺序书写
成员标题与正文
H3 direct member 标题只写名称或调用签名。标题后的声明行只允许:
- interface function:
声明:function - variable:
声明:var - constant:
声明:const - interface class:
声明:class
每个 direct member 都按“标题、声明行、描述、tags、成员数据”的共同顺序开始。
unit direct member 都来自 interface,visibility 固定为 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 主要使用 function、unit 和 type 三种顶层组织方式。本标准按这三种方式
分别定义源码文档格式。每个 tsf 源码文档对应一个对外顶级声明。
function
独立顶层 function 可以在源码中记录函数级文档。签名、参数类型、默认参数和返回
类型由源码声明提供,描述、标签、参数说明、枚举值和示例由文档块提供。
- 一个 function tsf 文件只以第一个顶层 function 作为对外主函数;后续辅助函数不属于 该文件的对外文档
- 顶层
procedure不在本节规定的 function 文档格式范围内 module和path是页面级录入字段,不属于单个函数的文档块
文档块位置
文档块必须是主函数 begin 之后的第一段非空内容,并且位于任何可执行语句、
编译指令或其他注释之前
文档块由连续的 /// 行组成,并允许按照函数体缩进。/// 之前的空白以及其后的
一个可选空格不属于文档内容。遇到第一行非 /// 内容时,文档块结束;函数体后续
位置的注释是普通注释
TSL 解释器将 /// 作为普通的 // 行注释;本标准使用第三个 / 区分文档行与普通
注释
文档块结构
文档块按以下顺序书写:
- 函数描述,一行或多行,必填
@tags: 标签1 标签2,可选,最多一行,标签使用空白分隔- 参数组,按声明顺序书写;每组先写
@param: name 参数说明,再按需紧跟一个@values: name @returns: 类型,可选,最多一行- 示例组,可选,可以重复;所有示例组必须位于文档块末尾
空的 /// 行可以在多行函数描述或示例中保留空行。指令名固定为小写;未知指令、
重复的 @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/false;nil等符号值按字符串写成"nil" - 不接受数组、对象或 json
null - 值和说明以值后的第一个分隔冒号分开;说明不得为空
- 保留枚举项的声明顺序
- 同一参数最多有一个非空值表,不允许重复值;不同 json 类型的值不视为重复,
例如数字
1与字符串"1"是两个值 @values:引用的参数必须存在- tsf 作者必须保证枚举值与参数类型在语义上兼容
示例组
每个示例组以非空的 @example: 示例说明 开始。其后的代码行必须在 /// 标记后
额外缩进两个空格。可选的 @output: 结束代码部分,其后的缩进行记录原始输出;下一个
@example: 开始新的示例组。第一个示例组出现后,不得再写参数、返回类型等其他函数
级指令。
映射到录入数据时,移除代码和输出的两个结构缩进,保留其余空白和换行。示例说明、
代码和输出分别映射为 examples[].desc、examples[].code 和 examples[].output。desc 与
code 必填且非空;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 源码文档采用包含显式 interface、implementation 并以 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 叶子页。录入根只允许 module、path、
declarations。declarations 必须是非空有序列表,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 都要求 name、desc 和 visibility。
所有 class member 都可以包含可选的 tags。visibility 只能是 public 或
protected。成员判别字段如下:
| kind | 关键字段 |
|---|---|
method |
signature、binding: instance|class;可选 params/returns/modifiers/examples |
property |
access: read|write|readwrite;可选 type,参数化时包含 params |
field |
type;可选 static: true |
constant |
value;可选 type、static: true |
kind: method 对象不使用 static 字段;class function 由 binding: class 唯一
表达。value 的存在性与真假值分开判断,因此数字 0 和布尔值 false 都是合法
常量值。
这里的 method 是录入结构内部用于统一表达实例 function 和 class function 的 kind,
不对应 markdown 标题或 声明:... 行中的声明值。
unit
顶级 unit 对象包含固定的 kind: unit,以及必填的 name、desc、members
和可选 tags。direct member 按 interface 源码顺序保存,kind 只允许:
| kind | 关键字段 |
|---|---|
function |
复用顶层 function 数据;returns 必填 |
variable |
name、desc、type,可选 tags |
constant |
name、desc、value,可选 tags/type |
class |
复用完整 class 数据,并以 kind: class 作为成员判别字段 |
录入数据不保存 unit 的 uses、implementation、initialization 或 finalization。
录入文件格式
yaml
yaml 录入文件应符合以下规则:
examples[].code和多行examples[].output使用|块标量- 参数名
...必须加引号 nil|array可直接作为普通字符串值
json
json 录入文件应符合以下规则:
- json 不支持注释
- 多行
examples[].code和examples[].output使用\n - 字符串内部的双引号使用
\" - 结构标点必须使用半角字符
统一 API 索引
function_index.tsv 固定为 13 列:
name scope module signature page anchor tags summary kind binding visibility owner qualified_name
字段含义:
kind:function|class|method|property|field|constant|unit|variablebinding:不适用时为空,否则为instance|class|static|unitvisibility:class member 为public|protected,unit direct member 为publicowner:不含该 API 名称的完整所属路径qualified_name:点分隔的稳定文档身份
索引的 kind 和 binding 由声明行和所属层级按下表确定:
| 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 是 Widget;unit interface class
function DemoUnit.Document.Save 的 owner 是 DemoUnit.Document。重载共享
qualified_name,由 signature 和唯一的 page#anchor 区分。