页面属性

某些AsciiDoc文档属性为Antora页面提供元数据(用于UI模板)或控制Antora如何处理页面。我们将这些称为页面属性。页面属性有三种类型:自定义、预定义和内在的。本页面解释了每种页面属性类型的目的,它们如何定义以及如何通过UI模型从UI模板中访问它们。

目的和结构

页面属性主要是提供元数据,无论该元数据是为Antora本身、UI模板、用户还是搜索索引。通过定义页面属性,您可以存储有关页面的其他信息,然后可以在整个站点中访问和使用这些信息。

页面属性的定义方式与任何其他AsciiDoc文档属性相同,通常使用文档头部的属性条目。页面属性的不同之处在于属性的名称必须以page-开头(例如,page-category)。page-前缀的存在使Antora能够将其识别为页面属性。

如果您想知道是否需要添加page-前缀,请问自己是否需要从UI模板中访问该属性。如果答案是肯定的,则需要该前缀。否则,前缀是不必要的。

以下是定义两个页面属性的页面示例:

= 页面标题
:page-category: DevOps
:page-edition: Enterprise

主要内容。

page-前缀旨在为Antora和作者提供关于哪些属性组成页面元数据的提示。通过标准化page-前缀,Antora能够将页面属性与AsciiDoc中的众多内置和内在属性或由AsciiDoc处理器定义的属性隔离开。该前缀还将页面属性与用于在页面或站点中存储可重用内容的内部属性(也称为自定义内容属性)隔离开来。

定义自定义页面属性

要定义页面属性,您需要将属性条目添加到页面头部,并以page-开头命名。重要的是要在头部定义属性条目,否则页面属性将无法找到。

以下是定义页面属性的属性条目示例:

= 页面标题
:page-name-goes-here: 值在这里

此页面属性的名称是name-goes-herepage-前缀加上自定义名称name-goes-here)。其值为值在这里

页面属性的名称必须遵守文档属性的命名规则。值可以留空,也可以是字符串值。如果值不为空,则必须与结束冒号(:)至少相隔一个空格。

由于页面属性只是特殊的AsciiDoc文档属性,因此它们也可以在Antora playbook中全站范围或在组件版本描述符中每个组件版本中定义。

提升非页面属性

如果要将现有文档属性中的信息作为页面属性提供,必须将该属性提升为页面属性。您可以使用属性引用将文档属性提升为页面属性。

例如,假设您在页面或站点上定义了属性product-name。您可以使用以下属性条目将其提升为页面属性:

= 页面标题
:product-name: 我的产品名称
:page-product-name: {product-name}

属性引用会立即解析,因此名为page-product-name的页面属性现在与名为product-name的文档属性共享相同的值。

配置预定义页面属性

在Antora中,某些页面属性会受到特殊对待。这些页面属性具有保留名称,但接受用户定义的值,用于向Antora传达有关页面的信息。示例包括page-aliasespage-layoutpage-partial

page-aliases属性允许您配置当前页面的备用资源ID。例如,要声明页面的旧名称,您可以使用:

= 页面标题
:page-aliases: old-page-name.adoc

与自定义页面属性不同,page-aliases属性要求值符合特定的语法(即,资源ID的逗号分隔列表)。请参阅页面别名以了解page-aliases属性以及如何使用它来保留对重命名、移动或删除页面的引用。

page-layout属性允许您指定要应用于当前页面的UI模板。例如,要将home布局应用于当前页面,您可以使用:

= 首页
:page-layout: home

请参阅页面布局以了解page-layout属性以及如何使用它来定义应用于页面的UI布局。

未来可能会添加其他预定义页面属性,以允许配置类似的功能。

从UI模板访问页面属性

页面属性的主要作用之一是通过UI模型将有关页面的元数据传递给UI模板。然后,UI模板可以以各种方式使用页面属性提供的信息,从在发布页面(即HTML)中填充元数据到在UI中切换或配置行为。

让我们看一个例子。默认UI允许您使用名为toclevels的页面属性(即在定义时为page-toclevels)配置侧边栏TOC的深度。

您可以在playbook(或组件描述符)中全局设置此属性。

asciidoc:
  attributes:
    page-toclevels: 3@

添加尾随的@是为了使该属性仍然可以在页面的头部被覆盖。例如:

= 页面标题
:page-toclevels: 2

页面属性可以通过page.attributes属性在UI模型中访问。该属性的值是属性的映射。

要在UI模板中访问page-toclevels属性的值,您将使用:

{{page.attributes.toclevels}}

那么page-前缀去哪了?

当页面属性提升到UI模型时,其名称中的page-前缀被删除。这就是为什么我们经常使用其简短名称(例如toclevels)来引用页面属性的原因。page-前缀充当命名空间,用于将属性标识为页面属性。因此,名为page-toclevels的页面属性在UI模型中变为toclevels(例如page.attributes.toclevels)。

让我们看另一个示例,展示默认UI如何使用页面属性来控制分页。通常,您会在playbook或组件描述符中全局设置此属性。但是,这一次,我们硬编码设置属性,以便页面无法关闭它。

asciidoc:
  attributes:
    page-pagination: ''

现在,在footer-scripts.hbs部分模板中,我们可以检查此属性是否已设置,并在设置时包含分页控件。

{{#unless (eq page.attributes.pagination undefined)}}
<nav class="pagination">
...
</nav>
{{/unless}}

请注意,我们检查值是否不等于undefined,而不是检查其是否为真值。这是因为JavaScript中的空值为假值,因此我们必须使断言更具体。在子句内,模板可以检查属性是否具有next或prev值,这意味着应关闭相反方向。

属性名称上的page-前缀是将其提升到UI模型的关键。所有其他文档属性仍然可以从UI模型中访问,只是不那么容易。以下是如何从UI模型引用非页面属性的示例:

{{#with (resolvePage page.relativeSrcPath model=false)}}
{{./asciidoc.attributes.policy-number}}
{{/with}}

page.relativeSrcPath值传递给内置的resolvePage助手将解析为当前页面。model=false选项指示助手返回解析页面的虚拟文件而不是UI模型。从那里,所有AsciiDoc属性都可以通过嵌套的asciidoc.attributes属性访问。

内置页面属性

Antora在运行时自动设置了许多只读的内置页面属性,这些属性是从当前页面的现有元数据派生的。例如,可以从page-component-name属性中读取当前组件的名称。

这些属性在加载页面或导航文件时(即解析时)被定义。当组件描述符中的属性解析时,它们尚未被分配,因此对组件描述符不可见。

内置页面属性在内置属性上列出。这些属性是只读的,因此不应在页面头部覆盖它们的值。