ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Prettier 如何格式化 Markdown 代码块中的 CSS:以 mdn-background-5 多层渐变背景为例

Prettier 如何格式化 Markdown 代码块中的 CSS:以 mdn-background-5 多层渐变背景为例 开发工具格式化CLI【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址https://gitcode.com/gh_mirrors/pr/prettier点击查看免费下载本文围绕 Prettier 代码库中用于 Markdown 格式化测试的样例文档 tests/format/markdown/code/mdn-background-5.md 展开剖析 Prettier 对 Markdown 围栏代码块fenced code block内 CSS 代码的格式化行为多层linear-gradient()背景会被重排为逐层缩进的悬挂缩进风格同时收紧函数内部的换行与空行。读者读完后将掌握 Prettier 的代码块嵌入格式化机制、相关可配置选项如proseWrap、printWidth并能结合快照测试理解输出规律可直接用于自己项目中 Markdown 内嵌代码的排版实践。关联文档速览这是一个什么样的文件mdn-background-5.md位于 Prettier 仓库的 Markdown 格式化测试目录下全文只有一个css语言标记的围栏代码块内容是一个真实的 CSS 类定义.stacked-linear { background: linear-gradient( 217deg, rgb(255 0 0 / 80%), rgb(255 0 0 / 0%) 70.71% ), linear-gradient(127deg, rgb(0 255 0 / 80%), rgb(0 255 0 / 0%) 70.71%), linear-gradient(336deg, rgb(0 0 255 / 80%), rgb(0 0 255 / 0%) 70.71%); }这段代码来源于 MDN 关于层叠多个背景stacked background的示例.stacked-linear通过一次声明叠加三个不同角度217deg、127deg、336deg的线性渐变每个渐变使用带透明通道的现代 CSS 颜色语法rgb(255 0 0 / 80%)以及70.71%的颜色停靠点。文件中代码块起始处保留了一个空行代码内部还混有手工换行、缩进不一致等未格式化痕迹——这正是 Prettier 测试夹具fixture的典型形态故意提供格式混乱的输入用来验证格式化器的输出是否稳定、是否符合预期。需要强调的是该文件本身不是 Prettier 的文档或配置而是驱动测试引擎的输入样例它对应的预期输出保存在快照文件中见下文。它与同目录下的mdn-background-1.md多重背景简写、mdn-background-6.md径向渐变叠加、mdn-background-9.md锥形渐变共同构成一组覆盖 CSSbackground系列语法的格式化测试矩阵。测试如何驱动format.test.js 与快照文件该样例由 tests/format/markdown/code/format.test.js 中的一行代码驱动runFormatTest(import.meta, [markdown], { proseWrap: always });其含义是针对该目录下的所有.md输入文件使用 Prettier 的markdown解析器进行格式化并固定proseWrap: always这一选项组合最后把结果写入快照。运行后得到的预期输出记录在 tests/format/markdown/code/snapshots/format.test.js.snap 中其中针对mdn-background-5.md的快照项完整展示了对应该样例的输入与输出input css .stacked-linear { background: linear-gradient( 217deg, rgb(255 0 0 / 80%), rgb(255 0 0 / 0%) 70.71% ), linear-gradient(127deg, rgb(0 255 0 / 80%), rgb(0 255 0 / 0%) 70.71%), linear-gradient(336deg, rgb(0 0 255 / 80%), rgb(0 0 255 / 0%) 70.71%); }output.stacked-linear { background: linear-gradient(217deg, rgb(255 0 0 / 80%), rgb(255 0 0 / 0%) 70.71%), linear-gradient(127deg, rgb(0 255 0 / 80%), rgb(0 255 0 / 0%) 70.71%), linear-gradient(336deg, rgb(0 0 255 / 80%), rgb(0 0 255 / 0%) 70.71%); }对比输入与输出可以清晰归纳出 Prettier 在这一样例上的三条核心行为 1. **消除代码块内部的首行空行**输入中 css 之后的空行被删除代码从围栏的下一行直接开始。 2. **收紧过长的声明**原本把第一个 linear-gradient(...) 拆成多行、并带有不规则缩进的写法被压缩成单行三个渐变层随后以统一的 4 空格缩进逐层排列形成悬挂缩进hanging indent。 3. **保持语义不变**三个渐变的角度、颜色、透明度与停靠点百分比原样保留格式化只改变排版不改变含义。 也就是说对于 CSS 的多层背景声明Prettier 优先选择层与层之间换行、每层内部尽量单行的布局而不是保留作者手工换行的样式。该输出效果与同一目录下 mdn-background-1.mdbackground 简写含 url(...) 与位置尺寸、mdn-background-6.md多层 radial-gradient 叠加等样例的预期快照一致说明这是 CSS 打印器对逗号分隔值组的通用策略而非针对单个样例的定制逻辑。 ## 代码块嵌入Prettier 如何进入Markdown 中的 CSS Prettier 格式化 Markdown 时并非把围栏代码块当作纯文本原样跳过而是会尝试识别代码块的语言并交给对应的语言打印器处理这一机制位于 [src/language-markdown/embed.js](https://link.gitcode.com/i/e6d0e080175c6e01f99c911fcd913609)当语法树节点类型为 code 时Prettier 根据代码块的 lang 字段推断解析器inferParser再调用对应语言的 format/print 流程把代码块内容转换成文档doc最终嵌入 Markdown 的打印结果中。 对 mdn-background-5.md 而言围栏标记为 css因此该代码块会交给 CSS 语言子系统[src/language-css](https://link.gitcode.com/i/6a7627b9a6826954af226a6030f8c283)处理其解析器为 postcss[src/language-css/parser-postcss.js](https://link.gitcode.com/i/e0163991c0c0062d3cdc6b27a9434520)打印器为 [src/language-css/printer-postcss.js](https://link.gitcode.com/i/d8d1e908985be4722d84450c717fab26)。CSS 打印器负责把 background 声明中的多层渐变重排为悬挂缩进结构。从 [src/language-css/print/comma-separated-value-group.js](https://link.gitcode.com/i/5fc21bec428c99cb7dd95743c58c28be) 与 [src/language-css/print/css-declaration.js](https://link.gitcode.com/i/feda6b9e6b0977ddc06b23008eb1dff4) 的源码结构可以看到逗号分隔的多值组如多层背景会被放入带缩进的 group/fill 结构中内容超宽时在逗号处换行并缩进内容不超宽时保持单行。这正是快照输出中每层渐变单行、层间换行的排版来源。 值得注意的是代码块内部代码的排版还受到 Markdown 层面的约束围栏代码块在 Markdown 中属于原始内容其内部行通常不参与 proseWrap 的文本换行proseWrap 只作用于普通段落文字因此代码块内的换行完全由 CSS 打印器依据 printWidth默认 80决定。测试中显式设置 proseWrap: always 并不会改写代码块内的代码布局它只影响代码块之外的散文段落。 ## 实操验证如何在本地复现该格式化效果 如果你想在自己环境里复现 mdn-background-5.md 的格式化输出可以按以下步骤操作Prettier 仓库本身是只读的下述命令不会修改仓库文件只用于验证行为 1. 在仓库根目录安装依赖并确认 Prettier 可运行 bash yarn install新建一个临时 Markdown 文件例如/tmp/bg.md内容复制自 tests/format/markdown/code/mdn-background-5.md然后执行yarn prettier /tmp/bg.md --parser markdown --prose-wrap always终端输出的结果应与上面快照中的output部分一致代码块空行消失、三层渐变以 4 空格缩进逐层排列。若希望观察printWidth的影响可加大宽度再格式化一次yarn prettier /tmp/bg.md --parser markdown --print-width 200当行宽足够时整个background声明会尽量压成单行验证宽度决定换行点的机制。运行该目录的完整测试以确认快照与当前实现一致yarn jest tests/format/markdown/code/format.test.js若实现行为与快照不符Jest 会输出 diff这既是回归测试的用法也能帮助你理解格式化器的输出边界。此外可以在 tests/format/markdown/code 目录下横向对比mdn-background-1.md、mdn-background-6.md、mdn-background-9.md及其快照它们分别覆盖了background简写含url()与位置/尺寸、radial-gradient叠加、conic-gradient等场景与mdn-background-5.md一起构成对 CSS 背景语法格式化行为的完整测试样本是理解同一类语法在不同写法下的统一输出风格的最佳材料。小结以mdn-background-5.md为窗口可以看到Prettier 对 Markdown 中内嵌 CSS 代码块的处理是一条完整的流水线Markdown 打印器识别代码块语言 → 调用 src/language-markdown/embed.js 的嵌入机制 → 交给 src/language-css 的 postcss 打印器 → 依据printWidth与逗号分隔值组策略输出统一排版。快照测试tests/format/markdown/code/format.test.js 与 tests/format/markdown/code/snapshots/format.test.js.snap为这一行为提供了可重复验证的证据。理解了这条链路后你就能准确预测 Prettier 会如何重排 Markdown 文档中的 CSS 示例并据此设计符合团队规范的文档排版方式。赞分享开发工具格式化CLI【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址https://gitcode.com/gh_mirrors/pr/prettier点击查看免费下载相关推荐Prettier 如何格式化 Markdown 中的 CSS 代码块以 MDN plaid-gradient 多背景渐变用例为例Prettier 如何格式化 Markdown 中的 CSS 代码块以 MDN plaid gradient 多背景渐变用例为例 本文基于 Prettier开发工具格式化CLIPrettier 如何格式化 Markdown 代码块内的 CSS以 mdn-background-4 测试用例为例Prettier 如何格式化 Markdown 代码块内的 CSS以 mdn background 4 测试用例为例 在 Prettier 中Markdow开发工具格式化CLIPrettier 如何格式化 Markdown 内嵌 CSS 代码块以 mdn-background-3 测试用例为引Prettier 如何格式化 Markdown 内嵌 CSS 代码块以 mdn background 3 测试用例为引 Markdown 文档中的 CSS 代开发工具格式化CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表