页面属性
某些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处理器定义的属性隔离开。该前缀还将页面属性与用于在页面或站点中存储可重用内容的内部属性(也称为自定义内容属性)隔离开来。
定义自定义页面属性
配置预定义页面属性
在Antora中,某些页面属性会受到特殊对待。这些页面属性具有保留名称,但接受用户定义的值,用于向Antora传达有关页面的信息。示例包括page-aliases
、page-layout
和page-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
属性中读取当前组件的名称。
这些属性在加载页面或导航文件时(即解析时)被定义。当组件描述符中的属性解析时,它们尚未被分配,因此对组件描述符不可见。
内置页面属性在内置属性上列出。这些属性是只读的,因此不应在页面头部覆盖它们的值。