@ 有弹性/ 漂亮- 打印器
基于 Wadler- Lindig 文档的通用美化打印库
代数( Philip Wadler, "一个更漂亮的打印机", 2003; 克里斯蒂安·林迪格严格
(第3条)。 执行在很大程度上取自普雷蒂埃的内部
doc-printer。 。 。 .
它没有包含ESQQL, PromQL, 或其他域知识—— 它是独立的
使用的布局引擎 @elastic/esql画得很漂亮,出版过很多
工程可以在同一项目上构建宽度认识格式 Doc IR (英语).
安装
npm install @elastic/pretty-printer
如何运作
漂亮印刷是一个两相过程:
- 构建 (单位:千美元) 文档树 (单位:千美元)
Doc)使用组合器(见下文)。 树 描述 结构 它没有混凝土线 断裂或缩进. - 版式 树变成一串混凝土 排版引擎是否适合
尽可能在每一行(最多
printWidth),断开group平面显示会超过可用宽度的节点.
示例
import { text, group, indent, line, softline, join, layout } from '@elastic/pretty-printer';
const doc = group([
text('SELECT'),
indent([line, join(
[text(','), line],
[text('a'), text('b'), text('c')])]
),
line,
text('FROM t'),
]);
layout(doc, { printWidth: 40 });
// SELECT
// a,
// b,
// c
// FROM t
layout(doc, { printWidth: 80 });
// SELECT a, b, c FROM t
layout(tree, opts?)
主入门. 需要一个 打印树 并返回已格式化的字符串.
选项 :
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
printWidth | number | 80 | 目标最大行宽. |
tabWidth | number | 2 | 每个缩进的空格 . |
useTabs | boolean | false | 缩进分页而不是空格. |
endOfLine | '\n' | '\r\n' | '\r' | '\n' | 线起字符. |
组合符/命令
打印机提供一组用于构建打印的梳理器( 或“ 命令 ”) 树 这些是描述产出结构的构件.
初级
text(string)——文字,以正字印刷. 必须 没有 包含 新行字符.Doc[](阵)——协和. 将一系列文件剩余到 对.
换行符
line—空间" "平面模式; 新行 + 缩进 在中断模式中.softline- 没什么""平面模式; 新行 + 缩进 在中断模式中.hardline总是 新行 + 缩进。强迫附件组 中断.hardlineWithoutBreakParent- 喜欢hardline但确实 没有 部队 要打破的母组.literalline- 硬线断开后缩进 根号 职位 (设置于markAsRoot)取而代之的是目前的筑巢水平. 保留 正在沿着白色空间。 包围各集团的军队要瓦解.literallineWithoutBreakParent- 喜欢literalline但确实 没有 强制母组断开.
分组
group(tree, opts?)——核心断裂决定单元. 尝试制作 打印树节点平平(单行)。 如果超过所剩宽度,则开关 以中断模式。 选项 :shouldBreak(断力),id(符号表示 与ifBreak编号 :indentIfBreak) (中文(简体) ).conditionalGroup(states, opts?)——多州集团. 提供 从最紧凑到最扩展的替代布局。 发动机各试一试 顺序并使用第一个适合的;如果一个适合,最后一个状态是 以中断模式提供.fill(parts)——包装布局.parts在内容和 换行文件 :[item, line, item, line, ...]填充每行 许多在断裂前合适的物品——不同于group,这是所有或什么都没有.
缩进
indent(tree)——将缩进增加一个分页级别.align(n, tree)精确地增加缩进n空格( 不为 选项卡级别)。 特殊值 :-1(第一级),Number.NEGATIVE_INFINITY(重置为根),{ type: 'root' }(当前标记) 缩入为根).dedent(tree)将缩进减少一个级别。 简指align(-1, tree)。 。 。 .dedentToRoot(tree)——将缩进重置为根(栏0或 职位设置markAsRoot) (中文(简体) ).markAsRoot(tree)——将当前缩进标为"根" 职位literalline。 。 。 .
有条件的内容
ifBreak(breakDoc, flatDoc?, opts?)- 释放breakDoc当 附加组(或引用的组)groupId处于中断模式; 否则会发射flatDoc。 。 。 .indentIfBreak(tree, opts)有条件地缩进doc基于 引用组模式 。 优化形式ifBreak(indent(tree), doc, { groupId })设置negate: true倒转.breakParent——强迫所有先辈群体决裂. 宣传期间 预通( :propagateBreaks) (中文(简体) ).
注释行后缀( L)
lineSuffix(tree)- 缓冲doc并放出在电流末端 线条,就在下行中断前。 用于跟踪评论.lineSuffixBoundary- 强行取消任何待决事项lineSuffix内容. 防止跟踪评论泄露过去的合成边界.
杂项
label(lbl, tree)注释一个不透明标签的医生 语言特异性heuristic introduction. 中国植物物种信息数据库. 没有影响布局 .trim—— 从当前输出中删除所有后端的空白 立场.cursor用于光标位置跟踪的占位符。 排版引擎 发出一个监视器; 呼叫者可以找到它, 以保存光标位置 格式化.join(separator, trees)- 加入一系列文件与separator每一对之间.bracketedList(open, close, sep, items)- 分组的方便, 缩入括号内的清单。 平地 :(a, b, c)断开 :( a, b, c )addAlignmentToDoc(doc, size, tabWidth)- 转换绝对值 缩入巢中大小indent编号 :align内部包装dedentToRoot。 。 。 . 用于嵌入内容需要特定的缩进级.
倾斜
traverse(doc, { onEnter?, onExit? })- 一般深度第一横贯 使用显式堆栈(不重复)的多克树。 返回时false从onEnter跳过节点的孩子.