/ Book 模式 / 扩展配置

sena.toml 中的 [extensions] 表用于配置模板、静态资源、注入内容以及外部插件——这是 Book 模式下自定义构建行为的主要入口。

字段类型说明
templateStringHTML 模板文件路径,所有页面都会套用该模板
assetsArray[String]Glob 匹配模式,用于指定需要原样复制到输出目录的静态资源
inject_headArray[String]注入到每个页面 <head> 中的原始 HTML 片段
inject_bodyArray[String]注入到每个页面 </body> 结束前的原始 HTML 片段
use_cssArray[String]直接内联的 CSS 代码,每个元素会生成一个独立的 <style> 标签,插入到 </head> 之前
use_jsArray[String]直接内联的 JavaScript 代码,每个元素会生成一个独立的 <script> 标签,插入到 </body> 之前
import_cssArray[String]外部 CSS 文件的路径或 URL,以 <link> 的形式引入,而非内联
import_jsArray[String]外部 JavaScript 文件的路径或 URL,以 <script src> 的形式引入,而非内联
preprocessorsArray[String]依次执行的外部预处理命令,作用于原始 Markdown 文本
transformersArray[String]依次执行的外部转换命令,作用于已解析的 Markdown AST

Tip

运用 `template`、`assets`、`use_*` 等字段可以高度定制页面,详细说明请参见 [页面定制](./pages.md)。

template 字段指向的文件决定了页面的整体 HTML 结构。模板语法与变量系统的完整说明请参见 模板引擎

assets 使用 Glob 匹配需要原样复制的文件(如图片、字体等),这些文件不会经过 Markdown 处理,只是从源目录复制到 dest 目录下的对应位置。Glob 语法的完整说明请参见 Glob 匹配

use_cssuse_jsimport_cssimport_js 都是用于给页面添加样式或脚本,但两者的语义完全不同:

  • use_cssuse_js 中的每一项都是代码本体,会被原样包裹进 <style><script> 标签直接嵌入页面中。

  • import_cssimport_js 中的每一项都是文件路径或 URL,会以 <link><script src> 的形式引用外部资源。

选择哪一种取决于你的使用场景:内联适合少量、页面强相关的样式或脚本;外部引入适合体积较大、或希望利用浏览器缓存的公共资源。

Note

当引用外部资源时,如果是本地资源,请确保其包含在 `assets` 中,否则相应资源不会被复制到输出目录。

inject_headinject_body 允许你插入任意原始 HTML 片段——如统计脚本、Open Graph 元标签、第三方组件、Google Analytics 的初始化代码等。

理论上额外引用内容借助 use_cssuse_jsimport_cssimport_js 即可满足大部分需求,例外的是 use_* 引入 CSS 或 JavaScript 代码的生成的 HTML 位于 import_* 导入 CSS 或 JavaScript 资源生成的 HTML 之后,而某些 JavaScript 库要求引入前得先有配置代码,故此即可使用 inject_* 自由地插入这些内容。如 MoPress 对 MathJax 功能的处理:

self.extensions.inject_head.push(
  (
    #|<script>MathJax={tex:{inlineMath:[['$','$']],displayMath:[['$$','$$']]}};</script>
    #|<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.min.js"></script>
  ),
)

preprocessorstransformers 分别对应两个不同的处理阶段:

  • 预处理器(preprocessors)在 Markdown 文本被解析为 AST 之前执行,操作对象是原始文本,适合处理自定义语法(如将某种特殊标记转换为标准 Markdown 或 HTML)。

  • 转换器(transformers)在 Markdown 文本被解析为 AST 之后执行,操作对象是结构化的语法树,适合做更精确的结构级修改(如重写某种特定的节点)。

两者都以数组形式配置,数组中的每一项是一条外部命令;命令会按数组顺序依次执行,前一个命令的输出会作为后一个命令的输入。这些命令与 mopress 之间通过标准输入、标准输出上的 JSON 协议通信,完整说明请参见 外部插件协议;更多插件形式(不局限于外部进程)请参见 插件总览