@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-字符单行 TTML | 2.8个毫秒 | 17分钟 |
| 98k-字符单行 TTML | 7.1毫秒(每秒) | 26分钟 |
| 320线 TTML | 3.2个毫秒 | 1.6 毫秒(多径) |
| 2 000行 LRC | 3.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 | 成语文. 它也用于白空和新线. |
bgText | TTML 内有成文文字 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 元素名称 . |
attr | TTML 属性名称 . |
value | 其他属性值,或 LRC 元值. |
punct | 括号,引文, < > / =,和特别审判庭 -->。 。 。 . |
comment | <!-- ... --> 财务报告和审定财务报表 <?xml ... ?>。 。 。 . |
他们
每个颜色都是CSS自定义属性并有内置倒置. 样式表没有定义全局自定义属性, 因此将其中任何属性设置在窗格的祖先上 :
.my-pane { --bh-timestamp: #86efac; }
| 财产 | 默认 |
|---|---|
--bh-text | rgba(255, 255, 255, 0.95) |
--bh-bgText | rgba(255, 255, 255, 0.82) |
--bh-bgText-style | italic |
--bh-bgText-editor | rgba(255, 255, 255, 0.65) |
--bh-timestamp | rgba(165, 180, 252, 0.7) |
--bh-wordTime | rgba(165, 180, 252, 0.52) |
--bh-agent | rgba(252, 211, 77, 0.45) |
--bh-meta | rgba(249, 168, 212, 0.38) |
--bh-tag | rgba(255, 255, 255, 0.26) |
--bh-attr | rgba(255, 255, 255, 0.22) |
--bh-value | rgba(134, 239, 172, 0.3) |
--bh-punct | rgba(255, 255, 255, 0.16) |
--bh-comment | rgba(255, 255, 255, 0.2) |
--bh-caret | #fff |
--bh-selection | rgba(165, 180, 252, 0.28) |
--bh-placeholder | rgba(255, 255, 255, 0.35) |
检测
未给出格式时, 用 detectFormat 从 @braccato/parsers/format这些是相同的规则 detectParser 使用,在同一优先级中:TTML、LRC、SRT、QRC,然后是平原。 子路径是无依赖的, 因此强调绝不在 XML 解析器中拉出 .