介绍

在编写技术文档时,特别是样式指南或用户界面规范,常常需要显示调色板。AsciiDoc 虽然在文档方面非常强大,但没有提供原生语法来展示颜色样本。本文探讨了这一问题,并提出了一种基于 HTML 注入的优雅解决方案。

问题

使用上下文

想象一下,你正在记录一个 Web 应用程序主题的 CSS 变量。你需要:

  1. 列出十六进制颜色代码

  2. 显示每种颜色的视觉预览

  3. 保持源文档的可读性

  4. 确保与JBake等静态站点生成器兼容

use case diagram

可能的方法

可以考虑多种方案在 AsciiDoc 文档中显示颜色:

component diagram

选项 1 : Unicode 字符

使用Unicode字符作为`■`(■) 简单但有限:

* ■ --accent-color: #7952b3 (violet Bootstrap)

限制 : 无法控制颜色,依赖系统字体。

选项2:外部图像

为每种颜色创建 PNG 或 SVG 图像:

* image:colors/violet.svg[width=16] --accent-color: #7952b3

限制 : 维护繁重,文件增多,没有自动同步。

选项 3 : 自定义 CSS 角色

定义 CSS 类并通过 AsciiDoc 角色应用它们:

* [.color-violet]##■## --accent-color: #7952b3

Limitations : 需要外部样式表,预先定义所有可能的颜色。

选项 4 : HTML注入(已采纳的解决方案)

使用宏``用于注入带有内联样式的HTML:

* pass:[<span style="display:inline-block;width:1em;height:1em;
background:#7952b3;vertical-align:middle;margin-right:0.5em"></span>]
--accent-color: #7952b3 (violet Bootstrap)

解决方案:HTML 注入,带有

工作原理

宏``AsciiDoc的功能允许插入不会被AsciiDoc处理器解释的原始内容。这使我们能够直接注入带有内联CSS样式的HTML。

Failed to generate image: PlantUML preprocessing failed: [From <input> (line 2) ]

@startuml
participant "文档
^^^^^
 Syntax Error? (Assumed diagram type: sequence)

@startuml
participant "文档
AsciiDoc" as doc
participant "处理器
AsciiDoc" as processor
participant "pass:[] 宏" as pass
participant "HTML
最终" as html

doc -> processor : Analyse document
processor -> pass : Détecte pass:[]
pass -> processor : Retourne HTML brut
processor -> html : Insère sans transformation
html -> html : Navigateur applique styles
@enduml

实现

这是要注入的HTML结构:

<span style="display:inline-block;
             width:1em;
             height:1em;
             background:#7952b3;
             vertical-align:middle;
             margin-right:0.5em">
</span>

CSS属性的解释

属性 功能

display:inline-block

�允许设置 width/height 同时保持在行内流中

width:1em; height:1em

方块的大小相对于字体的大小(响应式)

background:#7952b3

要显示的颜色(根据您的需求可变)

vertical-align:middle

将方块与相邻文本对齐

margin-right:0.5em

正方形与文本之间的间距

完整示例

以下是一个记录主题调色板的示例:

== Thème Clair

* pass:[<span style="display:inline-block;width:1em;height:1em;background:#f8f9fa;border:1px solid #ccc;vertical-align:middle;margin-right:0.5em"></span>] --bg-primary: `#f8f9fa` (blanc cassé)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#212529;vertical-align:middle;margin-right:0.5em"></span>] --text-primary: `#212529` (noir très foncé)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#7952b3;vertical-align:middle;margin-right:0.5em"></span>] --accent-color: `#7952b3` (violet Bootstrap)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#61428f;vertical-align:middle;margin-right:0.5em"></span>] --accent-hover: `#61428f` (violet plus foncé)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#ffffff;border:1px solid #ccc;vertical-align:middle;margin-right:0.5em"></span>] --card-bg: `#ffffff` (blanc)

谁生成以下渲染:

亮色主题

  • --bg-primary:`#f8f9fa`(米白色)

  • --text-primary:`#212529`(极深的黑色)

  • --accent-color:`#7952b3`(紫色 Bootstrap)

  • --accent-hover:`#61428f`( 更深的紫色 )

  • --card-bg:`#ffffff`(白色)

优化与最佳实践

管理浅色

对于非常浅的颜色(白色,非常浅的灰色),添加一个边框以使其在白色背景上可见:

<span style="display:inline-block;width:1em;height:1em;
background:#ffffff;border:1px solid #ccc;
vertical-align:middle;margin-right:0.5em"></span>

灰色边框 (border:1px solid #ccc) 允许在白色背景上勾勒出白色方框。

调整方块的大小

您可以根据需要调整方块的大小:

* pass:[<span style="display:inline-block;width:1.5em;height:1.5em;background:#7952b3;vertical-align:middle;margin-right:0.5em"></span>] Grand carré
* pass:[<span style="display:inline-block;width:0.8em;height:0.8em;background:#7952b3;vertical-align:middle;margin-right:0.5em"></span>] Petit carré

单元的使用`em`确保正方形适应字体大小。

创建变体

对于特定需求,您可以创建不同的形式:

彩色圆

* pass:[<span style="display:inline-block;width:1em;height:1em;background:#7952b3;border-radius:50%;vertical-align:middle;margin-right:0.5em"></span>] Cercle violet

带有彩色边框的正方形

* pass:[<span style="display:inline-block;width:1em;height:1em;background:#ffffff;border:3px solid #7952b3;vertical-align:middle;margin-right:0.5em"></span>] Bordure violette

解决方案架构

architecture diagram

�优势和局限

优势

  • 自主性:不依赖于外部文件

  • �✓ 可移植性 : 可与所有 AsciiDoc 处理器一起工作

  • ✓ 同步 : 颜色代码直接位于 HTML 中

  • �✓ Flexibilité : 完全自定义样式

  • ✓ 维护 : 十六进制代码的简单修改

  • ✓ JBake 兼容性 : 与静态站点生成器完美配合

限制

  • �✗ 冗长 : AsciiDoc 源文件中的重复 HTML 代码

  • ✗ 源文档可读性 : 源文档较不精简

  • ✗ Accessibilité : 没有原生的替代文本(需要手动添加)

改善无障碍

为了让方块对屏幕阅读器可访问:

* pass:[<span role="img" aria-label="Couleur violet Bootstrap"
style="display:inline-block;width:1em;height:1em;background:#7952b3;
vertical-align:middle;margin-right:0.5em"></span>]
--accent-color: `#7952b3` (violet Bootstrap)

属性`role="img"` et `aria-label`使辅助技术能够理解和描述视觉内容。

具体示例:主题文档

这里有一个完整的示例,记录了多个主题:

= Guide des couleurs de l'application

== Thème Clair (`:root`)

* pass:[<span style="display:inline-block;width:1em;height:1em;background:#f8f9fa;border:1px solid #ccc;vertical-align:middle;margin-right:0.5em"></span>] --bg-primary: `#f8f9fa` (blanc cassé)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#212529;vertical-align:middle;margin-right:0.5em"></span>] --text-primary: `#212529` (noir très foncé)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#7952b3;vertical-align:middle;margin-right:0.5em"></span>] --accent-color: `#7952b3` (violet Bootstrap)

== Thème Sombre (`[data-bs-theme="dark"]`)

* pass:[<span style="display:inline-block;width:1em;height:1em;background:#212529;vertical-align:middle;margin-right:0.5em"></span>] --bg-primary: `#212529` (noir très foncé)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#ffffff;border:1px solid #999;vertical-align:middle;margin-right:0.5em"></span>] --text-primary: `#ffffff` (blanc)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#0d6efd;vertical-align:middle;margin-right:0.5em"></span>] --accent-color: `#0d6efd` (bleu Bootstrap)

== Thème Contraste Élevé (`[data-bs-theme="high-contrast"]`)

* pass:[<span style="display:inline-block;width:1em;height:1em;background:#000000;vertical-align:middle;margin-right:0.5em"></span>] --bg-primary: `#000000` (noir)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#ffffff;border:1px solid #000;vertical-align:middle;margin-right:0.5em"></span>] --text-primary: `#ffffff` (blanc)
* pass:[<span style="display:inline-block;width:1em;height:1em;background:#00ff00;vertical-align:middle;margin-right:0.5em"></span>] --accent-color: `#00ff00` (vert vif)

结论

HTML注入通过宏``AsciiDoc 提供了一种优雅且实用的解决方案,用于在技术文档中显示颜色样本。尽管这种方法略显冗长,但它确保了最大程度的可移植性和简化的维护。

此技术不需要任何外部配置,也不需要额外的样式表,并且可以在 JBake 和所有标准的 AsciiDoc 处理器上立即使用。

一旦您创建了第一个彩色方块,只需复制粘贴 HTML 代码并修改十六进制代码,即可快速创建完整的调色板。

该技术可扩展至需要自定义视觉渲染的其他使用场景:图标、徽章、简单图表,或所有需要精确控制样式的视觉元素。

资源

相关文章