
开发工具数据与知识【免费下载链接】js-yamlJavaScript YAML parser and dumper. Very fast.项目地址https://gitcode.com/gh_mirrors/js/js-yaml点击查看免费下载导读在 js-yaml 的 AST 呈现管线中标量样式Scalar Styling决定了一个字符串最终以哪种形式写入 YAML纯文本plain、单/双引号quoted、字面量块literal|还是折叠块folded且全程不改变字符串的实际值。本文以 docs/scalar_styling.md 为骨架结合 src/ast/styler_defaults.ts、src/ast/scalar_styler.ts 与 src/ast/presenter.ts 的源码实现讲解默认样式规则的判定逻辑并给出通过scalarStyleRules选项深度定制输出例如让制表符进入块标量的完整可运行方案。读完本文你将掌握 js-yaml 标量样式选择的完整决策链并能够编写自己的样式规则。什么是标量样式在 YAML 中一个字符串标量可以用多种语法书写而表达相同的值。样式只影响怎么写不改变值是什么。js-yaml 的dump()会为每个字符串自动挑选一种样式如果默认选择不符合需求则通过scalarStyleRules选项替换或覆盖默认规则。js-yaml 在 src/parser/events.ts 中定义了五种标量样式枚举枚举成员值YAML 语法示例SCALAR_STYLE.PLAIN1text: hello worldSCALAR_STYLE.SINGLE_QUOTED2text: hello worldSCALAR_STYLE.DOUBLE_QUOTED3text: hello\nworldSCALAR_STYLE.LITERAL_BLOCK4text: \|后跟逐行原样保留的内容SCALAR_STYLE.FOLDED_BLOCK5text: 后跟按行宽折叠的内容其中4、5即文档所说的 literal|与 folded两种块样式。文档概括为plain、quoted、literal|、folded四类其中 quoted 在实现层又细分为单引号与双引号两种。默认样式规则七条规则按序裁决当调用dump()或present()时呈现器会先检测当前字符串允许使用哪些样式即语法上可行再让样式规则按数组顺序逐个修改选中的样式。默认规则集定义在 src/ast/styler_defaults.tsconst DEFAULT_SCALAR_STYLE_RULES { applyQuoteFlowKeysOption, doubleQuoteForInvisibles, doubleQuoteWhitespaceOnly, applyForceQuotesOption, tryLongOrMultilineAsBlock, quoteInvalidPlain, fallbackToDoubleQuoted } as const这七条规则按应用顺序application order执行任何一条都可能改写layout.style。设计上规则通常只在style仍为PLAIN时动手以免覆盖前面的决策。各规则职责如下applyQuoteFlowKeysOption当quoteFlowKeys开启时仅对 flow 映射{a: 1}形态中的纯文本键强制双引号变成{a: 1}。非键、非 flow、非 plain 的情况直接跳过。doubleQuoteForInvisibles默认把包含不可见/特殊字符的 plain 标量改为双引号正则覆盖制表符与\x7F-\xA0\u2028\u2029\uFEFF\uFFFE\uFFFFDEL、NBSP、行分隔符 LS、段分隔符 PS、BOM、\uFFFE、\uFFFF等让它们以可见的转义形式呈现。本文核心示例正是覆盖这条规则。doubleQuoteWhitespaceOnly纯空白内容/^\s$/强制双引号。原因是块样式会把多行结构显影成若干视觉上空白的行反而掩盖了内容。applyForceQuotesOptionforceQuotes开启时给所有非键 plain 值加引号——多行值用双引号否则用quoteStyle默认single即单引号指定的首选样式。tryLongOrMultilineAsBlock决定长/多行文本是否升级为块样式。宽度预算由lineWidth默认80推导lineWidth: -1表示不限宽只要有至少一行超过宽度预算且能在空格处拆分就选折叠块否则纯多行文本选字面量块|。底层还涉及MIN_SCALAR_CONTENT_WIDTH 40styler_defaults.ts作为内容最小宽度下限。quoteInvalidPlain当允许样式位掩码不允许 plain 时例如以?、:、#等指示符开头改用首选引号样式。fallbackToDoubleQuoted最终兜底——若选中的样式不在允许掩码中一律回退到双引号。双引号样式总能通过转义表达任意字符串YAML 1.2.2 规范 [107] 双引号规则。自定义 scalarStyleRules允许制表符进入块标量默认规则中doubleQuoteForInvisibles把含制表符的字符串强制写成双引号例如dump({ text: first line\n\tindented line\n })输出text: first line\n\tindented line\n这样做保证制表符以\t形式可见、可读。但制表符同样合法地出现在块标量中。如果你希望制表符保留在块标量里可读性更好、与手写 YAML 风格一致可以复制默认规则集仅将doubleQuoteForInvisibles替换为不含制表符的版本。这是 docs/scalar_styling.md 给出的完整示例import { DEFAULT_SCALAR_STYLE_RULES, SCALAR_STYLE, dump } from js-yaml const scalarStyleRules Object.values({ ...DEFAULT_SCALAR_STYLE_RULES, doubleQuoteForInvisibles: layout { if (layout.style SCALAR_STYLE.PLAIN // Original regex, but without tab /[\x7F-\xA0\u2028\u2029\uFEFF\uFEFF\uFFFF]/.test(layout.node.value)) { layout.style SCALAR_STYLE.DOUBLE_QUOTED } } }) console.log(dump({ text: first line\n\tindented line\n }, { scalarStyleRules }))关键点在于原正则/\t\x7F-\xA0\u2028\u2029\uFEFF\uFFFE\uFFFF/见 styler_defaults.ts中开头的\t被移除后制表符不再触发双引号而字符串本身多行且含尾随换行后续的tryLongOrMultilineAsBlock规则会把它选为字面量块|。输出⇥标记制表符text: | first line ⇥indented line将这段 YAML 用load()解析回来会还原出包含制表符与尾随换行的原始字符串——样式变了值分毫不差import { load } from js-yaml console.log(load(text: |\n first line\n \tindented line\n)) // { text: first line\n\tindented line\n }这一 round-trip 特性在测试 test/core/ast/presenter.test.mjs 中得到了严格验证测试用例断言 tab 缩进的行在折叠标量中必须保持 more-indented不得被折叠成普通行、tab 前的空格不会被当作折叠点、且所有块标量值经 AST 往返后逐字节不变。规则机制剖析ScalarLayout 与执行链路要编写可靠的样式规则需要理解每条规则接收与修改的数据结构。ScalarLayout定义于 src/ast/scalar_styler.tsinterface ScalarLayout { readonly node: ReadonlyScalarNode // 标量节点value 为解码后的字符串 readonly parent: ReadonlyNode | null // 父节点 readonly level: number // 嵌套层级 readonly isKey: boolean // 是否为映射键 readonly flowOnly: boolean // 是否处于 flow 上下文 readonly shiftOfParent: number // 父级缩进列 readonly shiftOfContent: number // 内容缩进列 readonly shiftOfFirstLine: number // 首行缩进列 readonly presenterOptions: ReadonlyRequiredPresenterOptions // 呈现选项 allowedStylesMask: number // 允许样式位掩码每位对应一个 SCALAR_STYLE style: ScalarStyle // 当前选中样式规则可修改 }规则签名ScalarStyleRule是(layout: ScalarLayout) void即读取布局信息、按需改写layout.style的函数。完整的执行链路在 src/ast/presenter.tsconst layout scalarLayout(state, node, parent, level, iskey, !block) detectAllowedStyles(layout) for (const rule of state.scalarStyleRules) rule(layout) body renderScalar(layout)即三步先用detectAllowedStylesscalar_styler.ts按 YAML 1.2.2 字符产生式plain、单引号、块样式各自的语法约束算出允许样式位掩码再按数组顺序运行每条规则最后renderScalar依据最终样式调用对应的渲染函数plain 做换行编码、单引号翻倍转义、字面量块计算 chomping 指示符与缩进指示符、折叠块按行宽折行、双引号走转义表。以下几点对自定义规则至关重要掩码约束detectAllowedStyles是硬边界。例如 block 样式要求flowOnly为假、内容缩进至少为 1flow 上下文中永远不可能出现|或plain 样式要求字符串匹配完整的 plain 语法正则并保持隐式 tag 解析结果一致。规则可以自由降级从 plain 改引号但不能把样式改成掩码之外的值——fallbackToDoubleQuoted会兜底纠正。style初始值jsToAst生成的节点通常带PLAIN初始样式presenter.ts因此示例中判断layout.style SCALAR_STYLE.PLAIN是规则介入的先决条件。Object.values的作用默认规则以对象形式导出便于按名覆盖而scalarStyleRules选项接受数组。示例中Object.values({ ...DEFAULT_SCALAR_STYLE_RULES, doubleQuoteForInvisibles: ... })既保留了其余六条规则又把第 2 条替换成去 tab 版本且保持了数组顺序顺序即优先级。scalarStyleRules的默认值PresenterOptions.scalarStyleRules默认是Object.values(DEFAULT_SCALAR_STYLE_RULES)presenter.ts。一旦传入自定义数组默认规则被整体替换因此自定义时通常应以默认规则为基础做增量修改否则可能失去折叠、兜底等关键行为。与其他呈现选项的协同scalarStyleRules不是孤立功能它与dump()/present()的若干选项共同决定输出形态完整选项见 presenter.tsDumpOptions在 dump.ts 中继承之quoteStyle默认single规则需要引号时首选单引号还是双引号。_preferredQuotedStyle依据它决定SINGLE_QUOTED或DOUBLE_QUOTED。forceQuotes默认false是否强制给所有非键 plain 值加引号由applyForceQuotesOption规则实现。lineWidth默认80-1为不限折叠块的折行宽度参与tryLongOrMultilineAsBlock与renderFoldedBlock的宽度预算计算。quoteFlowKeys默认false是否给 flow 映射的 plain 键加引号设置flowSkipColonSpace会隐式强制开启它避免a:1被解析成单个 plain 标量。indent默认2块标量的内容缩进与shiftOfContent/shiftOfFirstLine等布局字段直接相关进而影响canUseBlock对缩进指示符的判定。实战建议与注意事项保持 round-trip 安全性样式规则的任何改动都必须保证load(dump(value))还原出原值。制表符进入块标量之所以安全是因为块标量语法天然允许 tab 参与内容而若把\n[ \t]换行后跟空白之类的字符串放进折叠块折叠语义会改变值——这正是 scalar_styler.ts 中单引号样式禁止此类模式的原因。修改规则前可参考 test/core/ast/presenter.test.mjs 中的往返测试用例。从默认规则起步尽量用对象展开覆盖而非从零手写整组规则避免遗漏fallbackToDoubleQuoted等安全兜底。仅改 PLAIN 阶段按照设计惯例规则只在layout.style SCALAR_STYLE.PLAIN时修改样式防止覆盖前面规则的决策。确认导出DEFAULT_SCALAR_STYLE_RULES、SCALAR_STYLE及类型ScalarStyleRule/ScalarLayout均已从包入口导出见 src/index.ts可直接import { ... } from js-yaml。标量样式定制的本质是在值的语义保真与输出的可读偏好之间做精确权衡。理解了默认七条规则的决策顺序与ScalarLayout的布局信息你就可以像本文示例一样用十几行代码把 js-yaml 的输出风格塑造成团队或工具链期望的形态。赞分享开发工具数据与知识【免费下载链接】js-yamlJavaScript YAML parser and dumper. Very fast.项目地址https://gitcode.com/gh_mirrors/js/js-yaml点击查看免费下载相关推荐ImPlot样式定制终极指南从默认主题到完全自定义外观ImPlot样式定制终极指南从默认主题到完全自定义外观 ImPlot是一个功能强大的即时模式绘图库专为数据可视化而设计。作为Dear ImGui生态系统的重数据可视化图表库Hugo RSS 模板完全指南从默认配置到自定义输出格式Hugo RSS 模板完全指南从默认配置到自定义输出格式 本篇技术指南围绕 Hugo 的 RSS 模板系统展开覆盖 feed 的默认生成规则、 output开发工具前端CLIHandsontable 列头Column Headers完整指南从默认字母标签到自定义样式与高度控制Handsontable 列头Column Headers完整指南从默认字母标签到自定义样式与高度控制 导读 本文基于 Handsontable 官方文档前端UI组件上一篇G-Helper 修复屏幕色彩配置文件4 个阶段找回华硕笔记本出厂色彩下一篇GL-iNet路由器iStoreOS风格一键美化完整指南10型号不刷机换新界面创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考