@braccato/highlight

中文文档
0.3.2发布于 2026/10/18MITTypeScriptES Module构建来源已验证近 30 天下载 1709

TTML, LRC, QRC 和 SRT 歌词的轻量级语法加亮

中文使用文档
文档目录8 节
  1. 安装
  2. 使用量
  3. 仅读面板
  4. 编辑器
  5. 仅指针
  6. 键
  7. 他们
  8. 检测

@braccato/高光

TTML 、 LRC 、 QRC 和 SRT 歌词的语法加亮, 超出零运行时依赖性 @braccato/parsers/format。它装有纯正的装饰器、只读相片的DOM渲染器和编辑器的文本区域。 印相与印相退取相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相出相相出相.

安装

npm i @braccato/highlight

使用量

仅读面板

import { highlightInto } from "@braccato/highlight";
import "@braccato/highlight/highlight.css";

highlightInto(pre, source, { pretty: true });

highlightInto 添加 bh 类到元素,将符号颜色放入其下,并返回所使用的格式. pretty: true 将已修改的 TTML 切换成行 head, (中文(简体) ), body, (中文(简体) ), div 财务报告和审定财务报表 p。它只插入白空格,但所渲染的文本已不匹配源,因此仅用于显示,而从未在编辑器中显示。 线条格式忽略它 .

编辑器

import { attachEditor } from "@braccato/highlight";
import "@braccato/highlight/highlight.css";

const editor = attachEditor(textarea);

attachEditor 将文本区域包成一个 div.bh-edit 并突出显示 pre.bh-layer 硂 文本区变得透明,并保持了被关注,选择和所有输入. 该图层复制了文本区域的字体、贴纸、边框宽度和框大小,并按其滚动位置排列.

层接一 span.bh-line 每个源行的块,每个块都有一个单一的文本节点。 颜色来自 CSS 自定义突出显示 API: 每个符号类型一个亮点,注册于 CSS.highlights 作为 bh-<type> 由页面上的每个编辑分享。 将一行分割成一行会使浏览器将每个片段的宽度相隔相隔一圈,一行只适合文本区,然后在地层早期将一字包住并逐行推倒. 一个单一的文本节点的设置恰好与文本区规定的其价值一致. 在缺少 API 的地方,该图层会显示相同位置的纯文本 .

每一个输入都重新将整个文档收录,因此背景相声等TTML状态在后行保持正确,但只有所改变的行被重写并重写.

只有一个编辑器高度上下方的文字才有颜色。 其余部分没有亮度范围。 卷轴留在边框内,一旦卷起就重新样式,再经过一卷则在下张画前重新样式.

在一款Apple M4 Pro上的Chrome 152中键中键成本,用于900中键被600像素编辑器所打入的中键文档. 脚本和布局为中位脚本外加强制样式和布局时间;颜料为相框的绘画相:

文档脚本和布局绘画
21.4k-字符单行 TTML2.8个毫秒17分钟
98k-字符单行 TTML7.1毫秒(每秒)26分钟
320线 TTML3.2个毫秒1.6 毫秒(多径)
2 000行 LRC3.6 毫秒(多发数)1.3 分钟

一个键盘重漆了整个文本节点, 它降落在其中, 上面每个亮点, 所以一个长行是缓慢的情况: 可见文本重漆成每块一个符号.

卷卷起后每向编辑高度滚动一次. 在98k-特征线上重排成本约一分半键,多行文档小于一;在成本相间滚动步骤为0.2ms.

货包为10.9 KB 精密型和 4.7 KB gziped (esbuild --minify),加 (中文(简体) ) @braccato/parsers/format。 。 。 .

它回来了 { wrap, layer, refresh, setFormat, destroy }数字 :

  • 设置 textarea.value 从代码不起火 input,所以打电话 editor.refresh() 在每次程序写完之后.
  • editor.destroy() 将文本区域放回原位置,取出包装并删除 bh-input 课。 两次就安全了.
  • 过 { format } 来标出格式。 没有它,格式在每个渲染上都会被检测出,所以粘贴不同的格式会再有颜色.
  • 编辑器在附加并拥有其格式时会复制这些选项. 以后更改选项对象无所作为 .
  • editor.setFormat(format) 立即更改活编辑器的格式并重报。 文本区没有被重新附着,所以它的原生倒数历史得以存续. editor.setFormat(undefined) 返回到检测每个渲染处的格式。 通过当前固定格式(或) undefined 在探测时)无所作为. 在检测模式中,传递被检测到的格式会把它钉上. setFormat 不替换 refresh() 在程序写入之后 textarea.value: 调用 refresh() 对于新值,无论格式是否改变.
  • 附加已拥有活编辑器的文本区域返回编辑器的手柄并忽略新选项. 使用 setFormat 上键以更改格式.

覆盖需要文本区和图层来共享一个框,所以 .bh-input 部队 margin: 0, (中文(简体) ), box-sizing: border-box, (中文(简体) ), width: 100% 财务报告和审定财务报表 resize: none 文本区域。 层复制盒大小,所以一个文本区的粘贴和边框留在包件内,两个包线的宽度相同. 将主机想要的任何边距或宽度放入包装上(.bh-edit,或 editor.wrap相反.

亮点只能改变颜色,所以背景相声和评论在编辑器中不是斜体相通,以及 --bh-bgText-style 仅适用于只读的面板。 背景相声在编辑器中被淡化,通过 --bh-bgText-editor。任何字体都有作用:图层从未改变文本任何部分的字体.

仅指针

import { tokenize } from "@braccato/highlight";

const tokens = tokenize(source); // [{ type: "punct", text: "[" }, { type: "timestamp", text: "00:14.21" }, ...]

令牌的相接文字总是等同输入,相接的相接符号没有两个共享一个类型. 他们到底是什么 highlightInto 绘图,因此您自己的一个渲染器( 例如在服务器上制作的 React 组件) 通过将每个符号绘制如下来复制, 没有合并步骤 :

tokens.map(({ type, text }, i) => (type === "text" ? text : <span key={i} className={`bh-${type}`}>{text}</span>));

将结果与 bh 分类,所以符号颜色适用. highlightInto 与 pretty: true 符号 prettyTtml(source) 而不是来源.

键

在只读的相片中,每个相片成一个 <span class="bh-<type>">时,除 text,它作为一个纯文本节点。 在编辑器中,每个符号在 bh-<type> 突出显示. tokenize 已将相邻的同类型文本合并为一个符号.

脚本含义
text成语文. 它也用于白空和新线.
bgTextTTML 内有成文文字 ttm:role="x-bg" 间距.
timestamp线条时间 : [00:14.21],一个 TTML begin, (中文(简体) ), end 或者说 dur 数值, [14210,4350],或者SRT提示时间.
wordTime单词时间: <00:18.90> 或者说 (14210,300)。 。 。 .
agent一个声音 : v1: 在 LRC 中,或 TTML 中 ttm:agent, (中文(简体) ), ttm:role 或者说 xml:id 数值.
meta元数据: LRC 或 QRC [ti:...] 键, TTML 中的文本 <head>,或SRT提示号.
tag一个 TTML 元素名称 .
attrTTML 属性名称 .
value其他属性值,或 LRC 元值.
punct括号,引文, < > / =,和特别审判庭 -->。 。 。 .
comment<!-- ... --> 财务报告和审定财务报表 <?xml ... ?>。 。 。 .

他们

每个颜色都是CSS自定义属性并有内置倒置. 样式表没有定义全局自定义属性, 因此将其中任何属性设置在窗格的祖先上 :

.my-pane { --bh-timestamp: #86efac; }
财产默认
--bh-textrgba(255, 255, 255, 0.95)
--bh-bgTextrgba(255, 255, 255, 0.82)
--bh-bgText-styleitalic
--bh-bgText-editorrgba(255, 255, 255, 0.65)
--bh-timestamprgba(165, 180, 252, 0.7)
--bh-wordTimergba(165, 180, 252, 0.52)
--bh-agentrgba(252, 211, 77, 0.45)
--bh-metargba(249, 168, 212, 0.38)
--bh-tagrgba(255, 255, 255, 0.26)
--bh-attrrgba(255, 255, 255, 0.22)
--bh-valuergba(134, 239, 172, 0.3)
--bh-punctrgba(255, 255, 255, 0.16)
--bh-commentrgba(255, 255, 255, 0.2)
--bh-caret#fff
--bh-selectionrgba(165, 180, 252, 0.28)
--bh-placeholderrgba(255, 255, 255, 0.35)

检测

未给出格式时, 用 detectFormat 从 @braccato/parsers/format这些是相同的规则 detectParser 使用,在同一优先级中:TTML、LRC、SRT、QRC,然后是平原。 子路径是无依赖的, 因此强调绝不在 XML 解析器中拉出 .

版本与发布记录

@braccato/highlight 共发布 9 个版本,首次发布于 2026/10/01;过去 12 个月发布了 9 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.3.2latest2026/10/1823 天前
0.3.12026/10/071 个月前
0.3.02026/10/031 个月前
0.2.22026/10/031 个月前
0.2.12026/10/011 个月前
0.2.02026/10/011 个月前

关于 @braccato/highlight 的常见问题

@braccato/highlight 是什么?

TTML, LRC, QRC 和 SRT 歌词的轻量级语法加亮

如何安装 @braccato/highlight?

在项目目录运行 npm install @braccato/highlight,或使用 pnpm add / yarn add / bun add。

@braccato/highlight 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@braccato/highlight 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@braccato/highlight 可以商用吗?

@braccato/highlight 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@braccato/highlight 的下载量有多少?

根据 npm 官方下载统计,@braccato/highlight 在 2026/10/09 – 2026/11/07 这 30 天内被下载 1,709 次,日均约 57 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@braccato/highlight 还在维护吗?

最新版本 0.3.2 发布于 2026/10/18(23 天前);至今共发布 9 个版本,其中过去 12 个月发布了 9 个;首次发布于 2026/10/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。