Pretext 文本测量
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_8c8358bf/pretext-text-measurement。
技能介绍
要解决什么问题
虚拟滚动、聊天列表、手风琴或 Masonry 布局里,常见痛点是:在真正插入 DOM 之前,不知道一段文字在固定宽度下占多高、会不会换行、一共几行。用 getBoundingClientRect 可以量,但会触发重排;纯字符数估算又和浏览器换行规则对不上,中英文混排、Emoji、pre-wrap 时误差更大。
本技能封装开源库 @chenglou/pretext,用与 Canvas measureText 一致的思路做布局算术,把「给定 text、font、width(及可选 lineHeight、whiteSpace、wordBreak)→ 高度、行数、逐行内容与宽度」变成可脚本调用的结果,而不是靠猜或反复渲染。
技能如何工作
按意图选用不同入口,Agent 或本地脚本都能对接:
measure.js:最常用,返回总高度、lineCount等,适合「会不会换行」「容器要多高」layout-lines.js:返回每行的text、width以及startCursor/endCursor,适合 Canvas 逐行绘制batch.js:同一字体与宽度下批量测多条文案,适合消息列表预计算- 富文本内联:带
@提及、标签、代码片段等内联节点时做组合布局 - 浏览器模式:在已有 DOM 的环境可加载 UMD / npm 包,调用
pretext.layout、measureNaturalWidth、prepare等 API,精度与原版一致
典型流程是:从用户描述里抽出文本与排版参数 → 调用对应脚本 → 把 JSON 结果翻译成「几行、多高、每行是什么」的工程结论。文档中还覆盖了收缩包裹宽度、文字绕排浮动区域、换字体时清缓存,以及用逐字宽度做 Canvas 粒子动画等进阶场景。
适用边界与注意点
- 白空间与断词:仅支持
white-space的normal/pre-wrap,word-break为normal/keep-all;不支持pre、nowrap等。 - 字体与平台:
prepare()依赖字体已可用;macOS 下泛用system-ui时精度可能不稳,建议具名字体(如 Inter、-apple-system、PingFang SC)。 - RTL:阿拉伯文、希伯来文等暂不支持。
- 空字符串:技能返回
{ lineCount: 0, height: 0 },与部分浏览器仍保留一行行高的行为可能不一致,布局要严格对齐时需自行校验。 - 精度声明:Node 侧可选
canvas提升测量;未安装时走纯 JS Unicode 估算,功能完整但可能有偏差;极高像素级 UI 仍应以浏览器实渲为准。
使用场景
- 在 375px 宽的聊天界面里,为几十条不等长消息预先算好每条高度,再接入虚拟滚动避免滚动抖动
- 用 Canvas 绘制多行文案时,需要每行的文本片段与起止坐标,而不是只拿到总高度
- 手风琴或折叠面板展开前,先根据标题与正文宽度算出内容区高度,再写 CSS transition
- 富文本气泡里混有 @提及、标签和代码片段,要在固定宽度下估算整条消息占几行、总高度多少
适合人员
- 负责 IM 或评论流的前端,要在不反复 mount 隐藏 DOM 的前提下给列表项定高
- 做数据可视化或游戏 UI 的工程师,在 Canvas 上按行绘制文字并要对齐光标位置
- 做信息流或卡片墙的开发者,需要 Masonry/瀑布流在排版前就知道每张卡片的内容高度
- 封装设计系统或聊天组件的同学,要统一处理中英文混排、Emoji 与 `pre-wrap` 下的换行规则