青梧 UI

文本排版规则引擎 —— 设计总览

基于 Pretext 架构 + CSS Text Module Level 3 的行级排版规则

规则 1:两阶段分离
prepare() 一次性文本预处理(Intl.Segmenter 字素分割 + Canvas 测量 + 缓存),layout() 纯算术 O(n) 换行,可每帧调用。与 Pretext 的设计哲学一致。
规则 2:Unicode 感知
Intl.Segmenter grapheme 粒度分割。CJK 字符按单字断行,Emoji ZWJ 序列不可拆分,拉丁单词边界断行。覆盖中日韩、阿拉伯、泰文、Emoji 等脚本。
规则 3:CSS 兼容换行
强断 > 软断 > 溢出断。空格为软断点,CJK 字符前后均可断行,标点禁止出现在行首。无断点时执行 overflow-wrap: break-word 策略。
规则 4:宽度缓存
(text, font) 为 key 的全局 LRU 宽度缓存。prepare() 后 segment 可复用,避免同一文本重复 Canvas 测量。字体变更后调用 clearCache()。
规则 5:虚拟滚动高度
computeVirtualHeights() 批量预计算每项高度与累计偏移,findVisibleRange() 二分查找可见区间,O(log n) 定位。
规则 6:芯片流原子性
芯片(chip)作为不可断行原子元素参与 inline 排版,换行时整体移动。extraWidth 承载边框/内边距/关闭按钮等额外宽度。
测量引擎加载中…

核心引擎

属性说明类型默认值
prepare(text, font?)预处理文本:字素分割 + Canvas 宽度测量 + LRU 缓存,返回可复用的排版段(text, font?) => Segment[]font 16px system-ui
layout(text, options, font?)核心排版:按 maxWidth 换行(Unicode 感知断行),返回行 / 高度 / 截断信息(text, options, font?) => LayoutResult-
layoutSegments(segments, options)对已 prepare 的段排版,纯算术可每帧调用(segments, options) => LayoutResult-
measure(text, maxWidth, lineHeight, font?)快速计算行数与总高度(text, maxWidth, lineHeight, font?) => { lineCount, totalHeight }-
measureWidth(text, font?)获取文本宽度(带全局缓存)(text, font?) => number-
clearCache()清除全局宽度缓存(字体变更后调用)() => void-

布局工具

属性说明类型默认值
layoutChips(items, maxWidth, font?, chipPaddingX?, lineHeight?)芯片流 inline 排版:chip 作为不可断行原子元素与文本混合换行(items, maxWidth, ...) => ChipLayoutResultchipPaddingX 16 / lineHeight 24
truncateToLines(text, maxWidth, maxLines, font?, ellipsis?)多行截断:超出 maxLines 按字符截断并追加省略号(text, maxWidth, maxLines, font?, ellipsis?) => TruncateResultellipsis …
truncateToHeight(text, maxWidth, maxHeight, lineHeight, font?, ellipsis?)截断到最大高度(由行高换算行数)(text, maxWidth, maxHeight, lineHeight, ...) => TruncateResult-
computeVirtualHeights(items, containerWidth, lineHeight, font?, paddingVertical?, maxLines?)虚拟滚动高度预计算:id → 高度映射 + 累计偏移 + 总高度(items, containerWidth, lineHeight, ...) => VirtualHeightResult-
findVisibleRange(offsets, scrollTop, viewportHeight, overscan?)按滚动偏移二分查找可见项范围(含 overscan)(offsets, scrollTop, viewportHeight, overscan?) => [number, number]overscan 3
computeColumnWidths(rows, availableWidth, font?, minColumnWidth?, maxColumnWidth?)表格列宽自动分配:按内容比例 + 最小 / 最大宽度约束(rows, availableWidth, font?, ...) => ColumnWidthResultmin 60
fitRowToColumns(row, columnWidths, font?)将行数据按分配列宽逐格截断适配(row, columnWidths, font?) => string[]-

类型

属性说明类型默认值
LayoutOptions排版参数:maxWidth / lineHeight / maxLines / overflowWrapinterface-
LayoutResult排版结果:lines / totalHeight / lineCount / truncatedinterface-
ChipItem芯片流元素:type(text|chip) / text / extraWidth(边框、内边距等额外宽度)interface-
TruncateResult截断结果:text / truncated / lineCount / fullLineCountinterface-
VirtualItem / VirtualHeightResult虚拟滚动项与高度计算结果interface-
ColumnWidthResult列宽分配结果:widths / total / truncatedinterface-