# 运行时函数

以下函数都从 `@minidocs/astro/runtime` 导入。多语言站点和单语言站点的差别写在每个函数下面。

## 页面

### `listPages(entries)`

返回集合里所有要生成的页面。`entries` 来自 `getCollection`。每个页面有：

| 字段               | 含义                                                         |
| ---------------- | ---------------------------------------------------------- |
| `id`             | 页面 id                                                      |
| `entry`          | 集合里的条目                                                     |
| `href`           | 页面的地址                                                      |
| `params`         | 页面路由的参数。单语言站点是 `{ slug }`，多语言站点是 `{ locale, slug }`        |
| `markdownHref`   | Markdown 版本的地址                                             |
| `markdownParams` | Markdown 路由的参数。单语言站点是 `{ path }`，多语言站点是 `{ locale, path }` |

多语言站点上，每种语言的每个页面各有一项，包括通过 `fallback` 显示的页面，还多几个字段：

| 字段              | 含义                                    |
| --------------- | ------------------------------------- |
| `locale`        | 页面显示在哪种语言下                            |
| `contentLocale` | 内容实际的语言，只有 fallback 的页面和 `locale` 不同  |
| `isFallback`    | 是否显示的是另一种语言的内容                        |
| `alternates`    | `{ locale, href }[]`，页面存在的所有语言，包括当前语言 |

### `toHref(collection, id, locale?)`

返回页面的地址，带上 `base` 和 Astro 配置决定的末尾斜杠。`id` 按 `collection` 检查类型。多语言站点必须传 `locale`。

### `toLocaleParam(locale)`

返回 `[...locale]` 路由参数的值，给不来自集合的页面用。默认语言不带语言段时返回 `undefined`。

## 文档树

### `defineTree(entries, build)`

用 `build` 回调定义文档树，返回节点数组。多语言站点对每种语言执行一次 `build`，返回按语言索引的对象。

`build` 收到 `{ page, group, dir, link }`，多语言站点还有 `locale`：

| 函数                        | 产出                                    |
| ------------------------- | ------------------------------------- |
| `page(id, children?)`     | 一个页面节点。`id` 在这种语言里不存在时报错              |
| `group(label, children)`  | 一个分组节点                                |
| `dir(path, { compare? })` | 目录里的页面和子目录，不含目录自己的 `index`。目录里没有页面时报错 |
| `link(label, href)`       | 一个外部链接节点                              |

节点有 `label`、`children`，页面节点有 `page`（其中 `page.entry` 是集合里的条目），外部链接有 `href`。没有页面、链接和子节点的分组会被去掉。

### `navState(nodes, id)`

返回 `{ of(node) }`。`of(node)` 返回：

| 字段        | 含义                         |
| --------- | -------------------------- |
| `href`    | 页面或外部链接的地址，分组是 `undefined` |
| `current` | 是不是当前页面。同一个页面出现多次时，只有第一次算  |
| `open`    | 当前页面是不是这个节点本身或在它下面         |

### `neighbors(nodes, id)`

返回 `{ prev, next }`，按文档树的顺序找出上一个和下一个页面节点，没有时是 `undefined`。

### `findPath(nodes, id)`

返回从第一层到当前页面的节点数组，找不到时是空数组。

### `tocTree(headings, { depth? })`

把 `render()` 返回的 `headings` 整理成树，每个节点有 `depth`、`slug`、`text` 和 `children`。`depth` 是保留的标题层级范围，默认 `[2, 3]`。

## Markdown 和 llms.txt

### `toMarkdown(page, { renderers? })`

把页面的正文转成 Markdown，不带标题。`page` 是 `listPages` 返回的页面，或者节点的 `page`。正文里有其他框架的组件时，用 `renderers` 传入它们的渲染器。

### `isMarkdown(Astro)`

组件是否正在为 Markdown 版本渲染。

### `toLlmsTxt(nodes, { title, describe? })`

从文档树生成 llms.txt。`title` 是文件的标题，`describe(entry)` 返回页面的描述，`index` 页面的描述同时作为文件的简介。可以把几个集合的树拼在一起传入。

### `toLlmsFullTxt(nodes, { renderers? })`

把树里所有页面的 Markdown 按顺序拼成一个文件。
