Quarkus style and content guidelines

AsciiDoc syntax

Quarkus 文档使用 AsciiDoc 语法。以下链接提供了有关 AsciiDoc 语法和一般约定的背景信息。

Language and grammar

使用美式英语编写清晰、简洁且一致的技术信息。面向全球受众,牢记本地化、翻译、包容性和多样性。尝试使用以下语法风格:

Sentence length

较短的句子更容易阅读和翻译。尝试每个句子使用少于 32 个单词。

Website publication

该存储库中的内容会发布到 Quarkus.io website 中。

  • 从主分支构建的文档将在每晚发布(main-SNAPSHOT)。

  • 其他分支的文档将在发布时发布。

Titles and headings

无论内容类型如何,确保文档中的主要标题和任何标题:

  • 以目标为导向,并使用听众的语言和关键词

  • 具有描述性,避免使用填充词

  • 每行使用 3-12 个单词和 50-80 个字符以优化搜索引擎中的可查找性

  • 采用句子大小写风格

您的标题必须遵循适用于 Quarkus 内容类型的特定指导,如下表所述:

Table 1. Title guidance for different Quarkus content types
Content type Should …​ Good example Bad example

Concept

  • 以表示概念或主题的名词开头* 切勿以主动语态动词开头,例如配置、安装或启动等动作词语* 完成隐含句子:了解……

在 Quarkus 中的安全性和认证机制

在 Quarkus 中发现反应式 SQL 客户端

How-To Guide

  • 以命令式动词形式开始使用主动语态动词,例如“创建一个……”或“保护一个……”* 以动作导向或任务导向为目标,而不是以功能导向为目标* 完成隐含句子:如何……

使用 WebAuthn 身份验证保护您的 Quarkus 应用程序

在 Quarkus 中应用 WebAuthn 身份验证

Reference

  • 使用名词短语对文档的内容进行简要总结* 不会包含“参考”一词* 完成隐含句子:关于……

Hibernate Reactive API 配置属性

配置 Hibernate Reactive API 配置属性的参考指南

Tutorial

  • 以命令式动词形式开始使用主动语态动词,例如“创建一个……”或“保护一个……”* 说明用户将完成什么任务,重点关注于关键主题或已演示的活动* 以动作导向或任务导向为目标,而不是以功能导向为目标* 以学习模式中用户的需求为导向* 完成隐含句子:在本教程中,您将……

通过使用快速入门示例在 JVM 模式下创建 Quarkus 应用程序

Creating an App

File conventions

Source locations

  • AsciiDoc 文件位于 docsQuarkus GitHub repository 模块中的 src/main/asciidoc 目录中。

  • 配置文档由 Java 源文件中的 JavaDoc 注释生成。

  • Java、YAML 及其他源文件也可以由 AsciiDoc 文件引用。

Output locations

Configuration references

Configuration reference documentation is generated from Javadoc comments discovered in MicroProfile Config source files. These generated files are in target/asciidoc/generated/config/ (from the project root).

AsciiDoc output to HTML

AsciiDoc processing creates HTML files in docs/target/generated-docs/.

Templates

使用适合内容类型的相应模板创建新文档文件:

Concepts

Use docs/src/main/asciidoc/_templates/template-concept.adoc

How-To Guides

Use docs/src/main/asciidoc/_templates/template-howto.adoc

Reference

Use docs/src/main/asciidoc/_templates/template-reference.adoc

Tutorials

Use docs/src/main/asciidoc/_templates/template-tutorial.adoc

File names

Quarkus 文档使用扁平层次结构。

文件名的大部分内容应为标题的某种表示形式,所有字母都用小写,单词之间用连字符隔开,避免使用符号和特殊字符。

Prefix

Use a common prefix to group-related documents. Documents related to writing and contributing to Quarkus docs share the doc- prefix, for example.

Suffix

Use a suffix that reflects the document type (optional):

  • -concept.adoc for concept documents

  • -howto.adoc for how-to guides

  • -reference.adoc for references

  • -tutorial.adoc for tutorials

Document structure

使用 Quarkus 模板以确保您的内容与首选的 Quarkus 文档结构和样式一致。

Document header

每个文档都应定义一个文档范围属性的标题,每个文档都应至少定义一个 ID 和一个标题,并包含常见的属性(_attributes.adoc)。

[id="doc-reference"] (1)
= Quarkus style and content guidelines (2)
// Common attributes.
// --> No blank lines (it ends the document header)
:project-name: Quarkus
:quarkus-version: ${project.version}
:quarkus-platform-groupid: io.quarkus.platform
// .
:maven-version: ${proposed-maven-version}
:graalvm-version: ${graal-community.version-for-documentation}
:graalvm-docs-version: ${graal-community.tag-for-documentation}
:graalvm-flavor: ${graal-community.image-tag-for-documentation}
:mandrel-flavor: ${mandrel.image-tag-for-documentation}
:surefire-version: ${version.surefire.plugin}
:gradle-version: ${gradle-wrapper.version}
:elasticsearch-version: ${elasticsearch-server.version}
:elasticsearch-image: ${elasticsearch.image}
:opensearch-image: ${opensearch.image}
:infinispan-version: ${infinispan.version}
:infinispan-protostream-version: ${infinispan.protostream.version}
:logstash-image: ${logstash.image}
:kibana-image: ${kibana.image}
:keycloak-docker-image: ${keycloak.docker.image}
:jandex-version: ${jandex.version}
:jandex-gradle-plugin-version: ${jandex-gradle-plugin.version}
:kotlin-version: ${kotlin.version}
:grpc-version: ${grpc.version}
:protoc-version: ${protoc.version}
:gcf-invoker-version: ${gcf-invoker.version}
// Cannot simply use the name 'hibernate-*-version' here as it somehow gets
// overridden to the full version, at least when building locally.
:hibernate-orm-version-major-minor: ${hibernate-orm.majorVersion}.${hibernate-orm.minorVersion}
:hibernate-search-version-major-minor: ${hibernate-search.majorVersion}.${hibernate-search.minorVersion}
// .
:quarkus-home-url: ${quarkus-home-url}
:quarkus-org-url: https://github.com/quarkusio
:quarkus-site-getting-started: /get-started
:quarkus-writing-extensions-guide: /guides/writing-extensions
:quarkus-site-publications: /publications
:quarkus-base-url: ${quarkus-base-url}
:quarkus-clone-url: ${quarkus-base-url}.git
:quarkus-archive-url: ${quarkus-base-url}/archive/main.zip
:quarkus-blob-url: ${quarkus-base-url}/blob/main
:quarkus-tree-url: ${quarkus-base-url}/tree/main
:quarkus-issues-url: ${quarkus-base-url}/issues
:quarkus-images-url: https://github.com/quarkusio/quarkus-images/tree
:quarkus-chat-url: https://quarkusio.zulipchat.com
:quarkus-mailing-list-subscription-email: quarkus-dev+subscribe@googlegroups.com
:quarkus-mailing-list-index: https://groups.google.com/d/forum/quarkus-dev
:quickstarts-base-url: ${quickstarts-base-url}
:quickstarts-clone-url: ${quickstarts-base-url}.git
:quickstarts-archive-url: ${quickstarts-base-url}/archive/main.zip
:quickstarts-blob-url: ${quickstarts-base-url}/blob/main
:quickstarts-tree-url: ${quickstarts-base-url}/tree/main
// .
:hibernate-orm-docs-url: https://docs.jboss.org/hibernate/orm/{hibernate-orm-version-major-minor}/userguide/html_single/Hibernate_User_Guide.html
:hibernate-orm-dialect-docs-url: https://docs.jboss.org/hibernate/orm/{hibernate-orm-version-major-minor}/dialect/dialect.html
:hibernate-search-docs-url: https://docs.jboss.org/hibernate/search/{hibernate-search-version-major-minor}/reference/en-US/html_single/
// .
:amazon-services-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-amazon-services/dev/index.html
:config-consul-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-config-extensions/dev/consul.html
:hibernate-search-orm-elasticsearch-aws-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-hibernate-search-extras/dev/index.html
:neo4j-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-neo4j/dev/index.html
:vault-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-vault/dev/index.html
:vault-datasource-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-vault/dev/vault-datasource.html
:micrometer-registry-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-micrometer-registry/dev/index.html
:quarkus-migration-guide: https://github.com/quarkusio/quarkus/wiki/Migration-Guides[Migration Guides]
// .
:create-app-group-id: org.acme
:create-cli-group-id: {create-app-group-id}
// .
// for rendering the final website the attributes are set in the appropriate
// location based on source versions in https://github.com/quarkusio/quarkusio.github.io/
// they are duplicated here to ease the preview when editing in the IDE
// --> No blank lines (it ends the document header)
:idprefix:
:idseparator: -
:icons: font
:generated-dir: ../../../target/quarkus-generated-doc
:doc-examples: ./_examples
:imagesdir: ./images
:includes: ./_includes
:toc: preamble
:iokays-category: quarkus
:iokays-path: modules/ROOT/pages/doc-reference.adoc (3)
:diataxis-type: {type} (4)
:categories: contributing (5)
1 将文件名用作文档的 ID。
2 按照 Titles and headings中的指南定义文档标题。
3 Include common document attributes.
4 指定二轴类型: concepthowtoreferencetutorial
5 Categories(以逗号隔开)指定相关信息。

Other common document header attributes

:extension-status: preview

Use this attribute to flag special types of content. Valid values: experimental, preview, stable (not usually used), and deprecated.

:summary: <text>

Use the summary to provide a concise (26 words or less) description of the document. The value of this attribute is used in tiles or other descriptions on the website and is not required in newer diataxis-styled docs, as outlined in Abstracts (preamble). If not present, the first sentence of the abstract is automatically used to generate the tile summary.

处理文件范围属性时,请注意空格。文件头以第一个空行结束。

Abstracts (preamble)

正文中的第一段被视为摘要,也称为导言。添加一个简短的描述,以帮助您的受众快速找到并理解页面目的和意图。摘要的第一句提供了摘要,并会自动添加到 Quarkus guides homepage中的瓷砖上。

尝试使用以下准则来编写摘要:

  • *User oriented:*包含用户熟悉的术语和关键字。

  • *Concise:*避免自反表达式和填充词,例如:

    • "This document.."

    • "This tutorial…​"

    • "The following…​"

  • *Brief:*不超过三句话。

确保第一句话解释了内容的价值以及一些好处,且不超过 26 个词。

如果第一句话太长或无法简化为适合网站瓷砖,您可以在文件头属性中定义 `:summary:`属性以达到此目的。有关更多信息,请参阅 Other common document header attributes

Semantic line breaks

段落、列表和表中的文本应分成更易于查看的部分Rhodes[role="bare"]https://rhodesmill.org/brandon/2012/one-sentence-per-line/]。在每个句子的末尾开始新的一行,并在子句之间的自然中断处拆分句子本身。

Sections

部分标题应采用句子大小写书写,而不是标题大小写。

从标题开始您的文档,在 AsciiDoc 中,标题定义为 = Level 0`标题。在适当的地方,将您的内容划分为子部分,在 AsciiDoc 中,子部分定义为 `== Level 1`到 `====== Level 5。请勿跳过任何级别。

尽可能避免深度嵌套 (====== Level 4====== Level 5)。如果您最终得到深度嵌套的部分,请考虑以下事项:

  • 此信息是否放在正确的位置?例如,如果这是一个参考,是否应该将此部分内容移动到一个概念文档或操作指南中?

  • 是否可以对内容进行重新组织,以简化其使用?

关于内容类型和组织的更多信息,请参阅 Quarkus documentation content types

通常, url macros优于空白链接或自动链接。为链接提供人类可读文本,尤其是在链接包含在其他文本中间时。

A URL Macro link with attributes

URL 宏还支持 additional attributes,这可能很相关,比如在另一个窗口中打开一个链接。

https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/[AsciiDoc Syntax Quick Reference,window=_blank,opts=nofollow]

Cross-references

Quarkus 文档是从不同环境中的源构建的。

Cross-reference source attributes

在交叉引用中使用属性, 从而确保我们的文档可以在这些环境中构建。

Table 2. Cross-reference source attributes
Attribute Description

{code-examples}

相对路径到包含收集的示例源文件的目录

./_examples

相对路径到文档指南的源示例

../../../target/quarkus-generated-doc

相对路径到生成的配置 `*.adoc`文件

_images

相对路径到包含图像的目录

./_includes

相对路径到包含局部/可重用内容的目录

在交叉引用内容时, 始终使用交叉文档 `xref:`语法并为您链接提供人类可读的标签。

Cross-reference example
xref:doc-concept.adoc[Quarkus Documentation concepts] 1
1 交叉引用从 xref:`开始, 并提供可读的说明: `[Quarkus Documentation concepts].

Anchors for in-file and cross-file navigation

  • 为创建锚定 ID, 使用小写字符和 `-`分隔每个单词, 并将 ID 括在 `[[]]`中, 如下例所示。[source, asciidoc]

[[title-heading]]
== Title heading
  • 为调用在同一文件中创建的锚点, 请在 `&lt;&lt;&gt;&gt;`xref 宏中插入锚定 ID。[source, asciidoc]

<<title-heading>>
  • 为创建带有自定义 URL 说明示例的锚点, 请指定锚定 ID 并用 `,`分隔所需的名称, 且无空白字符。[source, asciidoc]

<<title-heading,Title heading description that fits the context of your content>>

不要在逐字标题或章节说明中使用 <<>> 格式,例如 [Title heading]

  • 为从不同文件中调用锚定 ID, 请使用完整文件名和 `#`分隔锚定 ID, 然后指定人类可读的 URL 说明。[source, asciidoc]

xref:<other-file-name>.adoc#title-heading[Title heading]
  • 为引用其他文件, 请使用 xref 宏和完整文件名语法, 始终指定人类可读的 URL 说明。[source, asciidoc]

xref:<name-of-the-file>.adoc[Human-readable label]

关于锚定 ID 的更多详情, 请参阅 "为 Quarkus 文档提供支持" 指南的 Cross-reference in-file and cross-file content by using anchors部分。

Cross-reference phrasing

为确保一致性和上下文清晰性, 根据以下指南构建您的交叉引用短语:

  • 提供到该部分的直接超链接, 使用上一节中 `xref`的指导。

  • 将章节的完整标题规范为句首字母大写。

  • 在章节标题前面添加定冠词“the”,并在标题后直接指定“章节”。

  • 在指南标题前面添加定冠词“the”和“Quarkus”,除非标题中已包含“Quarkus”一词。

  • 将指南标题插入双引号中,并在标题后直接指定“指南”。

  • 如果需要上下文,则以以下短语开头:

    • “有关 …​ 的更多信息”

Table 3. Correct and incorrect cross-reference phrases
Correct Incorrect

有关更多信息,请参阅 Quarkus “使用 Hibernate Validator 进行验证”指南的 Configuring the ValidatorFactory 部分。

有关更多信息,请参阅 VALIDATION WITH HIBERNATE VALIDATOR guide 的“配置 ValidatorFactory”部分。

有关更多信息,请参阅 Quarkus “应用程序数据缓存”指南的 Generating a cache key with CacheKeyGenerator 部分。

有关更多信息,请参阅 Generating a cache key with CacheKeyGenerator

有关更多信息,请参阅 Quarkus “OpenID Connect (OIDC) 授权码流机制”指南的 PKCE-related section

有关更多信息,请参阅 OpenID Connect (OIDC) Authorization Code Flow Mechanism

Reference source code

将源代码和示例包含在文档中有很多方法。

最简单的方法是直接在文件中编写,如下所示:

[source,java]

System.out.println("Hello, World!");


在教程等文档中,你可能希望引用定期构建和测试的源代码。Quarkus 文档构建会将 *-examples/yaml 文件中列出的源文件复制到 target/asciidoc/examples 目录中(从项目根目录开始)的扁平结构中。

examples:
- source: path/to/source/file/SomeClassFile.java 1
  target: prefix-simplified-unique-filename.java 2
1 定义要复制的源路径
2 在将文件复制到 target/asciidoc/examples 目录时要使用的简化目标文件名。

通过这种方式复制的内容由 {code-examples} 源属性引用。源文件中(如果存在)的文本字符串 {{source}} 将被替换为复制中源文件的路径。

Micrometer example
  • 要复制的源文件是:integration-tests/micrometer-prometheus/src/main/java/documentation/example/telemetry/micrometer/tutorial/ExampleResource.java

  • 我们在文档中要使用的目标文件名是:telemetry-micrometer-tutorial-example-resource.java.

  • 源文件和目标文件在 docs/src/main/asciidoc/telemetry-examples.yaml 中声明:[source, yaml]

examples:
- source: integration-tests/micrometer-prometheus/src/main/java/io/quarkus/doc/micrometer/ExampleResource.java
  target: telemetry-micrometer-tutorial-example-resource.java
  • 然后用以下路径引用此源文件中的代码片段:{code-examples}/telemetry-micrometer-tutorial-example-resource.java.

  • 源文件包含以下注释:

// Source: {{source}}
  • 复制的文件包含此注释:

// Source: integration-tests/micrometer-prometheus/src/main/java/io/quarkus/doc/micrometer/ExampleResource.java

Document attributes and variables

Categories

Quarkus 文档被归为以下类别。

Table 4. Categories
Category Description

alt-languages

对其他语言(即 Kotlin 和 Scala)的支持

architecture

Quarkus 运行时和生态系统架构

business-automation

Business automation integrations

cloud

与云服务的集成和支持

command-line

Command Line Applications

compatibility

与其他语言和框架的兼容性

contributing

有关如何为 Quarkus 做贡献的指南和参考。

core

关于 Quarkus 工作原理的信息

data

与在 Quarkus 中使用数据源相关的主题

getting-started

Getting started materials

integration

对集成扩展(Camel)的支持

messaging

与消息系统(如 Kafka、AMQP 或 RabbitMQ)的集成。

miscellaneous

Miscellaneous

native

所有与本机可执行文件相关的内容

observability

用于运行时和应用程序可观测性的扩展和集成

security

Security

serialization

Serialization

tooling

Tooling

web

Web

writing-extensions

Writing Extensions

通过向 document header 中的 categories 属性行添加至少一类来标记您的内容以提高可查找性。要添加多类,请使用逗号分隔的值。例如:

:categories: contributing, data

Quarkus documentation variables

以下变量将外部化随着时间推移而变化的关键信息。此类信息的引用应使用大括号中的变量,{}

以下表中给出了要使用的外部化变量的完整列表:

Table 5. Variables
Property Name Value Description

${project.version}

${project.version}

项目的当前版本。

${quarkus-home-url}

${quarkus-home-url}

项目主页的位置。

https://github.com/quarkusio

https://github.com/quarkusio

项目 GitHub 组织的位置。

${quarkus-base-url}

${quarkus-base-url}

Quarkus GitHub URL 通用基本前缀。

$${quarkus-base-url}.git

$${quarkus-base-url}.git

文档引用的 git clone 中的 Quarkus URL。

$${quarkus-base-url}/archive/main.zip

$${quarkus-base-url}/archive/main.zip

Quarkus URL 到主源存档。

$${quarkus-base-url}/blob/main

$${quarkus-base-url}/blob/main

Quarkus URL 到主 Blob 源树;用于引用源文件。

$${quarkus-base-url}/tree/main

$${quarkus-base-url}/tree/main

Quarkus URL 到主源树根目录;用于引用目录。

$${quarkus-base-url}/issues

$${quarkus-base-url}/issues

Quarkus URL 到问题页。

https://github.com/quarkusio/quarkus-images/tree

https://github.com/quarkusio/quarkus-images/tree

Quarkus URL 到为 Quarkus 提供的容器镜像集。

https://quarkusio.zulipchat.com

https://quarkusio.zulipchat.com

URL of our chat.

quarkus-dev+subscribe@googlegroups.com

quarkus-dev+subscribe@googlegroups.com

用于订阅我们的邮件列表的电子邮件。

https://groups.google.com/d/forum/quarkus-dev

https://groups.google.com/d/forum/quarkus-dev

Mailing list index page.

${quickstarts-base-url}

${quickstarts-base-url}

快速入门 URL 通用基本前缀。

$${quickstarts-base-url}.git

$${quickstarts-base-url}.git

文档引用的 git clone 中的快速入门 URL。

$${quickstarts-base-url}/archive/main.zip

$${quickstarts-base-url}/archive/main.zip

快速入门 URL 到主源存档。

$${quickstarts-base-url}/blob/main

$${quickstarts-base-url}/blob/main

快速入门 URL 到主 Blob 源树;用于引用源文件。

$${quickstarts-base-url}/tree/main

$${quickstarts-base-url}/tree/main

快速入门到主源树根的 URL;用于引用目录。

${graal-community.version-for-documentation}

${graal-community.version-for-documentation}

推荐使用的 GraalVM 版本。

${graal-community.image-tag-for-documentation}

${graal-community.image-tag-for-documentation}

要使用的 GraalVM 的构建器镜像标记,例如 jdk-17