Skip to content

feat(render): 完成 htmlrender 渲染模板#489

Open
Misty02600 wants to merge 17 commits intofllesser:masterfrom
Misty02600:pr
Open

feat(render): 完成 htmlrender 渲染模板#489
Misty02600 wants to merge 17 commits intofllesser:masterfrom
Misty02600:pr

Conversation

@Misty02600
Copy link

设计了一套渲染模板并为每个平台适配了一套主题色,此外修复了bilibili转发动态无法正常显示的问题,详见commit title

示例:
34da753b27edefd52fc904c15d0b7927_720
01bc811c1898e38d3d703f7469a538e8_720
ad306003cd083813ba32648baa751615
0289f3277f20c3e9deac9eba027f2ad1_720
bedc19f6ef5bdc4d830ac781e8af977c_720
c3bc206f0b3411565507dbed66c3b802

引入 dataclass 重新定义模板数据模型,提升类型安全性与代码可维护性。
新增多平台主题配色方案,支持根据平台标识自动切换卡片视觉风格。
重构渲染逻辑以支持多视频内容展示,并优化了图片网格、转发卡片及 AI 总结面板的布局。
统一资源路径处理逻辑,增强了与 CommonRenderer 的表现一致性。
统一边框宽度为 1.5px 并移除部分元素的阴影效果,使视觉风格更加简洁。
优化图片网格布局,将边框与圆角属性应用于具体的网格项目而非容器,并增大间距。
移除多余的封面图回退逻辑,简化模板代码并修正页面高度约束。
@codecov
Copy link

codecov bot commented Mar 12, 2026

Codecov Report

❌ Patch coverage is 75.83333% with 29 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
.../nonebot_plugin_parser/parsers/bilibili/dynamic.py 62.79% 16 Missing ⚠️
...nonebot_plugin_parser/parsers/bilibili/__init__.py 20.00% 8 Missing ⚠️
src/nonebot_plugin_parser/parsers/data.py 86.11% 5 Missing ⚠️
Files with missing lines Coverage Δ
src/nonebot_plugin_parser/renders/common.py 89.69% <100.00%> (-0.08%) ⬇️
src/nonebot_plugin_parser/renders/htmlrender.py 100.00% <100.00%> (+2.63%) ⬆️
...onebot_plugin_parser/renders/resources/__init__.py 100.00% <100.00%> (ø)
src/nonebot_plugin_parser/utils.py 71.79% <100.00%> (+2.78%) ⬆️
src/nonebot_plugin_parser/parsers/data.py 90.73% <86.11%> (+0.61%) ⬆️
...nonebot_plugin_parser/parsers/bilibili/__init__.py 68.51% <20.00%> (-2.16%) ⬇️
.../nonebot_plugin_parser/parsers/bilibili/dynamic.py 66.66% <62.79%> (-1.11%) ⬇️

@fllesser
Copy link
Owner

fllesser commented Mar 12, 2026

看起来还不错

小红书的 logo 好像有点大

title 和 text 的粗细是不搞反了

有些内容的字体也感觉过大了

@fllesser fllesser requested review from fllesser and he0119 March 12, 2026 10:25
@Misty02600
Copy link
Author

看起来还不错

小红书的 logo 好像有点大

title 和 text 的粗细是不搞反了

有些内容的字体也感觉过大了

所有logo固定的高度,我感觉小红书logo还好,手机上没什么区别

部分动态的titile和text排版顺序有问题,我再检查一下

卡片标题的确稍微有点大,我调小一下出个预览

@Misty02600
Copy link
Author

Misty02600 commented Mar 12, 2026

class ParseResult:
"""完整的解析结果"""
platform: Platform
"""平台信息"""
author: Author | None = None
"""作者信息"""
title: str | None = None
"""标题"""
text: str | None = None
"""文本内容"""
timestamp: int | None = None
"""发布时间戳, 秒"""
url: str | None = None
"""来源链接"""
contents: list[MediaContent] = field(default_factory=list)
"""媒体内容"""
extra: dict[str, Any] = field(default_factory=dict)
"""额外信息"""
repost: "ParseResult | None" = None
"""转发的内容"""
render_image: Path | None = None
"""渲染图片"""

这里要不要区分一下小红书那样的动态标题,和bilibili动态里的视频标题?我觉得把视频标题和视频作为一块放一起更好看,而动态标题才放到顶部。还有text感觉语义也有些混乱,有的是动态文字,有的是图文摘要有的是视频简介,如果能做区分的话,更精致的模板实现里不容易出bug

总之我先条件判断了,如果以后优化了再修改

@fllesser
Copy link
Owner

fllesser commented Mar 12, 2026

class ParseResult:
"""完整的解析结果"""
platform: Platform
"""平台信息"""
author: Author | None = None
"""作者信息"""
title: str | None = None
"""标题"""
text: str | None = None
"""文本内容"""
timestamp: int | None = None
"""发布时间戳, 秒"""
url: str | None = None
"""来源链接"""
contents: list[MediaContent] = field(default_factory=list)
"""媒体内容"""
extra: dict[str, Any] = field(default_factory=dict)
"""额外信息"""
repost: "ParseResult | None" = None
"""转发的内容"""
render_image: Path | None = None
"""渲染图片"""

这里要不要区分一下小红书那样的动态标题,和bilibili动态里的视频标题?我觉得把视频标题和视频作为一块放一起更好看,而动态标题才放到顶部。还有text感觉语义也有些混乱,有的是动态文字,有的是图文摘要有的是视频简介,如果能做区分的话,更精致的模板实现里不容易出bug

总之我先条件判断了,如果以后优化了再修改

“小红书那样的动态标题,和bilibili动态里的视频标题” 这个没懂

text 有的时候是动态末端文字,是当时 GraphicsContent 设计得有问题,偷懒搞出的 💩,你就当 text 是 content 下面的内容就行了

或者你有什么想法把 GraphicsContent 给改一下

@Misty02600
Copy link
Author

class ParseResult:
"""完整的解析结果"""
platform: Platform
"""平台信息"""
author: Author | None = None
"""作者信息"""
title: str | None = None
"""标题"""
text: str | None = None
"""文本内容"""
timestamp: int | None = None
"""发布时间戳, 秒"""
url: str | None = None
"""来源链接"""
contents: list[MediaContent] = field(default_factory=list)
"""媒体内容"""
extra: dict[str, Any] = field(default_factory=dict)
"""额外信息"""
repost: "ParseResult | None" = None
"""转发的内容"""
render_image: Path | None = None
"""渲染图片"""

这里要不要区分一下小红书那样的动态标题,和bilibili动态里的视频标题?我觉得把视频标题和视频作为一块放一起更好看,而动态标题才放到顶部。还有text感觉语义也有些混乱,有的是动态文字,有的是图文摘要有的是视频简介,如果能做区分的话,更精致的模板实现里不容易出bug
总之我先条件判断了,如果以后优化了再修改

“小红书那样的动态标题,和bilibili动态里的视频标题” 这个没懂

text 有的时候是动态末端文字,是当时 GraphicsContent 设计得有问题,偷懒搞出的 💩

就是如果bilibili一个动态是发的自己视频,那么title字段就会是这个视频的标题,适合放在视频下面。而小红书的title就是动态本身标题,适合放顶部。

@property
def title(self) -> str | None:
"""获取标题"""
if self.type == "MAJOR_TYPE_ARCHIVE" and self.archive:
return self.archive.title
if self.type == "MAJOR_TYPE_OPUS" and self.opus:
return self.opus.title
return None

这里直接把bilibili的图文和视频两种标题都传入title了

@fllesser
Copy link
Owner

fllesser commented Mar 12, 2026

额,这个好像是昨天改的,他们说有些动态解析出没标题,群友说加两行就好了,我没细看(

你把 76-77 删了, 然后把这个标题放在 VideoContent 里?

其实 B 站动态这块,当时都没想做的,太混乱了

@Misty02600
Copy link
Author

现在的效果大概是这样,后续如果把视频标题和视频塞一个卡片里区分度会更好
f2b18367afef920d5bf717b668271e47_720

d2212ac98ee0d14d6c0193cf539ce0bf_720

@Misty02600
Copy link
Author

暂时就这样吧,我后面看看要不要重构一下数据类提新的pr,渲染只测试了一些可能还有bug

@fllesser
Copy link
Owner

九宫格那些做了吗,还有嵌套的转发

@Misty02600
Copy link
Author

九宫格那些做了吗,还有嵌套的转发

做了

@fllesser
Copy link
Owner

对了,你的模版有试过 htmlkit 吗

@Misty02600
Copy link
Author

对了,你的模版有试过 htmlkit 吗

没有,调研了一下感觉不太好用,也没测试过

@fllesser
Copy link
Owner

fllesser commented Mar 12, 2026

好吧,我明天看一下吧,今天不想 re 代码了

@fllesser fllesser changed the title 完成htmlrender渲染模板 feat(render): 完成 htmlrender 渲染模板 Mar 12, 2026
@fllesser
Copy link
Owner

fllesser commented Mar 13, 2026

34d4af85b5ca96ca66815f28b6ced5e6 我重构了一下,你看一下 @Misty02600 ,昨晚加群那个是你吗

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.

2 participants