内容引用语法 [@ ] 使用指南
在正文里写 [@<内容ID>],渲染时就会自动嵌入剪贴板文字、投票组件、图床图片或收藏夹卡片。
系统根据 ID 长度自动识别内容类型。
音频那一条是例外:它不按长度,而是写成 [@音频/<ID>] 这样一个带名字的形式
(ID 长度早被占满了,见「二、一览表」)。
能用的地方有四处:博客文章正文、云剪贴板正文、评论区、讨论区。四处支持的 引用类型不完全一样 —— 先照「一、三步上手」把最常用的走一遍,再用「二、一览表」查语法、 「三、四处地方,支持的不一样」看差异。
前置条件
- 需要已登录且通过邀请码认证(Core 用户及以上角色)
- 四种内容各有各的加载条件:剪贴板与图片需为公开状态,或你本人是作者;投票没有公开 / 私密之分,Core 及以上都能看到任意未删除的投票;收藏夹只能引用公开的(私密收藏夹没有对外 ID,见「三、四处地方,支持的不一样」)
- 单篇博客的显示上限是三档各自独立的:主循环最多替换 50 处(剪贴板 / 投票 / 图床图片共用这一个额度),收藏夹最多 3 张卡片,音频最多 3 个播放器 —— 收藏夹与音频不占主循环那 50 处
- 取数另有一道闸:需要取数的引用(剪贴板 / 投票 / 收藏夹)一轮最多取 50 个,图床图片与音频只拼地址、不占这个名额,同一个 id 引多次也只算一个。没排进这前 50 个候选的引用,连请求都不发、原样保留;已经排进候选、只是展开时排不上号的那些则可能已经取过数了
- 展开后还有长度闸:整篇正文(含替换进来的内容)封顶 50 万字符,装不下的那一条原样保留、不会被从中间截断
- 剪贴板引用不会再展开:一段剪贴板正文里若又写了
[@8位],那一层原样显示。音频与收藏夹是合并后各跑一趟,不在这条之列 —— 从剪贴板带进来的音频引用仍会变成播放器
一、三步上手
三个最常用的动作,照抄即可。每一步背后的完整规则都在后面的分类型章节里。
1. 在博客里插一张图床图片
打开
/image/,在图片卡片上复制它的 10 位 ID;在正文里就地写下这一行:
[@AbCdEf1234]发布后打开文章详情页 —— 那一行会变成图片,点一下原地放大(不新开窗口)。
图片必须是公开的(或你自己就是上传者),否则别人看到的是一张裂图。 完整规则见「六、图床图片嵌入」。
2. 在博客里嵌入一段剪贴板
- 打开
/clipboard/,复制那段的 8 位 ID(列表里、或详情页 URL/clipboard/<ID>里都有); - 正文里写
[@a1b2c3d4]; - 发布后,那段剪贴板的正文会被原样替换进来,其中的 Markdown 照常渲染 (标题、列表、代码块都生效)。
3. 在评论 / 讨论里发一张图
最省事的路是不用记 ID:点输入区的「从图床选择」,弹出你自己的图片列表,挑一张即可。
手打 [@AbCdEf1234] 一样有效。
⚠️ 评论与讨论里能展开的东西比博客少(投票、收藏夹都不展开,剪贴板只展开第一条), 差别逐条列在「三、四处地方,支持的不一样」。
二、一览表
标题刻意不写「几种」:这张表加过行(表情、名片),而标题不会跟着动 —— 曾经就写着「三种」却列了五种。
| 语法 | ID 长度 | 内容类型 | 渲染效果 |
|---|---|---|---|
[@123456] |
6 位 | 收藏夹 | 渲染成一张卡片(标题 + 条目数 + 前 10 篇链接),仅博客 / 剪贴板 |
[@a1b2c3d4] |
8 位 | 云剪贴板 | 将 ID 对应剪贴板的正文直接替换到正文里 |
[@vOtE12345] |
9 位 | 投票 | 渲染为可交互的投票小部件(仅博客 / 剪贴板) |
[@AbCdEf1234] |
10 位 | 图床图片 | 渲染成图片 /api/images/ID/raw,可点开放大 |
[@音频/AbCdEf1234] |
—— | 音频 | 渲染成播放器 /api/audio/ID/raw(四条管线都支持,最多 3 个,见音频床使用指南) |
[@合集/表情] |
—— | 表情包 | 行内表情图(仅评论 / 讨论,见表情包使用指南) |
[@用户/张三] |
—— | 用户名片 | 行内名片(头像 + 头像框 + 用户名,点进主页)(仅评论 / 讨论,见第七节) |
ID 长度不在 6 或 8-10 之间的 [@...] 不会被处理,以原文形式保留。其中 6 位必须全是数字 ——
[@abcdef] 这种 6 位字母不会被当成收藏夹,一样原样保留。8-10 位只认字母和数字,区分大小写。
收藏夹只能引用公开的。 私密收藏夹根本没有对外 ID(不是「有 ID 但不显示」), 所以它既没有可写的
[@ID],也生成不出二维码、读不到机器人接口。详见 收藏夹使用指南。
表情包那一行是另一套语法:它不是 ID 而是「合集名 / 表情名」两个名字,允许中文, 用斜杠分隔。两种语法不会互相误伤 —— ID 只认字母数字,而表情 token 必含斜杠。
想展示这个语法本身(而不是让它生效)?把它写进代码块或行内代码(
`[@a1b2c3d4]`)—— 代码里的引用一律不展开,四处都一样。 反过来也成立:ID 打错、或引用的内容不存在时,看到的也是原文那串字符,不会报错、也不会 弹出提示 —— 所以文章里出现一句光秃秃的[@a1b2c3d4],先核对那串 ID。
三、四处地方,支持的不一样
| 6 位收藏夹 | 8 位剪贴板 | 9 位投票 | 10 位图床图片 | [@音频/<ID>] |
表情包 | 用户名片 | |
|---|---|---|---|---|---|---|---|
| 博客正文 | ✅ 最多 3 张 | ✅ | ✅ | ✅ | ✅ 最多 3 个 | ❌ | ❌ |
| 云剪贴板正文 | ✅ 最多 3 张 | ✅ | ✅ | ✅ | ✅ 最多 3 个 | ❌ | ❌ |
| 评论区 | ❌ 不展开 | ✅ 最多 1 条 | ❌ 不展开 | ✅ 最多 50 张 | ✅ 最多 3 个 | ✅ 最多 30 个 | ✅ 最多 5 张 |
| 讨论区 | ❌ 不展开 | ✅ 最多 1 条 | ❌ 不展开 | ✅ 最多 50 张 | ✅ 最多 3 个 | ✅ 最多 30 个 | ✅ 最多 5 张 |
上面那张表说的是你自己写的时候能写什么。读者是谁还另有一层 —— 文章设为 「凭链接可读」或「对外公开」之后,没登录的人读到的正文里:图床图片、音频播放器、 以及公开的剪贴板照常展开;投票与收藏夹保留字面量(它们的数据接口要求核心用户, 对外视图不请求,也就渲染不出来)。私密剪贴板对访客一律不展开 —— 即使你把它引用进了一篇公开文章。这一条的判据是「这条引用的读口,匿名取不取得到」。
评论与讨论里刻意不支持投票:投票是个可点选的交互组件,塞进讨论气泡和楼中楼里既挤又容易误触,要看投票请把链接贴出来。
评论与讨论里也不展开收藏夹,但理由不同:收藏夹卡片是一份列表(标题 + 若干文章链接),
塞进讨论气泡里会占掉半屏,而且讨论区没有「一篇正文慢慢读」的语境。所以在评论区与讨论区里
[@123456] 原样显示为字面量 —— 与投票同样是刻意的,不是漏了。
收藏夹在博客里也另有更紧的上限:最多 3 张卡片。 卡片是块级元素,比一段文字高得多,
插十几张会把文章冲成一片卡片墙;扫描出的第 4 张起原样保留 [@123456] 字面量。
收藏夹属于「需要取数」的一类,因此也占用上面那 50 个取数名额、并计入 50 万字符的展开总长度。
表情包([@合集/表情])反过来 —— 只在评论与讨论里能用,博客正文与剪贴板正文里
原样显示。它走的是另一套语法的形状(不是 ID 而是名字),详见
表情包使用指南。
用户名片([@用户/<用户名>])与表情同向 —— 也只在评论与讨论里能用,而且同样
不是 ID 而是名字。它渲染成一枚行内名片(带头像框的小头像 + 用户名),点进那个人的主页,
见本文第七节。
另外两处细节差异:
- 剪贴板引用在博客里可以写很多条;在评论 / 讨论里一条消息只展开第一条,多写的那些原样留在正文里(
[@abc12345]就那么显示着)。这是刻意的上限,避免一条 10 个字的短消息展开成几十万字。 - 剪贴板正文超过 2000 字时,在评论 / 讨论里会被截断,后面接一句「内容过长,已截断」和回原剪贴板的链接。博客正文里不截断。
- 整篇展开后有总长度预算:博客 / 剪贴板正文里所有引用展开后,正文合计封顶 50 万字符。装不下的那一条原样保留(
[@…]留在那里),但单条引用不会从中间被截断 —— 单条完整、整篇有预算。 - 剪贴板引用不会再展开:从剪贴板带进来的正文里若又写了
[@8位],那一层原样显示,不会继续挖下去(免得两条互相引用的剪贴板来回放大)。音频与收藏夹是合并后各跑一趟,不在这条之列。
站外读者看到的引用(文章对外公开时)
文章可以设为「对外可见」(见 docs/architecture.md §6.11),站外读者没有账号。
那种情况下正文里的内容引用按「这条引用的读口,匿名取不取得到」分两类:
- 照常展开的:图床图片、音频播放器,以及公开的剪贴板正文。公开剪贴板 那部分由服务端在渲染前解析好、随页面数据下发;
- 原样保留字面量的:私密剪贴板、投票、收藏夹。私密剪贴板匿名读不到;投票与
收藏夹的数据接口要求核心用户,站外视图根本不请求,于是渲染不出来。你会看到
[@a1b2c3d4]这几个字符原封不动地留在那里,而不是一张卡片、也不是一句失败文案。
这是刻意的:站外视图不去调那三条要求核心用户的会话数据接口(剪贴板正文走服务端
下发,不请求 /api/clipboard/*)。但图床与音频的字节仍由浏览器按 URL 自己取 ——
这条说的是「站内的引用数据接口一个都不打」,不是「页面上一个请求都没有」。
服务端下发的那份公开剪贴板最多 50 条、合计 50 万字符,超出的原样保留 —— 这一步在服务端做完,不会把超量的内容随页面数据发给浏览器。
所以:如果你打算把一篇文章对外公开,并且希望站外读者也能看懂, 别把关键信息放在投票 / 收藏夹 / 私密剪贴板的引用里 —— 用普通的文字或图片写出来。
四、剪贴板嵌入(8 位 ID)
获取 ID
访问 /clipboard/,在列表中查看每个剪贴板的 8 位 ID,或从剪贴板详情页 URL /clipboard/<ID> 中获取。
使用方式
在正文中直接写入:
[@a1b2c3d4]
渲染行为
系统向后端请求剪贴板正文内容,将其原样替换 [@a1b2c3d4] 标记。剪贴板中的 Markdown 格式会正常参与后续渲染(标题、列表、代码块等均生效)。
错误处理
如果剪贴板不存在、非公开或无权限访问,该位置会显示:[剪贴板 a1b2c3d4 加载失败]
在站内这不算异常:剪贴板接口要求登录且 Core 以上,权限不够的人看到的就是那句 失败文案。你自己预览时若也看到它,先确认登录状态。
五、投票嵌入(9 位 ID)
⚠️ 只在博客正文与云剪贴板正文里生效。 评论区和讨论区不展开投票,
[@vOtE12345]会原样显示。
获取 ID
访问 /vote/ 查看你自己创建的投票列表(最新在前),或从投票详情页 URL /vote/<ID> 中获取。
列表只含你自己创建的投票。要打开别人的投票,用 /vote/ 顶部那栏「搜索跳转」:输入 ID 后点「前往」。
使用方式
[@vOtE12345]
渲染行为
系统请求投票数据并在文章内渲染一个投票小组件,形态随你的投票状态而变:
- 你还没投过、且投票未锁定:显示标题 + 可点击的选项 + 「投票」按钮,在文章里直接投票,无需离开本页。
- 你已投过票、或投票已被发起者锁定:显示结果视图 —— 每个选项的票数、百分比与进度条,顶部显示"共 X 票",你投过的那项带 ✓ 高亮。
- 无论哪种状态,组件底部都有「查看详情」,新窗口打开投票详情页
/vote/<ID>。
投票后组件会重新拉取服务端的票数并就地刷新。
错误处理
如果投票数据加载失败,该位置会显示:[查看投票](可点击跳转到投票页)
六、图床图片嵌入(10 位 ID)
获取 ID
访问 /image/ 查看你上传的图片列表,或在图片详情中获取 10 位 ID。
使用方式
[@AbCdEf1234]
渲染行为
系统把它换成图片地址 /api/images/AbCdEf1234/raw,四处都是这个地址。图片渲染后支持点击原地放大(不新开窗口)。
说明
图片嵌入不需要额外请求 API —— 系统直接拼接图片 URL,浏览器加载时自然请求 /api/images/<ID>/raw。如果 ID 对应图片不存在或已被删除,会显示为损坏图片。
⚠️ 图片必须是公开的(或者看图的人就是上传者本人)。私有图片只有作者与站长能取到,别人看到的是一张裂图 —— 这一点在四处都一样。
评论 / 讨论里发图还有一条更省事的路:点输入区的「从图床选择」,直接弹出你自己的图片列表挑一张,不用去翻 ID、也不用重新上传。
评论与讨论里手写
<img>标签是显示不出图片的(会被当成普通文字)。能出来的图片只有[@10位ID]这一种形态 —— 这是防止有人贴外链图做跟踪像素。博客正文里手写<img>则允许。
七、用户名片嵌入([@用户/<用户名>])
⚠️ 只在评论区与讨论区生效。 博客正文与剪贴板正文里
[@用户/张三]原样显示字面量。
在正文里写一个人的用户名,渲染出来是一枚行内名片:带头像(含头像框)的小头像
- 用户名,点一下进他的主页。
[@用户/张三]
这一条与其他引用都不一样:它认的是名字,不是 ID —— 你不用去翻谁的主页地址栏。 用户名在本站不可修改(注册之后没有任何改名的入口),所以今天写的名片明天还指得准。
怎么插入
评论区与讨论区的输入区工具栏上有一颗名片按钮:点开 → 搜用户名 → 选一个人, token 就落在光标处。不会替你发送(草稿还在,接着写完再发),也不会多带空格。
手打一样有效 —— 上面那行直接敲进去就行。
规则
- 一条消息最多 5 张名片,多出来的原样显示为
[@用户/…]。 - 名字打错 / 查无此人 → 原样显示字面量(不报错、不留半张卡)。所以看到原文 token 就是「这个人没找到」,不是页面坏了。
- 只认核心用户:输入区那个选择器搜得到的人是 core 及以上;非核心账号仍可以 手打 token 发名片,只是选择器搜不到。
- 不算 @ 提及:对方不会收到通知,铃铛与讨论红点都不动。想叫他就照常写
@张三。 - 写在代码块 / 行内代码里的不展开(与其余引用一致)—— 想展示这个语法本身就这么写。
- 名片里的头像是站内那条恒定可推导的地址,所以「没上传过头像」的人也会有一张 (系统生成的图案),不会是裂图。
与表情的「用户」合集
[@用户/张三] 与表情 [@合集/表情] 形状完全一样,所以 用户 这个名字归名片 ——
站长的表情合集不能叫「用户」(那个目录会被扫盘跳过)。见
docs/guide/表情包使用指南.md。
八、注意事项
- 非用户提及:
[@ ]语法不是 @用户 功能,不能用来提及或通知其他用户。 - 数量限制:显示上限分三档 —— 主循环最多替换 50 处(剪贴板 / 投票 / 图床图片共用)、收藏夹最多 3 张、音频最多 3 个;取数上限是需要取数的剪贴板 / 投票 / 收藏夹一轮最多 50 个(图床图片与音频只拼地址、不占这个额度);长度上限是整篇展开后的正文总长度封顶 50 万字符。超出的引用一律保留原文;其中没排进取数候选的连请求都不发。评论 / 讨论里剪贴板最多 1 条、图片最多 50 张。
- 权限检查:私有剪贴板只有作者本人可以在文章中引用;其他人引用会加载失败。图片同理 —— 私有图对别人是裂图。
- ID 大小写:ID 区分大小写(包含大小写字母和数字),请完整复制。
- 编辑器里就能预览:写博客 / 剪贴板时右栏(窄屏是「预览」那一档)看到的就是展开后的样子 —— 它与发布后的详情页用的是同一台渲染器,不是另做的一份近似效果。两条例外:
[@表情]与[@用户/…]只在讨论区和评论区生效,正文里它们始终是普通文字(博客不支持这两类)。 预览是只读的:投票摆在那里但点不动,预览期间不会提交任何东西。写正文时也不需要手打 token —— 工具栏的「插入引用」面板可以挑一条直接插进来(图床 / 音频 / 剪贴板 / 投票 / 收藏夹),插进去的语法与手写完全一致。 - 剪贴板内容为纯文本替换:嵌入的剪贴板 Markdown 会成为文章 Markdown 的一部分,注意避免引入破坏性的格式(如未闭合的代码块)。
- 代码块里不展开:四处都一样 —— 想展示语法本身,就写进代码块或行内代码。
- 剪贴板引用不递归:从剪贴板带进来的正文里若又写了
[@8位],那一层不会再展开、原样显示 —— 免得两条互相引用的剪贴板来回放大。剪贴板引用自己、或两条剪贴板互相引用,都只展开一层。音频与收藏夹是合并后各跑一趟,不在这条之列。
本文只讲怎么用。为什么有四条管线、评论里的图片为什么走旁路这类实现细节属于开发文档, 见
docs/architecture.md§6.7。