diff --git a/site/docs/.vitepress/configs/locales/zh.ts b/site/docs/.vitepress/configs/locales/zh.ts index f24c5775b..edb1c0d69 100644 --- a/site/docs/.vitepress/configs/locales/zh.ts +++ b/site/docs/.vitepress/configs/locales/zh.ts @@ -234,6 +234,10 @@ const pluginThirdparty = { text: "自动引用", link: "/zh/plugins/autoquote", }, + { + text: "实体解析器 (Entity Parser)", + link: "/zh/plugins/entity-parser", + }, { text: "[提交你的 PR!]", link: "/zh/plugins/#创建你自己的插件", diff --git a/site/docs/zh/plugins/entity-parser.md b/site/docs/zh/plugins/entity-parser.md new file mode 100644 index 000000000..2e86ca583 --- /dev/null +++ b/site/docs/zh/plugins/entity-parser.md @@ -0,0 +1,237 @@ +--- +prev: false +next: false +--- + +# 实体解析器 (`entity-parser`) + +将 [Telegram 实体 (entities)](https://core.telegram.org/bots/api#messageentity) 转换为语义 HTML。 + +## 我应该在什么时候用这个插件? + +最好**永远别用**! + +虽然这个插件可以生成 HTML,但一般而言最好将文本和实体发送回 Telegram。 + +仅在极少数情况下才需要将实体转换为 HTML,即您需要在 Telegram **之外**使用带 Telegram 格式的文本,例如在网站上显示 Telegram 消息。 + +请参阅 [_最好不要使用这个包的情况_](#最好不要使用这个包的情况) 部分,确认您是不是有类似的问题要解决。 + +如果您不确定在您的情况下使用此插件是否合适,请随时在我们的 [Telegram 群组](https://t.me/grammyjs) 中提问。 +在大多数情况下,人们会发现他们实际上并不需要这个插件来解决他们的问题! + +## 安装 + +根据您的运行时或包管理器在终端中运行以下命令: + +::: code-group + +```sh:no-line-numbers [Deno] +deno add jsr:@qz/telegram-entities-parser +``` + +```sh:no-line-numbers [Bun] +bunx jsr add @qz/telegram-entities-parser +``` + +```sh:no-line-numbers [pnpm] +pnpm dlx jsr add @qz/telegram-entities-parser +``` + +```sh:no-line-numbers [Yarn] +yarn dlx jsr add @qz/telegram-entities-parser +``` + +```sh:no-line-numbers [npm] +npx jsr add @qz/telegram-entities-parser +``` + +::: + +## 基本用法 + +使用此插件非常简单。 +这是一个简单的示例: + +```ts +import { EntitiesParser } from "@qz/telegram-entities-parser"; +import type { Message } from "@qz/telegram-entities-parser/types"; + +// 为了获得更好的性能,请在函数外部创建实例。 +const entitiesParser = new EntitiesParser(); +const parse = (message: Message) => entitiesParser.parse({ message }); + +bot.on(":text", (ctx) => { + const html = parse(ctx.msg); // 将文本转换为 HTML 字符串 +}); + +bot.on(":photo", (ctx) => { + const html = parse(ctx.msg); // 将标题转换为 HTML 字符串 +}); +``` + +## 高级用法 + +### 自定义输出的 HTML 标签 + +这个包将实体转换为语义 HTML,尽可能地遵循最佳实践和标准。 +但是,提供的输出可能并不总是您所期望的。 + +为了解决这个问题,您可以使用自己的 `renderer` 根据规则自定义环绕文本的 HTML 元素。 +您可以通过扩展默认的 [`RendererHtml`](https://github.com/quadratz/telegram-entities-parser/blob/main/src/renderers/renderer_html.ts) 来修改特定规则,或者通过实现 [`Renderer`](https://github.com/quadratz/telegram-entities-parser/blob/main/src/renderers/renderer.ts) 来覆盖所有规则。 + +要扩展现有的 `renderer`,请执行以下操作: + +```ts +import { EntitiesParser, RendererHtml } from "@qz/telegram-entities-parser"; +import type { + CommonEntity, + RendererOutput, +} from "@qz/telegram-entities-parser/types"; + +// 更改粗体类型实体的规则, +// 但保留 `RendererHtml` 定义的其余类型。 +class MyRenderer extends RendererHtml { + override bold( + options: { text: string; entity: CommonEntity }, + ): RendererOutput { + return { + prefix: '', + suffix: "", + }; + } +} + +const entitiesParser = new EntitiesParser({ renderer: new MyRenderer() }); +``` + +`options` 参数接受带有 `text` 和 `entity` 参数的对象。 + +- `text`:当前实体引用的特定文本。 +- `entity`:根据实体类型以不同接口表示,例如 `CommonEntity`、`CustomEmojiEntity`、`PreEntity`、`TextLinkEntity` 或 `TextMentionEntity`。 + 例如,`bold` 实体符合 `CommonEntity` 接口,而 `text_link` 实体则符合 `TextLinkEntity` 接口,因为它包含其他属性,例如 `url`。 + +以下是接口的完整列表以及每种实体类型的输出: + +| 实体类型 | 接口 | 结果 | +| ----------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `blockquote` | `CommonEntity` | `
...` | +| `bold` | `CommonEntity` | ` ... ` | +| `bot_command` | `CommonEntity` | ` ... ` | +| `cashtag` | `CommonEntity` | ` ... ` | +| `code` | `CommonEntity` | `
...
` |
+| `custom_emoji` | `CustomEmojiEntity` | ` ... ` |
+| `email` | `CommonEntity` | ` ... ` |
+| `expandable_blockquote` | `CommonEntity` | `...` | +| `hashtag` | `CommonEntity` | ` ... ` | +| `italic` | `CommonEntity` | ` ... ` | +| `mention` | `CommonEntity` | ` ... ` | +| `phone_number` | `CommonEntity` | ` ... ` | +| `pre` | `PreEntity` | `
...
` or `...` | +| `spoiler` | `CommonEntity` | ` ... ` | +| `strikethrough` | `CommonEntity` | `