Skip to content

feat(markdown-editor): 表情面板支持插入论坛表情 - #69

Open
shellRaining wants to merge 3 commits into
mainfrom
feature/markdown-editor-emoji
Open

feat(markdown-editor): 表情面板支持插入论坛表情#69
shellRaining wants to merge 3 commits into
mainfrom
feature/markdown-editor-emoji

Conversation

@shellRaining

@shellRaining shellRaining commented Aug 4, 2026

Copy link
Copy Markdown
Owner

背景

Markdown 编辑器(Milkdown Crepe)此前没有输入论坛表情的入口。本次在编辑器工具栏新增表情按钮,弹出分类表情面板,点击表情即在光标处插入标准 Markdown 图片,插入结果与 UBB→Markdown 迁移输出一致(如 ![AC娘 01](https://www.cc98.org/static/images/ac/01.png))。

顺带把表情数据的所有权理顺:表情编号区间原本只存在于 packages/ubb 的解析器里,面板要用就得再抄一份,因此改为由 ubb 直接导出表情目录,前端只描述 UI 呈现。

改动

  • packages/ubb/src/emotion.ts:编号区间集中为 FAMILY_SPECS,新增导出 listUbbEmotions(family)(按分类列出全部表情描述符)、UBB_EMOTION_FAMILIESubbEmotionDisplayNameUbbEmotionFamily。八个分类共 599 个表情:经典 92 / AC娘 149 / 雀魂 54 / CC98 37 / 贴吧 33 / 麻将动物 16 / 麻将卡通 10 / 麻将脸 208。
  • packages/ubb/src/to-markdown.ts:删掉内部的 emotionMarkdownAlt switch,改调 ubbEmotionDisplayName,表情展示名从此单一来源。
  • apps/website/src/components/markdown-editor/emoji-data.ts(新增,36 行):只放面板 UI 配置(tab 顺序、tab 文案、格子边长)、表情按钮图标 SVG(取自 heroicons:face-smile-solid)和 resolveEmotionDisplaySrc
  • apps/website/src/components/markdown-editor/EmojiPanel.vue(新增):分类 tab + 表情网格,右上角弹出小框带动画;AC 娘在暗色模式展示 ac-dark 资源;格子尺寸按各分类图片实际尺寸取。麻将脸的动物 / 卡通 / 脸直接作为三个 tab,面板只有一条渲染路径。
  • apps/website/src/components/MarkdownEditor.vue:通过 Crepe topBarbuildTopBar 钩子追加表情按钮;点击表情在光标处插入 image 节点(所见即所得:插入面板当前主题版本,暗色模式插入 ac-dark);面板关闭用 VueUse 的 onClickOutside,按钮点击可开可关。
  • apps/website/src/components/rich-content/markdown/:Markdown 渲染端对 AC 娘图片做双向主题适配(暗色 ac→ac-dark、亮色 ac-dark→ac),与 UBB 渲染端 UbbEmotion.vue 规则一致,任何主题下内容都显示正确。
  • 测试:packages/ubb/tests/emotion.test.ts(新增)守 listUbbEmotionsresolveUbbEmotionTag 的一致性;apps/website/tests/markdown-editor-emoji.test.ts 守面板分类列表与 ubb 权威列表一致(ubb 新增分类即失败)和 AC 娘明暗资源解析;content-renderer.test.ts 补渲染端主题适配。

验证

  • vp run ready 全绿:format + lint + typecheck + check:colors + knip + vp run -r build + vp run -r test(website 296 / ubb 190 / api 21 用例)。
  • 浏览器走查(临时挂载页 + agent-browser,走查后已删除挂载页):表情按钮弹出面板,8 个分类 tab 与图片正常加载;点击 CC98 01 插入 ![CC98 01](https://www.cc98.org/static/images/CC98/CC9801.gif) 并自动关闭面板;按钮二次点击关闭、点击面板外关闭;暗色模式下 AC 娘格子与插入结果均为 /ac-dark/01.png

亮色模式面板(默认 CC98 分类):

emoji-panel-light.png

暗色模式 AC 娘(使用 ac-dark 资源):

emoji-panel-dark-ac.png

关联

  • 执行计划:docs/exec-plans/completed/2026-08-04-markdown-editor-emoji.md(本 PR 内归档,含决策记录与走查历史)

@vercel

vercel Bot commented Aug 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Actions Updated (UTC)
cc98 Ignored Ignored Preview Aug 6, 2026 2:07am
cc98-docs Ignored Ignored Preview Aug 6, 2026 2:07am

- topBar 新增表情按钮,弹出分类表情面板(CC98 / AC娘 / 麻将脸 / 贴吧 / 雀魂 / 经典)
- 点击表情在光标处插入 Markdown 图片,与 UBB→Markdown 迁移输出一致
- 表情枚举复用 packages/ubb 的 resolveUbbEmotionTag 规则并校验
- 所见即所得:插入面板当前主题版本(暗色插入 ac-dark),渲染端双向适配 ac/ac-dark
- 面板为右上角弹出的小框,带动画;格子尺寸沿用原 UBB 编辑器习惯
- 新增 emoji-data 与渲染端单测
表情的合法编号区间此前在 packages/ubb 和编辑器表情面板各存一份,面板还要
把拼出的 tag 反解一遍来校验。现在区间集中在 emotion.ts 的 FAMILY_SPECS,
对外暴露 listUbbEmotions、UBB_EMOTION_FAMILIES 和 ubbEmotionDisplayName,
to-markdown 的 alt 文案也改用同一函数。

- emoji-data.ts 只保留 UI 配置:tab 顺序、文案、格子边长
- 麻将脸的三类直接作为三个 tab,去掉先合并再 filter 的派生结构
- 点击外部关闭改用 VueUse 的 onClickOutside,删掉手写 pointerdown 闩锁
- 测试改为守两个契约:面板分类与 ubb 权威列表一致、AC 娘明暗资源解析
补齐简化重构后的方案、验证与决策记录,撤销"表情数据放 website 侧"的
原非目标,计划移入 completed/ 并同步索引。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant