文档索引

表情包使用指南

在评论区和讨论区发送表情图片。

表情分两种,都在同一个面板里:

  • 黄脸 —— 系统自带的,永远都有,像文字一样大(整条消息只有它一颗时例外, 那时会和图片表情一样大),点了会插进你的输入框;
  • 图片表情 —— 站长放在服务器上的图片文件。有什么表情、分几个合集, 完全取决于站长往素材目录里放了什么。

一、怎么发

两条路,效果一样。

1. 点表情按钮(推荐)

输入区工具条最右边那个笑脸按钮,点开是一个面板:

  • 面板最上面是合集标签,最左边那一栏永远是「黄脸表情」,后面才是站长的合集;
  • 面板下面是网格,点其中一个就选中了它;
  • 面板记得你上次退出的那一栏 —— 关掉再点开、乃至刷新页面,都直接停在那一栏, 不必每次重新找。合集的排列变了(站长加了合集)或那一栏被删掉时,退回第一栏。

选中之后发生什么,取决于你点的是哪一栏:

你点的是 点一下之后 为什么
黄脸表情 插到输入框光标处,不发送 它就是个表情字符,要跟着文字排
图片表情(讨论区) 立刻发送出去 讨论是即时流,跟微信一个手感
图片表情(评论区) 插到输入框光标处,不发送 评论是一篇正在写的文章,不能被一个表情吞掉

点图片表情时,讨论里那一下不会动你的草稿:写了一半的正文、待发的图片、引用、 回复对象全都原样留着,表情是单独一条消息发出去的。

选完图片表情后讨论区的面板会关掉(发完就走);黄脸那一栏不关 —— 通常要连着 挑好几个,关掉等于每插一个都要重开一次。

2. 手写语法

在正文里直接写 [@合集名/表情名]:

[@猫猫/开心]

合集名 和 表情名 就是服务器上素材目录与文件名(去掉扩展名)。

可以写在句子里,会跟着文字排,不会把整行断开:

今天天气真好 [@猫猫/开心] 出门走走

想展示这个语法本身而不是让它生效?把它写进代码块或行内代码 ([@猫猫/开心])—— 代码里的引用一律不展开, 与其它 [@ ] 引用同一口径。


二、黄脸表情

最左边那一栏「黄脸表情」是系统自带的,所有设备上长得一模一样。

为什么要专门做这一栏:系统键盘里那些 emoji(😊😭😡)在 iPhone、安卓、Windows 上 画得各不相同 —— 同一句话换台设备看就不是一个样子了。这一栏用的是同一套图片, 所以你在哪台机器上看到的都是它。

三点与图片表情不同:

  • 和文字一样大。它就是个表情字符的替代品,能塞进句子里跟着文字排:

    今天天气真好 [@黄脸/微笑] 出门走走
    

    例外是整条消息只有它一颗的时候(前后没有别的文字,也没有别的表情):那时它会放大到 和图片表情一样大 —— 单发一颗就是「发了个表情」,不是句子里的一个字。

  • 点一下是插进输入框,不直接发(讨论区也一样)。所以可以连着挑好几个。

  • 不用站长准备,永远都在。素材目录是空的站点照样有这一栏。

手打语法与图片表情完全相同,把合集名写成「黄脸」即可:

[@黄脸/微笑]        ✅ 内置的那张
[@黄脸/并不存在]    ❌ 没有这个表情,原样显示

想知道某一格叫什么,把鼠标停在面板里的那一格上 —— 显示出来的就是它的完整 token。


三、在哪些地方能用

表情包
评论区 ✅
讨论区 ✅
博客正文 ❌ 原样显示 [@猫猫/开心]
云剪贴板正文 ❌ 原样显示

博客正文走的是另一套渲染管线(它还要处理投票组件与代码高亮),刻意不支持表情。 想在博客里放表情,把图传到图床再用 [@<10位图床ID>] 引用,或者贴图片直链。


四、分隔符为什么是斜杠

语法用 / 分隔合集名与表情名,而不是常见的连字符 -:

[@猫猫/开心]        ✅ 合集「猫猫」,表情「开心」
[@猫猫-开心]        ❌ 不是表情语法,原样显示

因为文件名里可以有连字符。如果按 - 切分,[@猫猫-开心-难过] 就没法判断 到底该切成「猫猫 + 开心-难过」还是「猫猫-开心 + 难过」。而斜杠是文件系统的保留字符, 文件名里不可能有 —— 所以按斜杠切永远只有一种切法。

顺带一个好处:这个语法永远含有 /,所以它绝不会被误认成剪贴板(8 位)或图床 (10 位)引用 —— 那两种 ID 只认字母和数字。


五、写错了会怎样

写错合集名或表情名(或者站长删掉了那个文件)时,那个位置会显示你的原文:

[@猫猫/并不存在]

不是破图标,也不是空白 —— 你看得见自己写的是什么,一眼就知道错在哪。 这与图床引用坏掉时显示裂图不同,是有意的:表情是一串你要手打的名字, 比一串要复制的 ID 更容易敲错。

这个降级是粘性的:一旦某条消息里的表情显示成了原文,在这一页刷新之前 它不会自己变回图片。站长补上了文件也要刷新才看得到。


六、限制

  • 一条消息里最多展开 30 个表情,超出的部分保留原文。
  • 表情不会产生通知,也不会被算作 @ 提及。
  • 表情消息与普通消息一样走发言限频(讨论 120 条/分钟)—— 点表情发送、拍一拍、带图消息各算一条,连着点比打字消耗得快。

七、给站长:怎么加表情素材

「黄脸表情」那一栏是内置的,不从这个目录读 —— 你不用管它,也没法用这个目录 把它换掉。想改它的表情清单要改代码(src/lib/emoji-faces.json)。 有一点要注意:内置的名字优先。你如果也建了个叫「黄脸」的目录,只有内置清单里 没有的那些名字才会用到你的图 —— 撞名不会报错,只是不生效;面板里也不会为它多出 一栏(那一栏上永远只写内置的那份)。

⚠️ 用户 与 音频 是保留合集名,建了也不生效(目录会被直接跳过,面板里不出现)。 这两个名字已经被另外两条语法占住了,它们的形状与本语法完全一样(都是 [@A/B]),所以不可能共存:

  • 用户 —— 用户名片 [@用户/张三],见 docs/guide/内容引用语法指南.md 第五节;
  • 音频 —— 音频引用 [@音频/<ID>],见 docs/guide/音频床使用指南.md。

别用这两个名字建目录。

素材放在服务器的 instance/stickers/ 下(可用环境变量 STICKERS_DIR 改到别处)。 这个目录不进 git 仓库,是运行时数据 —— 所以部署时要手动把图同步上去。

目录结构

instance/stickers/
├── 猫猫/                    ← 合集名(会写进 token)
│   ├── info.json            ← 可选:显示名 / 排序 / 隐藏
│   ├── 开心.gif
│   └── 难过.webp
└── 日常/
    └── 打招呼.png
  • 目录名 = 合集名,文件名去掉扩展名 = 表情名。这两样就是 token 里的两段。
  • 支持的扩展名:.gif .webp .png .jpg .jpeg。
  • 不递归:只扫一层,所以语法里也只有两级。
  • 点开头(.)或下划线开头(_)的文件与目录会被跳过,Thumbs.db 与 __pycache__ 同理 —— 拿它们放草稿或系统垃圾就行。

info.json(可选)

放在合集目录里,三个字段都是可选的:

{
  "title": "猫猫合集",
  "priority": 10,
  "ignore": false
}
字段 作用
title 面板标签上显示的合集名。不写就用目录名。只影响显示 —— token 里永远用目录名
priority 合集排序,数字大的排前面。不写按 0 算
ignore true → 整个合集隐藏:面板里没有,手打 token 也取不到图

title 和目录名可以不一样,这是推荐做法:目录名要短好打字(token 里用它), 显示名可以写全(「猫猫合集」)。

生效时机

不需要重启服务。 加文件、删文件、改 info.json 最多 60 秒后生效。

换掉同名文件的内容(比如把 开心.gif 换成另一张图)是立刻生效的 —— 服务器每次请求都重新读磁盘字节,缓存里只有名字。但浏览器那边有 1 天缓存, 所以换了图之后自己可能要强刷一下才看得到。

两个注意

  1. 不要放 SVG。 服务器只接受 PNG / JPEG / GIF / WebP,而且是按文件内容的 真实类型判定的 —— 把一个 .svg 改名成 .png 丢进去也没用,照样会被拒绝。 (SVG 能内嵌脚本,内联下发等于给了别人一个同源 XSS 的口子。)
  2. 同名多扩展名时按固定优先级取一个:.gif > .webp > .png > .jpg > .jpeg。 所以 开心.gif 和 开心.png 同时存在时,只有 .gif 会被用到。

版权

素材放上去就是对外公开提供了(未登录的读者也要能看到公开评论里的表情)。 用之前请确认你有权这么做 —— 尤其是从社交平台「免费分享」来的合集, 那句话往往只授权了转发,没有授权你再分发或公开传播。

本页内容来自仓库 docs/guide/表情包使用指南.md·在 GitHub 上查看