From 3c4b76eff4884d86b681b420d4a6f8b8dc5fb82a Mon Sep 17 00:00:00 2001 From: Sarah White Date: Mon, 16 Mar 2020 12:20:22 -0600 Subject: [PATCH 01/39] move/rename descriptor file; define component version and antora.yml --- docs/modules/ROOT/nav.adoc | 24 ++- .../pages/component-name-and-version.adoc | 167 ++++++++++++++++++ .../pages/component-version-descriptor.adoc | 44 +++++ .../modules/ROOT/pages/component-version.adoc | 23 +++ 4 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 docs/modules/ROOT/pages/component-name-and-version.adoc create mode 100644 docs/modules/ROOT/pages/component-version-descriptor.adoc create mode 100644 docs/modules/ROOT/pages/component-version.adoc diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index 86b5daa04..5f088febd 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -11,15 +11,27 @@ ** xref:install:upgrade-antora.adoc[Upgrade Antora] ** xref:install:supported-platforms.adoc[Supported Platforms] +* Project & File Setup +** xref:component-structure.adoc[Documentation Components and Repositories] +** xref:modules.adoc[Modules, Families, and Subdirectories] +** xref:component-versions.adoc[Component Versions and Branches] + +* Configure Component Versions +** xref:component-version.adoc[What's a Component Version?] +** xref:component-version-descriptor.adoc[What's antora.yml?] +** How are Component Versions Sorted? +** xref:component-name-and-version.adoc[Define a Component Version with antora.yml] +** xref:component-title.adoc[Customize the Title] +** xref:component-display-version.adoc[Customize the Display Version] +** xref:component-prerelease.adoc[Label a Prerelease Version] +** xref:component-attributes.adoc[Assign Attributes to a Component Version] +** xref:component-start-page.adoc[Select a Start Page] +** xref:component-navigation.adoc[Register a Component Version's Navigation Files] +** xref:environment-and-page-attributes.adoc[Built-in Page and Environment Attribute Reference] + * xref:run-antora.adoc[Run Antora] ** xref:run-antora.adoc#cache[About the Cache] ** xref:run-antora.adoc#local-site-preview[Local Preview] ** xref:run-antora.adoc#publish-to-github-pages[Publish to GitHub Pages] ** xref:antora-container.adoc[Run Antora in a Container] ** xref:cli:index.adoc[CLI Reference] - -* File Organization -** xref:component-structure.adoc[Documentation Components and Repositories] -** xref:modules.adoc[Modules, Families, and Subdirectories] -** xref:component-descriptor.adoc[Component Descriptor: antora.yml] -** xref:component-versions.adoc[Component Versions and Branches] diff --git a/docs/modules/ROOT/pages/component-name-and-version.adoc b/docs/modules/ROOT/pages/component-name-and-version.adoc new file mode 100644 index 000000000..7ac8808ca --- /dev/null +++ b/docs/modules/ROOT/pages/component-name-and-version.adoc @@ -0,0 +1,167 @@ += Define a Component Version with antora.yml +//:listing-caption: Example +//:xrefstyle: short +:note-caption: ASSUMPTIONS + +[NOTE] +==== +You understand what a xref:component-version.adoc[component version] is and the purpose of xref:component-version-descriptor.adoc[_antora.yml_]. +==== + +On this page, you'll learn: + +* [x] The requirements an [.path]_antora.yml_ file must meet. +* [x] How to assign a valid value to the `name` key. +* [x] How to assign a valid value to the `version` key. +* [x] How to enter keys and values in an [.path]_antora.yml_ file. + +[#requirements] +== antora.yml requirements + +The component version descriptor file must: + +* be named [.path]_antora.yml_ +* be written in valid YAML +* contain the `name` key and its value +* contain the `version` key and its value +* be stored xref:component-structure.adoc#overview[at the same directory level as the _modules_ directory] + +[#name-key] +== name key + +A component name is assigned in [.path]_antora.yml_ using the `name` key. +The `name` key is required. +The `name` typically represents the name of your project, library, or course (e.g., `fauna`, `rudder`, `nrepl`). + +.antora.yml with defined component name +[source,yaml] +---- +name: colorado +---- + +The value can contain letters, numbers, underscores (`+_+`), hyphens (`-`), and periods (`.`). +The value *cannot* contain spaces. + +TIP: To minimize the likelihood of portability issues between web servers, letters used in the `name` key's value should be lowercase. + +Antora uses the `name` key when interpreting page and resource IDs and generating the URLs for the component version's pages. +It also uses `name` where ever the component's name is displayed in the reference UI unless the xref:component-title.adoc[title key is set]. +The reference UI shows the component name in the xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and +the first breadcrumb position on a component version's pages. + +[#version-key] +== version key + +A version, such as an identifier (e.g., `master`, `stable`), code name (e.g., `jesse`), or number (e.g., `1.0`), is assigned to the `version` key in [.path]_antora.yml_. +The `version` key is required. +The `version` key is used as the version coordinate in page and resource IDs and as the version segment in page URLs. +It's used to xref:component-versions.adoc[sort component versions that have the same name by descending version order] in the reference UI. +When the optional `display_version` key isn't set, the value of `version` is shown in the reference UI's xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and xref:navigation:index.adoc#page-dropdown[page version selector]. + +.antora.yml with defined component version +[source,yaml] +---- +name: colorado +version: '5.6' +---- + +The value can contain letters, numbers, periods (`.`), underscores (`+_+`), and hyphens (`-`) (e.g., `2.8`, `rawhide`) +If the value starts with a number, YAML recommends that it be enclosed in a set of single quote marks (`'`). +The value *cannot* contain spaces. + +TIP: To minimize the likelihood of portability issues between web servers, letters used in the `version` key's value should be lowercase. + +The `version` key isn't related, though it may be similar, to the xref:component-versions.adoc[name of the branch, tag, or directory] where the component version's source files are stored. +See xref:component-versions.adoc#setting-the-version-for-a-branch[Setting the version for a branch] for more examples and xref:component-versions.adoc#versionless-components[Versionless components] to learn how to create a versionless component. + +[#assign-name-and-version] +== Assign a name and version to a component version + +Let's create an [.path]_antora.yml_ file that defines the name and version of a component version. +In this exercise, we'll create a component version for the project _Silver Leaf_. +Its component name will be _silver-leaf_, and its version will be _7.1_. + +. Open a new file in the text editor or IDE of your choice. +. On the first line, type `name`, directly followed by a colon (`:`). +. Insert a blank space after the colon, and then type the value you want to assign to `name`. ++ +[source,yaml] +---- +name: silver-leaf +---- + +. At the end of the value, press kbd:[Enter] to go to the next line. +. Type `version`, directly followed by a colon (`:`), and then a blank space. +. Type the value you want to assign to `version`. +In this example, the value is enclosed in a set of single quote marks (`'`) because it starts with a number. ++ +[source,yaml] +---- +name: silver-leaf +version: '7.1' +---- + +. Save the file as [.path]_antora.yml_ in the parent directory that contains the directories and files you want to assign to this component version. +That is, it should be located adjacent to the [.path]_modules_ directory. + +You've now associated a set of source files with a component version! +When Antora runs, all of the subsequent subdirectories and source files will be assigned the component name `silver-leaf` and the version `7.1`. +These values will also be used as page and resource ID coordinates and in the URLs of the pages generated from the component version's source files. + +[#optional-keys] +== Optional antora.yml keys + +You can assign additional metadata, designate a component version as a prerelease, apply AsciiDoc attributes, and register a component version's navigation list and start page using the component version descriptor. + +[cols="1,3"] +|=== +|Key |Description + +|xref:component-attributes.adoc[asciidoc] +|Accepts the `attributes` key and its nested list of `key: value` pairs. + +|xref:component-attributes.adoc[attributes] +|Requires the `asciidoc` key. +Accepts a nested list of `key: value` pairs that represent AsciiDoc attributes (e.g., `idseparator: '-'`, `page-level: Advanced`) +Attributes that are set or unset in [.path]_antora.yml_ are applied to all of the pages and resources (where applicable) in a component version. + +|xref:component-display-version.adoc[display_version] +|Alternate version displayed in the reference UI's component navigation menu, component version selector, and page version selector. +When `display_version` isn't set, the reference UI falls back to `version`. +`display_version` can accept empty spaces, uppercase letters, and most characters (e.g., `3.0 Beta`, `RED WREN!`). + +|xref:component-navigation.adoc[nav] +|List of navigation files Antora uses to build the component version's navigation menu. +Navigation files (e.g., [.path]_nav.adoc_) that aren't registered under the `nav` key will not be used in the component version's navigation menu. + +|xref:component-prerelease.adoc[prerelease] +|Designates the component version as a prerelease version. +Antora applies alternate sorting and routing rules to component versions marked as prereleases. +Key can be used to append a prerelease label (e.g., Beta, alpha.2) to `version` without affecting the version coordinate or version URL segment. + +|xref:component-start-page.adoc[start_page] +|Specifies that the page corresponding to the assigned page ID is the component version's home page. +By default, Antora uses the [.path]_index.adoc_ file in a component version's ROOT module if `start_page` isn't set. + +|xref:component-title.adoc[title] +|Alternate component name displayed in the reference UI's component navigation menu, component version selector, and page breadcrumbs. +The `title` key can accept empty spaces, uppercase letters, and a broader range of characters (e.g., `SUSE Manager`, `APIkit`). +|=== + +//// +.antora.yml +[#ex-1] +[source,yaml] +---- +name: name-of-component +title: The title of the component used for display in the UI +version: name-of-version +start_page: name-of-a-module:filename.adoc +nav: +- modules/name-of-a-module/nav.adoc +- modules/ROOT/nav.adoc +---- + +The <> and <> keys are always required. +The <>, <<display-version>>, <<start-page-key>>, and <<nav-key>> keys may be optional depending on the version name, structure, and file names associated with a documentation component. +//// diff --git a/docs/modules/ROOT/pages/component-version-descriptor.adoc b/docs/modules/ROOT/pages/component-version-descriptor.adoc new file mode 100644 index 000000000..885c447d1 --- /dev/null +++ b/docs/modules/ROOT/pages/component-version-descriptor.adoc @@ -0,0 +1,44 @@ += What's antora.yml? +:page-aliases: component-descriptor.adoc +//When Antora receives instructions from a playbook to scan a content source repository, its first objective is to find a xref:component-version-descriptor.adoc[component version descriptor file named _antora.yml_] in that repository. +//This file marks the subsequent directories and files as part of a xref:component-version.adoc[component version] and classifies the files according to the component name, component version, and other stable metadata it provides. + +== antora.yml + +[.path]_antora.yml_ is a YAML file that has two crucial functions: + +. [.path]_antora.yml_ marks the system location of a set of directories and source files that belong to a component version. +. [.path]_antora.yml_ provides required and optional component version metadata, that Antora assigns to the source files it collects from the system location marked by that [.path]_antora.yml_ file. + +[#component-version-marker] +== How does antora.yml mark the location of a component version's source files? + +A xref:playbook:index.adoc[playbook] tells Antora what xref:playbook:configure-content-sources.adoc[remote repositories and local content sources] it should fetch and use. +Then Antora searches those content sources for [.path]_antora.yml_ files. +Once Antora finds an [.path]_antora.yml_ file, it considers all of the xref:component-structure.adoc[subsequent directories and files] to be part of that xref:component-version.adoc[component version]. + +This ability to store the source files of component version anywhere in a directory hierarchy as long as the parent directory contains an [.path]_antora.yml_ file, allows you to maintain and manage a component version (or part of a component version) in a repository with the software it documents, a sample project, or in its own repository. + +[#component-version-configuration] +== What component version information does antora.yml provide? + +[.path]_antora.yml_ is often referred to as the [.term]*component version descriptor* file because it provides required and optional information that identifies, describes, and configures a xref:component-version.adoc[component version]. +In turn, this metadata and configuration is applied to all of the source files that belong to the component version. +This assignment of component version information decouples the source files from the repository, branch, tag, and directory where they're stored. +Antora doesn't process files based on their file system or repository location. +Instead, Antora classifies and converts files based on the information assigned to the source files by a component version descriptor file. +This is why Antora can collect files from multiple repositories, directories, branches, and tags and compile them into one component version. + +An [.path]_antora.yml_ file can contain the following keys and their assigned values: + +* `name` key (required) +* `version` key (required) +* `title` key +* `display_version` key +* `prerelease` key +* `start_page` key +* `asciidoc` and `attributes` keys +* `nav` key + +//The `name` and `version` keys in the component version's [.path]_antora.yml_ file are also used for constructing its page IDs and resource IDs. +//Finally, the component descriptor identifies and orders the files Antora uses to build the component version's navigation. diff --git a/docs/modules/ROOT/pages/component-version.adoc b/docs/modules/ROOT/pages/component-version.adoc new file mode 100644 index 000000000..db4caac37 --- /dev/null +++ b/docs/modules/ROOT/pages/component-version.adoc @@ -0,0 +1,23 @@ += What's a Component Version? + +== Component version + +A [.term]*component version* typically represents a discreet and unique version of the documentation for a single product, library, project, microservice, or training course. +Antora can identify all of a component version's source files, regardless of where the files are stored and collected from, because they're associated with the same xref:component-name-and-version.adoc#name-key[component name] and xref:component-name-and-version.adoc#version-key[component version]. +A xref:component-version-descriptor.adoc[file named _antora.yml_] is responsible for defining the component version and applying the specified configuration to the component version's source files. +//Source files are associated with a component version by the existence of a file named , which is located in a parent directory. + +[#component-version-vs-docs-component] +== What's the difference between a component version and a docs component? + +The term [.term]*documentation component*, also known as a *docs component* or *component*, is used when a concept or action applies to all of the component versions that have the xref:component-name-and-version.adoc#name-key[same component name]. +//// +However, when it comes to producing your documentation site, Antora classifies source files by component version. +It doesn't recognize files solely by component name, and therefore it doesn't apply metadata and attributes, sort and process files, or display pages solely by component name (even though it may look like it does in some cases). +//// + +[#docs-component-vs-site] +== What's the difference between a docs component and a site? + +A [.term]*documentation site* or *site* is a website generated by Antora and published to directory or domain specified in a playbook. +A site consists of one or more docs components and each docs component consists of one or more component versions. -- GitLab From 17241edf20adbb9646d4d240d49a88c63f25ca5b Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:21:31 -0600 Subject: [PATCH 02/39] create and add example for component version title --- docs/modules/ROOT/pages/component-title.adoc | 53 ++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/modules/ROOT/pages/component-title.adoc diff --git a/docs/modules/ROOT/pages/component-title.adoc b/docs/modules/ROOT/pages/component-title.adoc new file mode 100644 index 000000000..ff144ec96 --- /dev/null +++ b/docs/modules/ROOT/pages/component-title.adoc @@ -0,0 +1,53 @@ += Customize the Title + +The `title` key is strictly used for display purposes in the reference UI when a project's official name contains uppercase letters, symbols, or blank spaces. + +[#title-key] +== title key + +The `title` key is optional. +It's set in a component version's [.path]_antora.yml_ file and used by the reference UI where ever the component's name is displayed, including the xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and first breadcrumb position on a component version's pages. + +If `title` isn't set, the reference UI uses the value of `name` instead. +Unlike `name`, the value of `title` can contain empty spaces, uppercase letters, and a broader range of characters (e.g., `SUSE Manager`, `APIkit`). + +.antora.yml +[source,yaml] +---- +name: colorado +title: Colorado ∆ +version: '5.6' +---- + +This key should be used when a project's name contains spaces or characters that break Antora's page and resource IDs, prevent portability between web servers, and aren't recommended in URLs. +Also, if the name of your project changes, you can change the value of the `title` key but not have to update page and resource IDs or redirect URLs. + +[#assign-title] +== Assign a title to a component version + +Let's expand on the [.path]_antora.yml_ example where you previously learned xref:component-name-and-version.adoc#assign-name-and-version[how to assign a component name and version]. +The project's official name is _Silver Leaf_, and the team wants this name to be displayed in the UI. +Since `name` can't contain blank spaces, let's set `title` in the component version's [.path]_antora.yml_ file. + +. Open the component version's [.path]_antora.yml_ file in the text editor or IDE of your choice. ++ +.antora.yml for the component version silver-leaf 7.1 +[source,yaml] +---- +name: silver-leaf +version: '7.1' +---- + +. On a blank line, type `title`, directly followed by a colon (`:`). +. Insert a blank space after the colon, and then type the value you want to assign to `title`. ++ +[source,yaml] +---- +name: silver-leaf +title: Silver Leaf +version: '7.1' +---- + +. Save the file. + +Now, the UI will display _Silver Leaf_ in the component navigation menu, component version selector, and page breadcrumbs. -- GitLab From 11b1d69cc40c5367aadbe0215694b0ccb5ac3a10 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:22:00 -0600 Subject: [PATCH 03/39] create and add example for component version display version --- .../ROOT/pages/component-display-version.adoc | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 docs/modules/ROOT/pages/component-display-version.adoc diff --git a/docs/modules/ROOT/pages/component-display-version.adoc b/docs/modules/ROOT/pages/component-display-version.adoc new file mode 100644 index 000000000..090ea4eb3 --- /dev/null +++ b/docs/modules/ROOT/pages/component-display-version.adoc @@ -0,0 +1,63 @@ += Customize the Display Version + +The `display_version` key is strictly used for presentation purposes in the reference UI when a component version's official version contains uppercase letters, symbols, or blank spaces. +It doesn't affect page and resource IDs, the version segment in the page URL, or how component versions are sorted. + +[#display-version-key] +== display_version key + +The `display_version` key is optional. +It's set in a component version's [.path]_antora.yml_ file and used by the reference UI where ever the version is displayed, including the xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and xref:navigation:index.adoc#page-dropdown[page version selector]. + +If `display_version` isn't set, the reference UI falls back to xref:component-name-and-version.adoc#version-key[the version key]. +Unlike `version`, the value of `display_version` can contain empty spaces, uppercase letters, and most characters (e.g., `3.0 Beta`, `RED WREN!`, `rawhide`). + +.antora.yml +[source,yaml] +---- +name: colorado +title: Colorado ∆ +version: '5.6' +display_version: '5.6 (EOL)' # <1> +---- +<1> If the value starts with a number, enclose it within a set of single quote marks (`'`). + +The `display_version` key should be used when a version contains spaces or characters that break Antora's page and resource IDs, prevent portability between web servers, and aren't recommended in URLs. +It's also useful when the component version is a prerelease or is archived since the value of `display_version` doesn't affect page URLs or internal IDs. + +Prerelease versions (e.g., alpha, beta, etc.) can also be configured with xref:component-prerelease.adoc[the prerelease key]. +The `prerelease` key provides additional UI presentation and sorting capabilities. +//The `display_version` key overrides the label assigned to the `prerelease` key when both keys are set in the component version's [.path]_antora.yml_ file. + +[#assign-display-version] +== Assign a display_version to a component version + +Let's expand on the [.path]_antora.yml_ example where you previously learned xref:component-name-and-version.adoc#assign-name-and-version[how to assign a component name and version]. +The _Silver Leaf_ project team wants the version code name in addition to its version number to be displayed in the UI. +Since `version` can't contain blank spaces, let's set `display_version` in the component version's [.path]_antora.yml_ file. + +. Open the component version's [.path]_antora.yml_ file in the text editor or IDE of your choice. ++ +.antora.yml for the component version silver-leaf 7.1 +[source,yaml] +---- +name: silver-leaf +title: Silver Leaf +version: '7.1' +---- + +. On a blank line, type `display_version`, directly followed by a colon (`:`). +. Insert a blank space after the colon, and then type the value you want to assign to `display_version`. +Since the value begins with a number, enclose it in a set of single quote marks (`'`). ++ +[source,yaml] +---- +name: silver-leaf +title: Silver Leaf +version: '7.1' +display_version: '7.1 Spiny' +---- + +. Save the file. + +Now, the UI will display _7.1 Spiny_ in the component navigation menu, component version selector, and page version selector. -- GitLab From bd6d7409927acf861349ba9abd446eee90b89585 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:22:41 -0600 Subject: [PATCH 04/39] create component version prerelease --- .../ROOT/pages/component-prerelease.adoc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docs/modules/ROOT/pages/component-prerelease.adoc diff --git a/docs/modules/ROOT/pages/component-prerelease.adoc b/docs/modules/ROOT/pages/component-prerelease.adoc new file mode 100644 index 000000000..917d8d565 --- /dev/null +++ b/docs/modules/ROOT/pages/component-prerelease.adoc @@ -0,0 +1,17 @@ += Label a Prerelease Version + +Informs Antora that the component version is a prerelease version. +Antora applies alternate sorting and routing rules to component versions designated as prereleases. +Key can be used to append a prerelease label (e.g., Beta, -alpha.2) to the value of `version` without affecting the version coordinate or version URL segment. + +[#prerelease-key] +== prerelease key + +The `prerelease` key is a marker that this version is considered prerelease. +xref:component-versions.adoc#prerelease-versions[Prerelease versions] are skipped when selecting the xref:component-versions.adoc#latest-version[latest version of a component] (unless all versions are prereleases, in which case the normal rules apply). + +```yaml +prerelease: true +``` + +The `prerelease` key is not set by default. -- GitLab From 7f061304fc9a612da61db55a2235cb332f753f85 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:24:54 -0600 Subject: [PATCH 05/39] move and rename component version attributes --- .../pages/component-attributes.adoc} | 57 ++++++++++--------- .../partials/dont-use-these-attributes.adoc | 0 2 files changed, 29 insertions(+), 28 deletions(-) rename docs/modules/{page/pages/component-scoped-attributes.adoc => ROOT/pages/component-attributes.adoc} (51%) rename docs/modules/{page => ROOT}/partials/dont-use-these-attributes.adoc (100%) diff --git a/docs/modules/page/pages/component-scoped-attributes.adoc b/docs/modules/ROOT/pages/component-attributes.adoc similarity index 51% rename from docs/modules/page/pages/component-scoped-attributes.adoc rename to docs/modules/ROOT/pages/component-attributes.adoc index d67987d91..0eca4951e 100644 --- a/docs/modules/page/pages/component-scoped-attributes.adoc +++ b/docs/modules/ROOT/pages/component-attributes.adoc @@ -1,15 +1,16 @@ -= Component-Scoped Attributes += Assign Attributes to a Component Version -Built-in AsciiDoc attributes, user-defined AsciiDoc attributes, and `page-` attributes can be declared in a component descriptor file ([.path]_antora.yml_). +Built-in and user-defined AsciiDoc attributes as well as `page-` attributes can be declared in a component version descriptor file ([.path]_antora.yml_). These attributes are applied to all of a component version's pages according to the attribute precedence rules. -Attributes declared in a component descriptor file are referred to as [.term]*component-scoped attributes*. +Attributes declared in a component version descriptor file are referred to as [.term]*component version attributes*. +[#set-and-unset] == Set and unset attributes in antora.yml -Component-scoped attributes are set or unset in the component descriptor file [.path]_antora.yml_. +Component version attributes are set or unset in a component version's [.path]_antora.yml_ file. Each attribute is entered on its own line under the `asciidoc` and `attributes` category keys. -.Declaring component-scoped attributes in antora.yml for version-name@component-name +.Declaring attributes in antora.yml for version-name@component-name [source,yaml] ---- name: light @@ -29,7 +30,7 @@ nav: <2> The `attributes` key is nested under the `asciidoc` key. Enter `attributes`, followed by a colon (`:`), and press kbd:[Enter]. <3> Attributes are nested under the `attributes` key. -To declare a user-defined attribute that is available to the site's UI, type `page-` and the name of your component-scoped attribute, followed by a colon (`:`). +To declare a user-defined attribute that is available to the site's UI, type `page-` and the name of your component version attribute, followed by a colon (`:`). Press kbd:[space] once after the colon, then enter the value of the attribute. <4> This attribute is hard set. See the <<assign-precedence,next section>> to learn more about hard and soft setting rules. @@ -38,20 +39,20 @@ See the <<assign-precedence,next section>> to learn more about hard and soft set <7> The value `false` soft unsets this attribute. See the <<assign-precedence,next section>> to learn more about hard and soft unsetting rules. -Component-scoped attributes are applied and available to every page in the applicable component version. -The values of user-defined attributes, such as `page-level`, and built-in `page-` attributes can be displayed in a page using the attribute reference syntax (e.g., `+{page-level}+` or `+{page-version}+`). +The attributes are applied and available to every page in the component version. +The values of user-defined attributes, such as `page-level`, and built-in `page-` attributes can be displayed in a page using the AsciiDoc attribute reference syntax (e.g., `+{page-level}+` or `+{page-version}+`). -TIP: Antora declares `page-` attributes from most of the keys in the component descriptor file. +TIP: Antora declares `page-` attributes for most of the keys in the component version descriptor file. For instance, Antora automatically sets the built-in attribute `page-component-title` and assigns it the value specified by the `title` key. -Check out the xref:page-and-site-attributes.adoc#page-attributes[Built-in page- attributes] for a complete list of the `page-` attributes Antora automatically declares. +Check out the xref:environment-and-page-attributes.adoc#page-attributes[Built-in page- attributes] for a complete list of the `page-` attributes Antora automatically declares. [#assign-precedence] -== Assign precedence to component-scoped attributes +== Assign precedence to component version attributes -When component-scoped attributes are declared, you can control whether a page can reset or unset each attribute on a case by case basis. -Pages can't override hard set and unset component-scoped attributes, but they can override soft set and unset attributes. +When component version attributes are declared, you can control whether a page can reset or unset each attribute on a case by case basis. +Pages can't override hard set and unset component version attributes, but they can override soft set and unset attributes. -The following example shows how component-scoped attributes are assigned hard and soft precedence. +The following example shows how component version attributes are assigned hard and soft precedence. .Assigning hard and soft precedence to attributes in antora.yml for version-name@component-name [source,yaml] @@ -64,33 +65,33 @@ asciidoc: table-caption: false # <4> ---- <1> To hard set an attribute, simply enter its value. -Hard set component-scoped attributes can't be reassigned or unset by a page. +Hard set component version attributes can't be reassigned or unset by a page. <2> To soft set an attribute, attach the `@` modifier to the end of its value. -A page can override soft set component-scoped attributes. +A page can override soft set component version attributes. <3> To hard unset an attribute, assign it the tilde symbol (`~`). -Hard unset component-scoped attributes can't be set by a page. +Hard unset component version attributes can't be set by a page. <4> To soft unset an attribute, assign the value `false`. -A page can override soft unset component-scoped attributes. +A page can override soft unset component version attributes. -The example assumes that the declared attributes weren't previously xref:site-scoped-attributes.adoc[hard set or unset in the site's playbook], so the following precedence rules are applied to the attributes defined in the component descriptor: +The example assumes that the declared attributes weren't previously xref:playbook:site-attributes.adoc[hard set or unset in the site's playbook], so the following precedence rules are applied to the attributes defined in the component version descriptor: [#component-rules] -.*Component-scoped attribute precedence rules* +.*Component version attribute precedence rules* . Hard setting an attribute to a string value with no trailing `@` modifier (e.g., `value`) prevents the page from changing (setting or unsetting) the attribute. . Soft setting an attribute to a string value with a trailing `@` modifier (e.g., `value@`) allows the page to change (set or unset) the attribute. . Hard unsetting an attribute using the tilde symbol (`~`) prevents the page from setting the attribute. . Soft unsetting an attribute using a `false` value allows the page to set the attribute. -Where things get more complicated is when both site-scoped and component-scoped attributes are defined. +Where things get more complicated is when both site and component version attributes are defined. Antora takes the precedence assigned to attributes in the site's playbook into account first. -A component-scoped attribute can override a site-scoped attribute *only if the site-scoped attribute is soft set or unset*. +A component version attribute can override a site attribute *only if the site attribute is soft set or unset*. -.*Site-scoped and component-scoped attribute precedence rules* -. Hard setting a site-scoped attribute to a string value with no trailing `@` modifier prevents the component descriptor from changing (setting or unsetting) the attribute. -. Soft setting a site-scoped attribute to a string value with a trailing `@` modifier allows the component descriptor to change (set or unset) the attribute. -. Hard unsetting a site-scoped attribute using the tilde symbol (`~`) prevents the component descriptor from setting the attribute. -. Soft unsetting a site-scoped attribute using a `false` value allows the component descriptor to set the attribute. +.*Site and component version attribute precedence rules* +. Hard setting a site attribute to a string value with no trailing `@` modifier prevents the component version descriptor from changing (setting or unsetting) the attribute. +. Soft setting a site attribute to a string value with a trailing `@` modifier allows the component version descriptor to change (set or unset) the attribute. +. Hard unsetting a site attribute using the tilde symbol (`~`) prevents the component version descriptor from setting the attribute. +. Soft unsetting a site attribute using a `false` value allows the component version descriptor to set the attribute. -If an attribute in the component descriptor can be set or unset, then the <<component-rules,first set of rules>> kick in for that attribute as it relates to the page. +If an attribute in the component version descriptor can be set or unset, then the <<component-rules,first set of rules>> kick in for that attribute as it relates to the page. include::partial$dont-use-these-attributes.adoc[] diff --git a/docs/modules/page/partials/dont-use-these-attributes.adoc b/docs/modules/ROOT/partials/dont-use-these-attributes.adoc similarity index 100% rename from docs/modules/page/partials/dont-use-these-attributes.adoc rename to docs/modules/ROOT/partials/dont-use-these-attributes.adoc -- GitLab From 6a8ad3e4fbf90b0a57739142eda5ee00d87ef4aa Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:25:42 -0600 Subject: [PATCH 06/39] create component version start page --- .../ROOT/pages/component-start-page.adoc | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docs/modules/ROOT/pages/component-start-page.adoc diff --git a/docs/modules/ROOT/pages/component-start-page.adoc b/docs/modules/ROOT/pages/component-start-page.adoc new file mode 100644 index 000000000..c82e2b6bf --- /dev/null +++ b/docs/modules/ROOT/pages/component-start-page.adoc @@ -0,0 +1,21 @@ += Select a Start Page + +[#start-page-key] +== start_page key + +By default, Antora looks for a file named [.path]_index.adoc_ in the ROOT module of a component version. +It uses this page as the component version's start page (e.g., _\https://example.org/component-name/version/index.html_). +If there isn't an [.path]_index.adoc_ file in the ROOT module, you must specify a file as the start page in the component descriptor. + +```yaml +start_page: getting-started:overview.adoc +``` + +The `start_page` key accepts a xref:page:page-id.adoc[page ID] that points to a page in the component version. + +.*Start page value examples* +* security:get-started.adoc +* ROOT:welcome.adoc +* org-governance:help.adoc + +If Antora can't find [.path]_index.adoc_ in a component version's ROOT module and a start page isn't specified in its component version descriptor, site visitors are directed to a 404 page when navigating to that component version from the xref:navigation:index.adoc#component-dropdown[component version selector] on any page. -- GitLab From 41fb3b62219f461915d3623ea2009fdf12b9e0b1 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:26:19 -0600 Subject: [PATCH 07/39] create component version navigation --- .../modules/ROOT/pages/component-navigation.adoc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 docs/modules/ROOT/pages/component-navigation.adoc diff --git a/docs/modules/ROOT/pages/component-navigation.adoc b/docs/modules/ROOT/pages/component-navigation.adoc new file mode 100644 index 000000000..31a578d8f --- /dev/null +++ b/docs/modules/ROOT/pages/component-navigation.adoc @@ -0,0 +1,16 @@ += Register a Component Version's Navigation Files + +[#nav-key] +== nav key + +The `nav` key accepts a list of xref:navigation:filenames-and-locations.adoc[navigation files]. + +```yaml +nav: +- modules/ROOT/nav.adoc +- modules/module-three/nav.adoc +- modules/module-one/install-nav.adoc +``` + +Each xref:navigation:register-navigation-files.adoc[value specifies the path to a navigation file] (e.g., [.path]_modules/name-of-module/name-of-nav-file.adoc_). +The order the values are listed in dictates the order the contents of the navigation files are assembled in the site's xref:navigation:index.adoc#component-menu[component menu]. -- GitLab From 372dfa9f1c616ac639717e112503a8b1aaa42e44 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:28:00 -0600 Subject: [PATCH 08/39] move and restructure and environment and page attributes --- .../environment-and-page-attributes.adoc | 108 ++++++++++++++++++ .../page/pages/page-and-site-attributes.adoc | 56 --------- 2 files changed, 108 insertions(+), 56 deletions(-) create mode 100644 docs/modules/ROOT/pages/environment-and-page-attributes.adoc delete mode 100644 docs/modules/page/pages/page-and-site-attributes.adoc diff --git a/docs/modules/ROOT/pages/environment-and-page-attributes.adoc b/docs/modules/ROOT/pages/environment-and-page-attributes.adoc new file mode 100644 index 000000000..5f172cd8e --- /dev/null +++ b/docs/modules/ROOT/pages/environment-and-page-attributes.adoc @@ -0,0 +1,108 @@ += Built-in Page and Environment Attribute Reference +:page-aliases: page:page-and-site-attributes.adoc +//These attributes are helpful when passing data from a page to the site UI and integrations, such as a search service. + +Antora provides built-in `page-`, environment, and generator attributes. + +[#page-attributes] +== Built-in page- attributes + +Antora automatically sets the following attributes for each page: + +[cols="1,2,1"] +|=== +|Attribute |Description |Example Output + +|`page-component-display-version` +|The xref:component-display-version.adoc[display version] of the component version as specified in _antora.yml_. +|7.1 Beta + +|`page-component-name` +|The xref:component-name-and-version.adoc#name-key[component name] of the component version as specified in _antora.yml_. +|silver-leaf + +|`page-component-title` +|The xref:component-title.adoc[component title] of the component version as specified in _antora.yml_. +|Silver Leaf + +|`page-component-version` +|The xref:component-name-and-version.adoc#version-key[version] of the component version as specified in _antora.yml_. +|7.1 + +|`page-module` +|The name of the page's module. +|ROOT + +|`page-origin-branch` +|The name of the repository branch where the page's source file is stored. (mutually exclusive with `page-origin-tag`) +|v7.1.x + +|`page-origin-refname` +|The name of the reference where the page's source file is stored. +|{page-origin-refname} + +|`page-origin-reftype` +|The reference type (e.g., tag or branch) where the page's source file is stored. +|branch + +|`page-origin-tag` +|The name of the repository tag where the page's source file is stored. (mutually exclusive with `page-origin-branch`) +|v7.1.0 + +|`page-origin-start-path` +|The start path of the content source where the page's source file is stored. +|docs + +|`page-origin-type` +|The type (e.g., git) of content source where the page's source file is stored. +|git + +|`page-origin-url` +|The URL, without credentials, of the content source where the page's source file is stored. +|\https://gitlab.com/forest-co/silver-leaf.git + +|`page-origin-worktree` +|Set if the file was taken from the git worktree. +|{page-origin-worktree} + +|`page-relative` +|The family-relative path (e.g., pages) and file name of the page's source file. +|whats-new-in-spiky.adoc + +|`page-version` +|Shorthand for `page-component-version`. +|7.1 +|=== + +Attributes that are prefixed with `page-` are available to the pipeline and UI model during site generation, and they can be displayed in a page using the attribute reference syntax (e.g., `+{page-version}+`). + +[source] +---- +Let's install *{page-component-title} {page-component-version}*. +The source file for {page-relative} is in the *{page-module}* module. +---- + +Rendered as: + +[%hardbreaks] +Let's install *{page-component-title} {page-component-version}*. +The source file for *{page-relative}* is in the *{page-module}* module. + +TIP: This data is also available via the xref:antora-ui-default::templates.adoc#template-variables[UI model]. + +[#environment-attributes] +== Built-in environment and generator attributes + +There may be times when your document needs to know that it's being processed by Antora. +Antora sets these attributes for each page. + +* `env=site` +* `env-site` +* `site-gen=antora` +* `site-gen-antora` + +== Learn more + +* xref:component-name-and-version.adoc[Define a component name and version with antora.yml] +* xref:asciidoc:page-header.adoc#set-attribute[Set and unset AsciiDoc attributes]. +//* Create your own page attributes. diff --git a/docs/modules/page/pages/page-and-site-attributes.adoc b/docs/modules/page/pages/page-and-site-attributes.adoc deleted file mode 100644 index b1b05e91d..000000000 --- a/docs/modules/page/pages/page-and-site-attributes.adoc +++ /dev/null @@ -1,56 +0,0 @@ -= Built-in Page- and Site Attributes -//These attributes are helpful when passing data from a page to the site UI and integrations, such as a search service. - -Antora provides built-in `page-` and site attributes. - -[#page-attributes] -== Built-in page- attributes - -Antora automatically sets the following attributes for each page: - -`page-component-name`:: The name of the component as specified in _antora.yml_. -`page-component-version`:: The version of the component as specified in _antora.yml_. -`page-component-display-version`:: The display version of the component as specified in _antora.yml_ for the current version. -`page-component-title`:: The title (aka display name) of the component as specified in _antora.yml_ for the latest version. -`page-version`:: Shorthand for `page-component-version` (since Antora 1.1.1). -`page-module`:: The name of the module where the page is located. -`page-relative`:: The family-relative source path of the page. -`page-origin-type`:: The content source type (e.g., git). -`page-origin-url`:: The content source URL (minus any credentials) (i.e., the URL of the git repository). -`page-origin-start-path`:: The path where the component is located in the repository. -`page-origin-refname`:: The name of the reference where the page is located in the repository. -`page-origin-branch`:: The shortname of the branch where the page is located in the repository. -`page-origin-tag`:: The tag where this page is located in the repository (mutually exclusive with branch) -`page-origin-reftype`:: The reference type where the page is located in the repository (tag or branch). -`page-origin-worktree`:: Set if the file was taken from the git worktree. - -Attributes that are prefixed with `page-` are available to the pipeline and UI model during site generation, and they can be displayed in a page using the attribute reference syntax (e.g., `+{page-version}+`). - -[source,asciidoc] ----- -Let's install *{page-component-title} {page-component-version}*. -The source document for this page is in the *{page-module}* module. ----- - -Rendered as: - -[%hardbreaks] -Let's install *{page-component-title} {page-component-version}*. -The source document for this page is in the *{page-module}* module. - -TIP: This data is also available via the xref:antora-ui-default::templates.adoc#template-variables[UI model]. - -== Built-in site attributes - -There may be times when your document needs to know that it's being processed by Antora. -Antora sets these site attributes for each page. - -* `env=site` -* `env-site` -* `site-gen=antora` -* `site-gen-antora` - -== Learn more - -* xref:asciidoc:page-header.adoc#set-attribute[Set and unset AsciiDoc attributes]. -//* Create your own page attributes. -- GitLab From bb46d7936bdea8a8eba47bf6ba8084b0bd75f596 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Mon, 16 Mar 2020 12:29:06 -0600 Subject: [PATCH 09/39] move and rename site attributes and connected partials --- docs/modules/asciidoc/nav.adoc | 4 -- .../page/partials/playbook-vs-descriptor.adoc | 10 ---- docs/modules/playbook/nav.adoc | 1 + .../pages/site-attributes.adoc} | 48 +++++++++---------- .../partials/playbook-vs-descriptor.adoc | 11 +++++ 5 files changed, 36 insertions(+), 38 deletions(-) delete mode 100644 docs/modules/page/partials/playbook-vs-descriptor.adoc rename docs/modules/{page/pages/site-scoped-attributes.adoc => playbook/pages/site-attributes.adoc} (52%) create mode 100644 docs/modules/playbook/partials/playbook-vs-descriptor.adoc diff --git a/docs/modules/asciidoc/nav.adoc b/docs/modules/asciidoc/nav.adoc index 1221b16cc..55f34a218 100644 --- a/docs/modules/asciidoc/nav.adoc +++ b/docs/modules/asciidoc/nav.adoc @@ -1,10 +1,6 @@ .xref:page:index.adoc[Pages] * xref:page:page-id.adoc[Antora Page ID] * xref:page:create-standard-page.adoc[Create a Standard Page] -* Scoped Attributes -** xref:page:site-scoped-attributes.adoc[Site-Scoped Attributes] -** xref:page:component-scoped-attributes.adoc[Component-Scoped Attributes] -** xref:page:page-and-site-attributes.adoc[Built-in Page- and Site Attributes] * xref:page:page-aliases.adoc[Set Up URL Redirects with Page Aliases] * xref:page-header.adoc[Page Header] ** xref:page-header.adoc#page-title[Title] diff --git a/docs/modules/page/partials/playbook-vs-descriptor.adoc b/docs/modules/page/partials/playbook-vs-descriptor.adoc deleted file mode 100644 index ad382ec73..000000000 --- a/docs/modules/page/partials/playbook-vs-descriptor.adoc +++ /dev/null @@ -1,10 +0,0 @@ -[NOTE] -.Playbook file versus component descriptor file -==== -Attributes are declared using the same structure and syntax in both the playbook file and the component descriptor file. - -Remember, the xref:playbook:index.adoc[playbook file] is where you configure the site, content source, and UI URLs. -This playbook file usually has the word _playbook_ in its file name, e.g., [.path]_antora-playbook.yml_ or [.path]_local-antora-playbook.yml_. -The xref:ROOT:component-descriptor.adoc[component descriptor file] is where you configure the name, title, version, and navigation list for a component version. -The file name of a component descriptor is always [.path]_antora.yml_. -==== diff --git a/docs/modules/playbook/nav.adoc b/docs/modules/playbook/nav.adoc index e10a3094b..e314a5c32 100644 --- a/docs/modules/playbook/nav.adoc +++ b/docs/modules/playbook/nav.adoc @@ -6,6 +6,7 @@ **** xref:private-repository-auth.adoc[Private Repository Authentication] **** xref:configure-edit-url.adoc[Edit URL] *** xref:configure-asciidoc.adoc[AsciiDoc] +**** xref:site-attributes.adoc[Assign Attributes to a Site] *** xref:configure-ui.adoc[UI] *** xref:configure-redirect-facility.adoc[Redirect Facility] *** xref:configure-output.adoc[Output] diff --git a/docs/modules/page/pages/site-scoped-attributes.adoc b/docs/modules/playbook/pages/site-attributes.adoc similarity index 52% rename from docs/modules/page/pages/site-scoped-attributes.adoc rename to docs/modules/playbook/pages/site-attributes.adoc index 856730328..43e0555df 100644 --- a/docs/modules/page/pages/site-scoped-attributes.adoc +++ b/docs/modules/playbook/pages/site-attributes.adoc @@ -1,14 +1,14 @@ -= Site-Scoped Attributes += Assign Attributes to a Site -Built-in AsciiDoc attributes, user-defined AsciiDoc attributes, and `page-` attributes can be declared in a site's playbook file. +Built-in and user-defined AsciiDoc attributes as well as `page-` attributes can be declared in a site's playbook file. These attributes are applied to all of a site's pages according to the attribute precedence rules. -Attributes declared in the playbook are referred to as [.term]*site-scoped attributes*. +Attributes declared in the playbook are referred to as [.term]*site attributes*. == Set and unset attributes in the playbook -Each site-scoped attribute is entered on its own line under the playbook's `asciidoc` and `attributes` category keys. +Each site attribute is entered on its own line under the playbook's `asciidoc` and `attributes` category keys. -.Declaring site-scoped attributes in the playbook +.Declaring site attributes in the playbook [source,yaml] ---- site: @@ -29,7 +29,7 @@ asciidoc: # <1> <1> Enter the `asciidoc` key, followed by a colon (`:`), and press kbd:[Enter]. <2> The `attributes` key is nested under the `asciidoc` key. Enter `attributes`, followed by a colon (`:`), and press kbd:[Enter]. -<3> Site-scoped attributes are nested under the `attributes` key. +<3> Site attributes are nested under the `attributes` key. Enter the name of the attribute, followed by a colon (`:`). Press kbd:[space] once after the colon, then enter the value of the attribute. <4> The tilde symbol (`~`) hard unsets this attribute. @@ -40,19 +40,19 @@ Press kbd:[space] once after the colon, then enter the value of the attribute. <7> This user-defined attribute is hard set. See the <<assign-precedence,next section>> to learn more about hard and soft setting rules. -Site-scoped attributes are applied and available to every page in your site. +Site attributes are applied and available to every page in your site. The values of user-defined attributes, such as `page-team` and `db` can be displayed in a page using the attribute reference syntax (e.g., `+{db}+`). -include::partial$dont-use-these-attributes.adoc[] +include::ROOT:partial$dont-use-these-attributes.adoc[] [#assign-precedence] -== Assign precedence to site-scoped attributes +== Assign precedence to site attributes -You can control whether a site-scoped attribute can be overridden from a component descriptor file or a page. -Site-scoped attributes that are hard set and hard unset can't be changed by a component descriptor file or a page. -However, soft set and unset site-scoped attributes can be overridden from the component descriptor or page. +You can control whether a site attribute can be overridden from a component version descriptor file or a page. +Site attributes that are hard set and hard unset can't be changed by a component version descriptor file or a page. +However, soft set and unset site attributes can be overridden from the component version descriptor or page. -The following example shows how site-scoped attributes are assigned hard and soft precedence. +The following example shows how site attributes are assigned hard and soft precedence. .Assigning hard and soft precedence to attributes in the playbook [source,yaml] @@ -65,23 +65,23 @@ asciidoc: table-caption: false # <4> ---- <1> To hard set an attribute, simply enter its value. -Hard set site-scoped attributes can't be reassigned or unset by a component descriptor or page. +Hard set site attributes can't be reassigned or unset by a component version descriptor or page. <2> To soft set an attribute, attach the `@` modifier to the end of its value. -A component descriptor or page can override soft set site-scoped attributes. +A component version descriptor or page can override soft set site attributes. <3> To hard unset an attribute, assign it the tilde symbol (`~`). -Hard unset site-scoped attributes can't be set by a component descriptor or page. +Hard unset site attributes can't be set by a component version descriptor or page. <4> To soft unset an attribute, assign the value `false`. -A component descriptor or page can override soft unset site-scoped attributes. +A component version descriptor or page can override soft unset site attributes. include::partial$playbook-vs-descriptor.adoc[] Antora takes the precedence assigned to attributes in the site's playbook into account first. -*Only soft set and soft unset site-scoped attributes can be overridden*. +*Only soft set and soft unset site attributes can be overridden*. -.*Site-scoped attribute precedence rules* -. Hard setting a site-scoped attribute to a string value with no trailing `@` modifier (e.g., `value`) prevents a component descriptor or page from changing (setting or unsetting) the attribute. -. Soft setting a site-scoped attribute to a string value with a trailing `@` modifier (e.g., `value@`) allows a component descriptor or page to change (set or unset) the attribute. -. Hard unsetting a site-scoped attribute using the tilde symbol (`~`) prevents component descriptor or page from setting the attribute. -. Soft unsetting a site-scoped attribute using the `false` value allows a component descriptor or page to set the attribute. +.*Site attribute precedence rules* +. Hard setting a site attribute to a string value with no trailing `@` modifier (e.g., `value`) prevents a component version descriptor or page from changing (setting or unsetting) the attribute. +. Soft setting a site attribute to a string value with a trailing `@` modifier (e.g., `value@`) allows a component version descriptor or page to change (set or unset) the attribute. +. Hard unsetting a site attribute using the tilde symbol (`~`) prevents component version descriptor or page from setting the attribute. +. Soft unsetting a site attribute using the `false` value allows a component version descriptor or page to set the attribute. -To learn more about how site-scoped and component-scoped attributes interact, see xref:component-scoped-attributes.adoc[Component-scoped attributes]. +To learn more about how site and component version attributes interact, see xref:ROOT:component-attributes.adoc[Assign attributes to a component version]. diff --git a/docs/modules/playbook/partials/playbook-vs-descriptor.adoc b/docs/modules/playbook/partials/playbook-vs-descriptor.adoc new file mode 100644 index 000000000..e775187b4 --- /dev/null +++ b/docs/modules/playbook/partials/playbook-vs-descriptor.adoc @@ -0,0 +1,11 @@ +[NOTE] +.Playbook file versus component version descriptor file +==== +Attributes are declared using the same structure and syntax in both the playbook file and the component version descriptor file. + +The xref:playbook:index.adoc[playbook] is where you configure the site, content sources, and UI URLs. +The playbook file usually has the word _playbook_ in its file name, e.g., [.path]_antora-playbook.yml_ or [.path]_local-antora-playbook.yml_. + +The xref:ROOT:component-version-descriptor.adoc[component version descriptor] is where you configure the name, version, metadata, attributes, and navigation list for a component version. +A component version descriptor's file name is always [.path]_antora.yml_. +==== -- GitLab From b360f0793d0c9347f4640f5c80ee038399b5ecf4 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:33:45 -0600 Subject: [PATCH 10/39] create component with no version page --- .../ROOT/pages/component-with-no-version.adoc | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 docs/modules/ROOT/pages/component-with-no-version.adoc diff --git a/docs/modules/ROOT/pages/component-with-no-version.adoc b/docs/modules/ROOT/pages/component-with-no-version.adoc new file mode 100644 index 000000000..0adc27aa6 --- /dev/null +++ b/docs/modules/ROOT/pages/component-with-no-version.adoc @@ -0,0 +1,37 @@ += Define a Component Version with No Version +:listing-caption: Example +:xrefstyle: short + +Sometimes the project or process your documenting isn't versioned. +For example, hosted technology services and team handbooks may only need their content to represent how the service or process works right now. +In these cases, you may prefer the component version's page URLs not contain the `version` value. +This is where the special value `master` comes into play. + +NOTE: A repository branch named _master_ and a `version` key with a value of `master` aren't related. +A repository branch can be a xref:playbook:configure-content-sources.adoc[content source specified in a playbook]. +The value of the `version` key is part of the identity of a xref:component-version.adoc[component version], and it's defined in xref:component-version-descriptor.adoc[an _antora.yml_ file]. + +[#version-master] +== Assign master as the version value + +Antora requires the xref:component-name-and-version.adoc#version-key[version key] be assigned a value in [.path]_antora.yml_. +This value becomes the version coordinate in the component version's page and resource IDs and the version segment in the URL of its published pages. +For example, if the `version` value is `2.1`, that value will appear in the URL of the component version's pages (e.g., [.path]_/component-name/2.1/page-name.html_). + +The exception to this rule is if `version` matches the reserved value `master`. +Antora *does not* include the version segment in a component version's page URLs in this case. + +The component version defined in <<ex-unversioned>> will produce versionless URLs. + +[#ex-unversioned] +.antora.yml for an unversioned component version +[source,yaml] +---- +name: tutorials +version: master +title: Tutorials +display_version: Stable +---- + +A page with the filename [.path]_build-a-restful-web-service.adoc_ in this component version will have the URL [.path]_/tutorials/build-a-restful-web-service.html_. +//When making a qualified reference to this page, you'd still include the version as you normally would (e.g., `master@tutorials::build-a-restful-web-service.adoc`). -- GitLab From 94ee3f122ae5efbebff45666050e778f887f69bc Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:34:28 -0600 Subject: [PATCH 11/39] create how component versions are sorted page --- .../how-component-versions-are-sorted.adoc | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc diff --git a/docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc b/docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc new file mode 100644 index 000000000..09ee59018 --- /dev/null +++ b/docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc @@ -0,0 +1,115 @@ += How are Component Versions Sorted? + +On this page, you'll learn: + +* [x] How Antora sorts docs components and component versions. +* [x] How Antora selects the latest version of a docs component. + +Understanding how Antora sorts xref:component-version.adoc[component versions] is important when choosing your versioning scheme and its potential presentation and routing results in your site's UI. + +[#sort-docs-components] +== Documentation component sort order + +First, Antora sorts component versions into xref:component-version.adoc#component-version-vs-docs-component[docs components] according to the xref:component-title.adoc[title key] defined in each component version's [.path]_antora.yml_ file. +If the title key isn't set, it falls back to the xref:component-name-and-version.adoc#name-key[name key]. + +Docs components are sorted in alphabetical order. +The resulting alphabetical list of docs components is used for display purposes in the xref:navigation:index.adoc#component-dropdown[component version selector menu]. +Under each component name, a list of versions, sorted according to the <<version-sorting-rules,component version sorting rules>>, is presented. + +[#version-schemes] +== Versioning schemes + +Antora only considers the value of the `version` key when sorting the component versions of a docs component. +The xref:component-name-and-version.adoc#version-key[value you assign to the version key] determines what versioning scheme, and therefore what order, that component version is placed in under its component name in the xref:navigation:index.adoc#component-dropdown[component version selector menu]. + +[cols="1,4,1"] +|=== +|Scheme |Valid Identifiers |Example + +|Semantic +a|[%hardbreaks] +Integer +String that starts with a number and contains at least one dot (`.`) character +String that starts with `v`, followed by a number, and contains at least one dot (`.`) character +a|[%hardbreaks] +`30` +`2.4` +`v90.3` + +|Named +|All values that don't match the semantic scheme +a|[%hardbreaks] +`edge` +`master` +`z4` + +|Unversioned +|`master` +|`master` +|=== + +NOTE: The version `master` has special meaning when a xref:component-with-no-version.adoc[component version is unversioned or version-less], but it's given no special treatment when sorting. + +[#version-sorting-rules] +== Antora's component version sorting rules + +Antora applies the following rules when sorting component versions: + +. Named versions of a docs component are displayed in the component version selector menu before semantic versions if both are present. +. Named versions of a docs component are sorted in reverse alphabetical order (e.g., `z4`, `master`). +.. Version identifiers with uppercase letters aren't recommended in URLs and can prevent portability between web servers. +If you do use uppercase letters, they come before lowercase letters (e.g., `A`, `a`). +. Semantic versions of a docs component are displayed in the component version selector menu after named versions if both are present. +. Semantic versions of a docs component are sorted in descending order +.. The leading `v` in a semantic identifier is ignored and versions are sorted according to the first number after the `v`. +.. The https://semver.org[semantic versioning ordering rules] are applied. + +[#determine-version-order] +=== Determine the version order of a docs component + +Let's assume that the docs component _RoseyDB_ contains several component versions. +Some versions use the semantic scheme: `v2.5`, `4.0`, and `3.9`. +Some are named: `utopia`, `master`, and `vivid`. +According to Antora's sorting rules, the _RoseyDB_ component versions will be displayed in the reference UI in the order listed below. + +.Sorted RoseyDB component versions +.... +vivid +utopia +master +4.0 +3.9 +v2.5 +.... + +Bear in mind that if the xref:component-display-version.adoc[display_version key] is defined in a component version's [.path]_antora.yml_ file, the value of `display_version` is shown instead of the `version` key's value. +Regardless of whether or not `display_version` is set, the component version is *always sorted according to the value assigned to its `version` key*. +Thus, to the reader's eyes, the versions may not appear to be sorted in the order described. + +For instance, if the `utopia` version of _RoseyDB_ is assigned a `display_version` value of `5.0`, the _RoseyDB_ versions will still be sorted in the same order. +The `utopia` version is just labeled with a different version name in the reference UI. + +.... +vivid +5.0 +master +4.0 +3.9 +v2.5 +.... + +Antora also determines the <<latest-version,latest component version>> of each docs component. +The latest version for _RoseyDB_ would be `vivid` because it's the first version in the sorted list and not defined as a prerelease. + +[#latest-version] +== Latest component version + +In addition to sorting the component versions, Antora selects the latest component version of each docs component. +The [.term]*latest version* is the first version in the sorted list that's not a xref:component-prerelease.adoc[prerelease]. +If all versions are prereleases, then the first prerelease version in the list is selected. + +Antora uses the latest component version as the default landing URL for a docs component. +It also uses the latest version of a docs component when qualifying an incoming page or resource ID reference from another docs component if it can't otherwise determine the version. + +TIP: The latest version is available as the property `latest` in the xref:antora-ui-default::templates.adoc#site[UI model]. -- GitLab From 19dbd38ae6e63f1ba55dde5073ed34f485b7806d Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:35:23 -0600 Subject: [PATCH 12/39] move distributed component version section --- .../pages/distributed-component-version.adoc | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 docs/modules/ROOT/pages/distributed-component-version.adoc diff --git a/docs/modules/ROOT/pages/distributed-component-version.adoc b/docs/modules/ROOT/pages/distributed-component-version.adoc new file mode 100644 index 000000000..34373a50a --- /dev/null +++ b/docs/modules/ROOT/pages/distributed-component-version.adoc @@ -0,0 +1,20 @@ += Distributed Component Version + +[#distributed] +== Distributed component version + +While all of a docs component and its component versions`' source files can be stored in a single repository, it isn't a requirement. +Antora can collect a component version's source files from two, five, and even more repositories. +That means a few of a component version's modules can be stored in one repository, while the [.path]_examples_ family directory of another module is stored in a tutorial repository that's maintained by a training team, and then that same module's pages can be stored in [.path]_pages_ family directories across three different repositories. +When a docs component's source files are stored in multiple repositories, it's referred to as a [.term]*distributed component*. +This capability is provided by the simple, but-oh-so-powerful component version descriptor file, [.path]_antora.yml_. + +Recall that an [.path]_antora.yml_ file specifies the component name and version of a component version. +If Antora discovers several [.path]_antora.yml_ files that specify an identical component name and version, that component version is said to be [.term]*distributed*. +All of the source files associated with these [.path]_antora.yml_ files are added to Antora's content catalog and included in a single component version. + +When a component version is distributed, only one of its [.path]_antora.yml_ files should specify the optional configuration keys, such as `title` and `nav`, in addition to the required component `name` and `version`. +All of the other [.path]_antora.yml_ files that mark the locations of the component version's source files must only specify the component `name` and `version`. +Conflicting or duplicate optional configuration keys may produce unpredictable results. + +Antora will fail with an error if there is a content or navigation source file with an identical file name and stored in the same module in a distributed component. -- GitLab From a3812c179625a23a90ad49bedf0d735cf2f9b770 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:38:19 -0600 Subject: [PATCH 13/39] closes #259 write component version key-value pair partials --- .../optional-component-version-keys.adoc | 29 +++++++++++++++++++ .../required-component-version-keys.adoc | 12 ++++++++ 2 files changed, 41 insertions(+) create mode 100644 docs/modules/ROOT/partials/optional-component-version-keys.adoc create mode 100644 docs/modules/ROOT/partials/required-component-version-keys.adoc diff --git a/docs/modules/ROOT/partials/optional-component-version-keys.adoc b/docs/modules/ROOT/partials/optional-component-version-keys.adoc new file mode 100644 index 000000000..1cb11ba0d --- /dev/null +++ b/docs/modules/ROOT/partials/optional-component-version-keys.adoc @@ -0,0 +1,29 @@ +[cols="1,5"] +|=== +|Optional Key |Description + +|xref:component-attributes.adoc[asciidoc.attributes] +|The `asciidoc` key accepts the `attributes` key and its nested list of key-value pairs. +The key-value pairs listed under `attributes` represent built-in and user-defined AsciiDoc attributes (e.g., `idseparator: '-'`). +Attributes in [.path]_antora.yml_ are applied to all of the pages and resources (where applicable) in a component version. + +|xref:component-display-version.adoc[display_version] +|Version identifier used for presentation purposes only in the reference UI's component version selector and page version selector. +`display_version` accepts empty spaces, uppercase letters, and most characters (e.g., `3.0 Beta`, `RED WREN!`). + +|xref:component-navigation.adoc[nav] +|Accepts a list of navigation files. +Navigation files (e.g., [.path]_nav.adoc_) that are registered under the `nav` key are used in the component version's page menu. + +|xref:component-prerelease.adoc[prerelease] +|Designates a component version as a prerelease version and disables the default routing rules. +Key can append a prerelease identifier (e.g., `-alpha.2`) to `version` without affecting the version coordinate or version URL segment. + +|xref:component-start-page.adoc[start_page] +|Specifies a page as the component version's home page. +By default, Antora uses [.path]_index.adoc_ in a component version's ROOT module. + +|xref:component-title.adoc[title] +|Component name used for sorting and presentation purposes only in the reference UI's component version page menu, component version selector, and page breadcrumbs. +Accepts empty spaces, uppercase letters, and a broad range of characters (e.g., `API Manager`). +|=== diff --git a/docs/modules/ROOT/partials/required-component-version-keys.adoc b/docs/modules/ROOT/partials/required-component-version-keys.adoc new file mode 100644 index 000000000..a4594ae1d --- /dev/null +++ b/docs/modules/ROOT/partials/required-component-version-keys.adoc @@ -0,0 +1,12 @@ +[cols="1,5"] +|=== +|Required Key |Description + +|xref:component-name-and-version.adoc#name-key[name] +|Component name used with `version` to identify a component version. +Used as the component coordinate in page and resource IDs and in the component URL segment for a component version's published pages. + +|xref:component-name-and-version.adoc#version-key[version] +|Version identifier used with `name` to identify a component version. +Used as the version coordinate in page and resource IDs and, with the exception of the reserved value `master`, in the version URL segment for a component version's published pages. +|=== -- GitLab From 6595912223bd9d504619480cb97a3f34c2e5a402 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:41:55 -0600 Subject: [PATCH 14/39] align navigation pages with component version terms --- .../pages/filenames-and-locations.adoc | 32 ++++----- docs/modules/navigation/pages/index.adoc | 61 ++++++++++------- .../pages/link-syntax-and-content.adoc | 16 ++--- .../navigation/pages/list-structures.adoc | 11 ++-- .../pages/register-navigation-files.adoc | 65 +++++++------------ 5 files changed, 90 insertions(+), 95 deletions(-) diff --git a/docs/modules/navigation/pages/filenames-and-locations.adoc b/docs/modules/navigation/pages/filenames-and-locations.adoc index adbcabfac..74287075f 100644 --- a/docs/modules/navigation/pages/filenames-and-locations.adoc +++ b/docs/modules/navigation/pages/filenames-and-locations.adoc @@ -7,7 +7,7 @@ On this page, you'll learn: -* [x] The ways visitors can navigation to site pages. +* [x] The ways visitors can navigate to site pages. * [x] The purpose of a navigation file. * [x] The navigation file's extension and naming rules. * [x] Common and alternate navigation file storage locations. @@ -15,24 +15,24 @@ On this page, you'll learn: == Navigation methods All of the AsciiDoc files in a [.path]_pages_ directory are automatically published to your site by Antora. -That means visitors can find a page using search tools, through links on other site pages, and in some scenarios, through dropdown menus such as the page version selector. -When you want visitors to be able to locate and go to a page using a component navigation menu, then you must add a cross reference (`xref`) to that page in the appropriate navigation source file. +That means visitors can find a page using search tools, links on other site pages, and in some scenarios, through dropdown menus such as the page version selector. +When you want visitors to be able to locate and go to a page using a component version page menu, then you must add a cross reference (`xref`) to that page in the appropriate navigation source file. == What is a navigation source file? -A navigation source file is a list of page cross references, resource links, external URIs, and other content that is marked up in AsciiDoc and stored at the base of a module. -If registered in a component descriptor ([.path]_antora.yml_), the contents of the navigation file will be incorporated into a component menu and published to a site. +A navigation source file is a list of page cross references, external URLs, and other content that is marked up in AsciiDoc and stored at the base of a module. +If registered in a component version descriptor ([.path]_antora.yml_), the contents of the navigation file will be incorporated into a component version page menu and published to a site. == Navigation file format and naming Navigation files must end with the AsciiDoc file extension (`.adoc`). -They are typically named [.path]_nav.adoc_; however, you can use any name that is meaningful to you. -Feel free to name your navigation files [.path]_kaboom.adoc_ if that's what makes your team happy. +They're typically named [.path]_nav.adoc_; however, you can use any name that is meaningful to you. +Name your navigation files [.path]_kaboom.adoc_ if that's what makes your team happy. [#storage] == Navigation file storage locations -A common pattern we see is for each module to contain its own navigation file. +A common pattern is for each module to contain its own navigation file. xref:ROOT:modules.adoc[Modules already represent logical groups of concepts or objectives], so it's likely that you'd arrange the xrefs to that module's pages into a continuous, hierarchical flow of navigation menu entries. This also reduces the number of coordinates the page IDs in the xrefs require when you add a page to the navigation file. @@ -42,21 +42,21 @@ Navigation files should be stored at the base of a module, i.e., at the same lev === Multiple navigation files per module A module can contain more than one navigation file. -This functionality helps you finely tune the navigation list order when you xref:register-navigation-files.adoc[register the navigation files] in a component descriptor. +This functionality helps you finely tune the navigation list order when you xref:register-navigation-files.adoc[register the navigation files] in an [.path]_antora.yml_ file. === Alternative storage patterns -Storing a navigation file in the module it references the most simplifies the page cross references entered into it. -It also helps writers locate the navigation that may be affected when they add pages to, or remove pages from, a module. -However, links to other modules' pages (and even other components' pages) can be entered into any module's navigation file. -You'll just need to xref:asciidoc:page-to-page-xref.adoc#different-module[add the module coordinate] (or xref:asciidoc:page-to-page-xref.adoc#different-component[component coordinate]) to the cross references you create in the navigation file. -For example, you could store a single navigation file in a component's ROOT module, and, instead of having navigation files in each module that may exist in the component, you could just add the cross references to pages in those other modules directly to the ROOT module's navigation file. +Storing a navigation file in the module it references simplifies the page cross references entered into it. +It also helps writers locate the navigation that's affected when they add pages to or remove pages from a module. +However, xrefs to other modules' pages (and even other component versions' pages) can be entered into any module's navigation file. +You just need to xref:asciidoc:page-to-page-xref.adoc#different-module[add the module coordinate] (or xref:asciidoc:page-to-page-xref.adoc#different-component[component name and version coordinates]) to the cross references you create in the navigation file. +For example, you could store a single navigation file in a component version's ROOT module, and, instead of having navigation files in each module in the component version, you could just add the cross references to pages in those other modules directly to the ROOT module's navigation file. == What's next? -Learn how to register navigation files so they get included in a component menu: +Learn how to register navigation files so they get included in a component version page menu: -* xref:register-navigation-files.adoc[Register navigation files with a component for display in a component menu] +* xref:register-navigation-files.adoc[Register a component version's navigation files for display in its component version page menu] Learn all about creating navigation lists and navigation items: diff --git a/docs/modules/navigation/pages/index.adoc b/docs/modules/navigation/pages/index.adoc index 3b5a7bf10..e470d6f46 100644 --- a/docs/modules/navigation/pages/index.adoc +++ b/docs/modules/navigation/pages/index.adoc @@ -1,70 +1,83 @@ = Navigation Assembly -:description: An introduction to how Antora creates site, component, version, and page navigation menus and dropdown selectors for multiple documentation products and documentation versions. +:description: An introduction to how Antora creates site, component version, and page menus and dropdown selectors for multiple documentation products and versions. :keywords: navigate between documentation versions, navigate between projects, navigate to other versions of a page, add page links to a menu, add page links to a sidebar, add page links to an AsciiDoc list, set up website navigation with Antora, multi-version navigation, create a navigation menu with AsciiDoc, UI, theme // Filters :page-collections: core concepts :page-tags: UI menu, component versions, page versions -With Antora, you can create your site's navigation with AsciiDoc and store it right alongside your documentation files. +With Antora, you can create your documentation's navigation with AsciiDoc and store it right alongside your documentation files. == Navigation assembly requirements The navigation for an Antora documentation site requires: * at least one navigation file that contains at least one unordered AsciiDoc list, -* at least one navigation file registered in the component descriptor file, and -* a UI bundle, such as the Antora default UI, that can apply styles and interaction behavior to the menu(s) Antora generates. +* at least one navigation file registered in the component version descriptor file, and +* a UI bundle, such as Antora's reference UI, that can apply styles and interaction behavior to the menus Antora generates. -image::navigation-assembly.svg[Antora navigation assembly diagram showing the required source files and the resulting site menus where the content from the source files is displayed,600] +image::navigation-assembly.svg[Antora navigation assembly diagram showing the required source files and the resulting menus where the content from the source files is displayed,600] Let's take a brief look at each of the numbered items in this diagram. +<<<<<<< HEAD === image:one.svg[,18,role=conum is-hidden-toc] Navigation files (Source) +======= +[#nav-file-source] +=== image:one.svg[One,30] Source: Navigation files +>>>>>>> 902fad7... align navigation pages with component version terms -The navigation for a component is described by xref:filenames-and-locations.adoc[at least one AsciiDoc file]. +The navigation for a component version is described by xref:filenames-and-locations.adoc[at least one AsciiDoc file]. However, as seen in the diagram, you can have as many navigation files as you need. -Creating a navigation file per module is a common organizational structure we see. +Creating a navigation file per module is a common, but not required, organizational structure. A navigation file contains xref:list-structures.adoc[one or more AsciiDoc lists]. -xref:link-syntax-and-content.adoc[Each item in a list] can be the link to a documentation page, URL to a website that isn't part of the site, or unlinked content such as a category title that groups a nested set of links. +xref:link-syntax-and-content.adoc[Each item in a list] can be the cross reference to a page, URL to a website that isn't part of the site, or unlinked content such as a category title that groups a nested set of list items. Documentation page links are created using the same cross referencing syntax used in the pages themselves. -When you want the list contents of a navigation file to be published to a component's navigation menu, you need to register the file in the appropriate component descriptor file. +When you want the list contents of a navigation file to be published to a component version's page menu, you need to register the file in the appropriate component version descriptor file. +<<<<<<< HEAD === image:two.svg[,18,role=conum is-hidden-toc] Navigation registration (Source) +======= +[#register-source] +=== image:two.svg[Two,30] Source: Navigation enlistment +>>>>>>> 902fad7... align navigation pages with component version terms -Navigation files are xref:register-navigation-files.adoc[registered in a component descriptor file] under the nav key (`nav`). -List the navigation files in the order you want them to be displayed in when they're published to the component menu on your site. -When you run Antora, it will only use the registered navigation files to create the component menu. +Navigation files are xref:register-navigation-files.adoc[registered in a component version descriptor file] under the `nav` key. +List the navigation files in the order you want them to be displayed in when they're published to the component version page menu on your site. +When you run Antora, it will only use the registered navigation files to create the component version page menu. [#component-menu] +<<<<<<< HEAD === image:three.svg[,18,role=conum is-hidden-toc] Component navigation menu (Site) +======= +=== image:three.svg[Three,30] Site: Component version page menu +>>>>>>> 902fad7... align navigation pages with component version terms -Antora collects the contents of each registered navigation file, puts the contents in the order the files are listed under the `nav` key, and publishes a fully assembled navigation menu for the component to the site. -The behavior and style of the menu is dictated by the UI bundle specified in your playbook. +Antora collects the contents of each registered navigation file, puts the contents in the order the files are listed under the `nav` key, and publishes a fully assembled menu of pages for the component version. +The behavior and style of the component version page menu is dictated by the UI bundle specified in your playbook. -image::component-navigation-menu.png[Screenshot of the component navigation menu in an Antora documentation site,660] - -Antora carries out this assembly process for each version of each component that it locates in the repositories, branches, and tags listed under `sources` in the site's playbook. +image::component-navigation-menu.png[Screenshot of the component version page menu in an Antora documentation site,660] [#component-dropdown] === image:four.svg[,18,role=conum is-hidden-toc] Component version selector (Site) -When your site has several components and/or several versions of one or more components, Antora assembles an aggregated list of the components and their versions. -We refer to this master menu of components and versions as the component version selector. -Antora automatically lists the components in alphabetical order and the versions in order from the greatest or latest. +When your site has several documentation components and/or several component versions, Antora assembles an aggregated list of the docs components and their versions. +This master menu of docs components and their component versions is the component version selector. +Antora automatically lists the docs components in alphabetical order. +Each component version is ordered from the greatest or latest. image::component-version-selector.png[Screenshot of the component version selector dropdown menu in an Antora documentation site,660] -In the default UI, this list is displayed in the "`drawer`" located at the bottom of any component menu. -When a visitor clicks on the drawer, it expands upwards and the reader can then select the component and version they want to see. +In the reference UI, this list is displayed in the "`drawer`" located at the bottom of any component version page menu. +When a visitor clicks on the drawer, it expands upwards and the reader can then select the component version they want to see. [#page-dropdown] === image:five.svg[,18,role=conum is-hidden-toc] Page version selector (Site) -If a page is available in more than one version of a component, a dropdown selector is visible on that page. +If a page is available in more than one version of a component, a dropdown selector is visible on that page in the reference UI. From this selector, a visitor can navigate between other versions of that page. -Antora automatically populates this selector menu when multiple versions of a page are available. +Antora automatically populates this selector when multiple versions of a page are available. image::page-version-selector.png[Screenshot of the page version selector dropdown menu in an Antora documentation site,660] diff --git a/docs/modules/navigation/pages/link-syntax-and-content.adoc b/docs/modules/navigation/pages/link-syntax-and-content.adoc index b7c420544..8450a59b7 100644 --- a/docs/modules/navigation/pages/link-syntax-and-content.adoc +++ b/docs/modules/navigation/pages/link-syntax-and-content.adoc @@ -30,7 +30,7 @@ When the link destination is a website or resource that isn't part of your site, Cross references in a navigation list use the xref:asciidoc:page-to-page-xref.adoc[same syntax and page ID construction as cross references in the page content]. Just set up the `xref` macro, insert the destination page ID, and add the link content. The link content can be text, images, and/or icons. -The link content is visible to the visitor in the component navigation menu. +The link content is visible to the visitor in the component version's page menu. It is also displayed in the breadcrumbs at the top of the destination page. When a visitor clicks on the link content, they are routed to the destination page specified by the page ID in the xref. @@ -51,17 +51,17 @@ In this case, the page ID doesn't require the component or module coordinates. * xref:topic/page.adoc[In-module page in a topic folder] ---- -=== Links to pages in other modules and components +=== Links to pages in other modules and component versions Using the appropriate page ID pattern, you can link to any document in the site from a navigation list, whether it's stored in a xref:asciidoc:page-to-page-xref.adoc#different-module[different module] or xref:asciidoc:page-to-page-xref.adoc#different-component[component]. -.xrefs to pages in other modules and components +.xrefs to pages in other modules and component versions [source,asciidoc] ---- * xref:index.adoc[In-module page] -* xref:other-module:page.adoc[Page in the same component, but a different module] +* xref:other-module:page.adoc[Page in the same component version, but a different module] ** xref:topic/page.adoc[In-module page in a topic folder] -*** xref:other-module:page.adoc#fragment[A deep link to a page in the same component, but a different module] +*** xref:other-module:page.adoc#fragment[A deep link to a page in the same component version, but a different module] *** xref:other-component:module:page.adoc[Page in another component] ---- @@ -103,7 +103,7 @@ When you want to include content in a navigation list, but you don't want it to == Formatted text -Whether linked or unlinked, the text you want displayed in your component menu can be formatted using inline AsciiDoc markup. +Whether linked or unlinked, the text you want displayed in your component version page menu can be formatted using inline AsciiDoc markup. [source,asciidoc] ---- @@ -128,9 +128,9 @@ The inline image macro has only one colon (`:`). == What's next? -Learn how to register navigation files so they get included in a component menu: +Learn how to register navigation files so they get included in a component version page menu: -* xref:register-navigation-files.adoc[Register navigation files with a component for display in a component menu] +* xref:register-navigation-files.adoc[Register navigation files with _antora.yml_ for display in a component version page menu] Learn all about structuring navigation lists: diff --git a/docs/modules/navigation/pages/list-structures.adoc b/docs/modules/navigation/pages/list-structures.adoc index 489ec998f..16f8fc269 100644 --- a/docs/modules/navigation/pages/list-structures.adoc +++ b/docs/modules/navigation/pages/list-structures.adoc @@ -1,12 +1,11 @@ = Single List and Multi-list Navigation Files -:description: How to structure a single list or multi-list Antora navigation source file, nest items in a list, and use list titles to create component navigation menus. +:description: How to structure a single list or multi-list Antora navigation source file, nest items in a list, and use list titles to create component version page menus. :keywords: nav.adoc, nested sidebar menu, nested navigation with AsciiDoc, Antora menu items, UI, theme // Filters :page-tags: UI menu On this page, you'll learn: -* [x] The AsciiDoc list type (unordered) that navigation files require. * [x] How to nest list items at different hierarchy levels. * [x] How list titles affect item hierarchy and the number of lists a navigation file can contain. * [x] How to construct a single list navigation file. @@ -51,7 +50,7 @@ Unlike list items, there must be *no spaces* between the `.` and the content of * Another list item ---- -When converted into a component navigation menu, list titles become level one list items with all other item levels (`+*+` through `+*****+`) getting nested beneath them. +When converted into a navigation menu, list titles become level one list items with all other item levels (`+*+` through `+*****+`) getting nested beneath them. A list title is optional when a navigation file only contains one list. If a navigation file contains <<multi,multiple lists>>, each list in that file must have a title. @@ -104,8 +103,8 @@ The blank line between the lists is not present in the published menu. Learn all about creating and formatting navigation list items: -* xref:link-syntax-and-content.adoc[Navigation link syntax and content formatting: xrefs, URIs, text styles, images, and more] +* xref:link-syntax-and-content.adoc[Navigation link syntax and content formatting: xrefs, URLs, text styles, images, and more] -Learn how to register navigation files so they get included in a component menu: +Learn how to register navigation files so they get included in a component version page menu: -* xref:register-navigation-files.adoc[Register navigation files with a component for display in a component menu] +* xref:register-navigation-files.adoc[Register navigation files in _antora.yml_ for display in a component version page menu] diff --git a/docs/modules/navigation/pages/register-navigation-files.adoc b/docs/modules/navigation/pages/register-navigation-files.adoc index de75028b0..e73c2d6ac 100644 --- a/docs/modules/navigation/pages/register-navigation-files.adoc +++ b/docs/modules/navigation/pages/register-navigation-files.adoc @@ -1,67 +1,50 @@ = Register Navigation Files -:description: How to enlist navigation files in a component descriptor so that Antora assembles them into a component navigation menu. -:keywords: nav.adoc, antora.yml, register navigation files, add page link lists to a menu, UI, theme +:description: How to enlist navigation files in a component version descriptor so that Antora assembles them into a component version page menu. +:listing-caption: Example +:xrefstyle: short // Filters :page-tags: UI menu, antora.yml, component keys On this page, you'll learn: -* [x] The purpose of the component descriptor nav key. -* [x] How to register navigation files in a component descriptor. -* [x] How registration order affects the component menu. +* [x] How to register navigation files in a component version descriptor. +* [x] How registration order affects the component version page menu. -== The component descriptor nav key +== The component version nav key -The nav key (`nav`) is set in the xref:ROOT:component-descriptor.adoc[component descriptor file] ([.path]_antora.yml_) of a component. -The nav key accepts a list of xref:filenames-and-locations.adoc[navigation files]. +The `nav` key is set in the xref:ROOT:component-version-descriptor.adoc[component descriptor file] ([.path]_antora.yml_) of a xref:ROOT:component-version.adoc[component version]. +It accepts a list of xref:filenames-and-locations.adoc[navigation files] as values. Each value specifies the path to an individual navigation file. +If you aren't familiar with how to set the `nav` key and assign it values, review xref:ROOT:component-navigation.adoc[Assign navigation files to a component version] first. -.Component descriptor with two registered navigation files -[source,yaml] ----- -name: component-b -title: Component B -version: '1.0' -nav: # <1> -- modules/ROOT/nav.adoc # <2> -- modules/module-one/nav.adoc # <3> ----- -<1> Nav key -<2> Value registering a navigation file located in the ROOT module -<3> Value registering a navigation file located in a module named module-one - -When a file is assigned to the nav key, this file is [.term]_registered_. -Only the contents of registered navigation files are assembled into, and published as, a component navigation menu. - -=== Nav key structure - -The nav key must be entered on its own line be directly followed by a colon (`:`). -Do not indent the nav key or its list of values. - -Nav key values must be structured as follows: +== Register a component version's navigation files -* Each nav key value must be entered on its own line. -* Each nav key value must start with a hyphen (`-`) and then a single blank space. -* Following the single blank space, enter the path to an individual navigation file relative to the location of the component descriptor file. +When a navigation file is assigned to the `nav` key, this file is [.term]*registered*. +Only the contents of registered navigation files are assembled into, and published as, a component version page menu. -In this example, two navigation files have been registered. +In <<ex-register>>, two navigation files have been registered. +[#ex-register] +.Register two navigation files in an antora.yml file [source,yaml] ---- name: component-b title: Component B version: '1.0' nav: -- modules/ROOT/nav.adoc -- modules/module-one/nav.adoc +- modules/ROOT/nav.adoc # <1> +- modules/module-one/nav.adoc # <2> ---- +<1> Value registering a navigation file located in the ROOT directory. +<2> Value registering a navigation file located in the module-one directory -The navigation lists in these two files will be published into a single component menu for Component B 1.0. +The navigation lists in the two registered files will be published into a single component version page menu for _Component B 1.0_. -=== How registration order affects the component menu +[#registration-order] +=== How registration order affects the component version page menu -The order of the nav key values dictates the order the contents of the navigation files are assembled in the published component menu. -In the case of the example from the previous section, the contents of the ROOT navigation file will be at the top of the component menu and the contents of the Module One navigation file will be appended to the end of the ROOT navigation list. +The order of the `nav` key's values dictates the order the contents of the registered navigation files are assembled in the published component version page menu. +In <<ex-register>>, the contents of the ROOT module's navigation file will be at the top of the component version page menu and the contents of Module One's navigation file will be appended to the end of the ROOT navigation list. == What's next? -- GitLab From 6fad0933f964ecd87609f253946098ec93bdfed1 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:45:41 -0600 Subject: [PATCH 15/39] write content source repo and root page --- .../pages/content-source-repositories.adoc | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 docs/modules/ROOT/pages/content-source-repositories.adoc diff --git a/docs/modules/ROOT/pages/content-source-repositories.adoc b/docs/modules/ROOT/pages/content-source-repositories.adoc new file mode 100644 index 000000000..f35d4a4a9 --- /dev/null +++ b/docs/modules/ROOT/pages/content-source-repositories.adoc @@ -0,0 +1,28 @@ += Repositories and Content Source Roots + +Antora collects content source files from branches, tags, and directories in git repositories. +These source files are only retrieved and processed correctly if Antora can locate them at a specified content source root. +//and then categorize them using a valid component version descriptor file and standard directory set. + +== git repositories as content sources + +The source files containing a site's content are stored in git repositories. +These repositories can be remote, local, or a mix of both. +A [.term]*content source* is the route--a git reference and start path--that leads to a unique <<content-source-root,content source root>>. +Content sources are specified in an Antora playbook file. +But before configuring your site's playbook, you need to set up the required directories and sorted your content source files into them at each content source root. + +[#content-source-root] +== What is a content source root? + +A [.term]*content source root* is a unique location from where Antora begins collecting content source files. +Think of the content source root as the starting line for a race. +From a content source root, Antora expects to find an [.path]_antora.yml_ file and a collection of source files that are organized into a xref:standard-directories.adoc[standard set of directories]. +A repository can host a multitude of content source roots, even within a single branch in certain scenarios. + +//// +A content source root is specified by a git reference and start path that's configured in a playbook file. +The git reference is the URL or file system location of a repository and specified branch or tag. +The start path is where Antora should find a component version descriptor file named [.path]_antora.yml_ and the required directory structure. +Because a git reference (repository + branch/tag) can lead to numerous unique locations when a start path is specified, a single repository branch or tag can contain more than one content source. +//// -- GitLab From 2b236827dd9699cf03563fc684aebce99cd0e676 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:48:42 -0600 Subject: [PATCH 16/39] write standard file and directory set page --- .../ROOT/pages/standard-directories.adoc | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 docs/modules/ROOT/pages/standard-directories.adoc diff --git a/docs/modules/ROOT/pages/standard-directories.adoc b/docs/modules/ROOT/pages/standard-directories.adoc new file mode 100644 index 000000000..38f5547ea --- /dev/null +++ b/docs/modules/ROOT/pages/standard-directories.adoc @@ -0,0 +1,103 @@ += Standard File and Directory Set +:page-aliases: component-structure.adoc +:xrefstyle: short +:listing-caption: Example +//Antora extracts the metadata that defines a documentation component from its component version descriptor ([.path]_antora.yml_) and the standard set of directories structure used to store the component version's source files. +//Antora also uses this structure to assign preset behavior to the files stored in each directory. + +Antora collects and processes content source files that are stored in a required set of directories. +These directories, as well as the required [.path]_antora.yml_ file and optional navigation files, are recognized by their locations in the hierarchy and because they use reserved names. +Antora uses this [.term]*standard file and directory set* to assign custom metadata and preset behavior to the files stored in each directory. + +== Standard names and hierarchy + +<<fig-all>> shows the hierarchy of the standard file and directory set if all of the possible standard directories are used. +The content source root in <<fig-all>> is a repository. +However, a content source root can also be a directory in a repository, which you can see in <<fig-image>>. + +[#fig-all] +.All required and optional standard files and directories +---- +📒 repository <1> + 📄 antora.yml <2> + 📂 modules <3> + 📂 ROOT <4> + 📂 attachments <5> + 📂 examples <6> + 📂 images <7> + 📂 pages <8> + 📂 partials <9> + 📄 nav.adoc <10> + 📂 a-named-module <11> + 📂 pages +---- +<1> xref:content-source-repositories.adoc#content-source-root[Content source root]. +<2> Required xref:component-version-descriptor.adoc[component version descriptor file]. +This file indicates to Antora that the contents of the _modules_ directory should be collected and processed. +<3> Required [.path]_modules_ directory. +This directory contains xref:module-directories.adoc[one or more module directories]. +<4> Optional xref:root-module-directory.adoc[_ROOT_ module directory]. +<5> Optional xref:attachments-directory.adoc[_attachments_ family directory]. +<6> Optional xref:examples-directory.adoc[_examples_ family directory]. +<7> Optional xref:images-directory.adoc[_images_ family directory]. +<8> Optional xref:pages-directory.adoc[_pages_ family directory]. +<9> Optional xref:partials-directory.adoc[_partials_ family directory]. +<10> Optional navigation file named [.path]_nav.adoc_. +<11> Optional xref:named-module-directory.adoc[named module directory]. + +As you can see in the descriptions above, navigation files and many of the directories are optional. +For instance, if you aren't inserting any images into the content stored in a module directory, then you don't need to create an [.path]_images_ directory. +You can see two examples of simple standard file and directory sets in the <<minimum-requirements,next section>>. + +[#minimum-requirements] +== Minimum standard file and directory set requirements + +From a xref:content-source-repositories.adoc#content-source-root[content source root], Antora must find: + +* An [.path]_antora.yml_ file +* A [.path]_modules_ directory +* At least one module directory +* At least one family directory containing at least one source file + +The [.path]_antora.yml_ file and directories must also be organized in the standard hierarchy from the content source root. + +Let's look at two examples of standard file and directory sets that meet the minimum requirements. +The directory and file set in <<fig-root>> is valid because it contains one module directory, in this case the special _ROOT_, the _ROOT_ module directory contains a family directory, and the required [.path]_antora.yml_ and [.path]_modules_ directory are at the content source root. + +[#fig-root] +.Valid standard file and directory set containing a ROOT module directory +---- +📒 repository <1> + 📄 antora.yml <2> + 📂 modules <3> + 📂 ROOT <4> + 📂 pages <5> + 📄 a-source-file.adoc <6> +---- +<1> Content source root +<2> Required [.path]_antora.yml_ file +<3> Required [.path]_modules_ directory +<4> [.path]_ROOT_ module directory +<5> [.path]_pages_ family directory +<6> Source file for a page + +The standard directory and file set in <<fig-image>> is also valid. + +[#fig-image] +.Valid standard file and directory set containing a named module directory +---- +📒 repository + 📂 courses + 📂 ops-training <1> + 📄 antora.yml <2> + 📂 modules <3> + 📂 rz-interface <4> + 📂 images <5> + 📄 an-image-file.png <6> +---- +<1> Content source root +<2> Required component version descriptor file +<3> Required [.path]_modules_ directory +<4> A module directory named [.path]_rz-interface_ +<5> [.path]_images_ family directory +<6> Source file for an image -- GitLab From c8e2907f6b19d490d6e0e8b80eeaade3b1bc4238 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:55:22 -0600 Subject: [PATCH 17/39] restructure and move module directory content to new pages --- .../ROOT/images/component-dir-structure.png | Bin 25136 -> 0 bytes .../ROOT/images/hyperlemur-dir-structure.png | Bin 27020 -> 0 bytes .../ROOT/images/module-dir-structure.png | Bin 33237 -> 0 bytes .../ROOT/images/root-dir-structure.png | Bin 15654 -> 0 bytes .../ROOT/pages/module-directories.adoc | 90 +++++++++ .../ROOT/pages/module-url-segment.adoc | 53 ++++++ docs/modules/ROOT/pages/modules.adoc | 176 ------------------ .../ROOT/pages/named-module-directory.adoc | 51 +++++ .../ROOT/pages/root-module-directory.adoc | 50 +++++ 9 files changed, 244 insertions(+), 176 deletions(-) delete mode 100644 docs/modules/ROOT/images/component-dir-structure.png delete mode 100644 docs/modules/ROOT/images/hyperlemur-dir-structure.png delete mode 100644 docs/modules/ROOT/images/module-dir-structure.png delete mode 100644 docs/modules/ROOT/images/root-dir-structure.png create mode 100644 docs/modules/ROOT/pages/module-directories.adoc create mode 100644 docs/modules/ROOT/pages/module-url-segment.adoc delete mode 100644 docs/modules/ROOT/pages/modules.adoc create mode 100644 docs/modules/ROOT/pages/named-module-directory.adoc create mode 100644 docs/modules/ROOT/pages/root-module-directory.adoc diff --git a/docs/modules/ROOT/images/component-dir-structure.png b/docs/modules/ROOT/images/component-dir-structure.png deleted file mode 100644 index 9dab5b0ed8c79a3c4b8d5eb44a17965f4fb0400c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25136 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 diff --git a/docs/modules/ROOT/images/hyperlemur-dir-structure.png b/docs/modules/ROOT/images/hyperlemur-dir-structure.png deleted file mode 100644 index 8e04df324a2df589f29f58e1870b77c4cf9416dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27020 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 O7(8A5T-G@yGywqJHDkB{ diff --git a/docs/modules/ROOT/images/module-dir-structure.png b/docs/modules/ROOT/images/module-dir-structure.png deleted file mode 100644 index 2c2b72304e1dd44769f7785f769dc2ee39c5a5c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33237 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 MPgg&ebxsLQ0FF$pLI3~& diff --git a/docs/modules/ROOT/images/root-dir-structure.png b/docs/modules/ROOT/images/root-dir-structure.png deleted file mode 100644 index 3df8affaa1559875d2f40fd2814f1c17b358d0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15654 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 A-v9sr diff --git a/docs/modules/ROOT/pages/module-directories.adoc b/docs/modules/ROOT/pages/module-directories.adoc new file mode 100644 index 000000000..e4acca9dd --- /dev/null +++ b/docs/modules/ROOT/pages/module-directories.adoc @@ -0,0 +1,90 @@ += Module Directories and Modules +:page-aliases: modules.adoc + +[#modules-dir] +== What is the modules directory? + +The [.path]_modules_ directory is required wherever a component version descriptor file ([.path]_antora.yml_) is located. + +---- +📒 repository + 📂 docs <1> + 📄 antora.yml <2> + 📂 modules <3> + 📂 a-directory <4> +---- +<1> Content source root +<2> Required component version descriptor file +<3> Required [.path]_modules_ directory +<4> Antora won't process the files in this directory because it isn't located inside the [.path]_modules_ directory + +Except for [.path]_antora.yml_, the standard directories and their files must reside in a valid hierarchy in the [.path]_modules_ directory. +A [.path]_modules_ directory can contain as many <<module-dir,module directories>> as you require. + +The [.path]_modules_ directory may seem unnecessary, but it keeps documentation source files separate from application code, tests, and other materials if a xref:content-source-repositories.adoc#content-source-root[content source root] is located in a repository that stores non-documentation projects. + +[#module-dir] +== What is a module directory? + +Module directories must be stored in a <<modules-dir,_modules_ directory>>. +A [.term]*module directory* stores the source files for pages, reusable text and example snippets, images, and other content, in one or more xref:family-directories.adoc[family directories]. +The source files stored in a module directory become part of a <<module,module>> in a component version. + +---- +📒 repository + 📂 docs <1> + 📄 antora.yml + 📂 modules + 📂 a-named-module <2> + 📂 pages <3> + 📄 a-source-file.adoc <4> + 📄 nav.adoc <5> +---- +<1> Content source root +<2> A named module directory +<3> _pages_ family directory +<4> A source file for a page +<5> A navigation file + +At a minimum, a module directory must contain at least one xref:family-directories.adoc[family directory] with at least one source file. +A module directory can also contain an optional navigation file. + +There are two types of module directories: xref:named-module-directory.adoc[named module directories] and xref:root-module-directory.adoc[ROOT module directories]. +At runtime, Antora collects the source files stored in the ROOT and named module directories and assigns them to modules. +The <<module,module>> corresponds to the name of the module directory. +For this reason, it's important to carefully consider what files you store in a [.path]_ROOT_ module directory and xref:module-directory-names.adoc[what you name your named module directories]. + +[#module] +== What is a module? + +Antora classifies, assembles, and publishes the content of a xref:component-version.adoc[component version] into one or more modules. +A [.term]*module* is a collection of content that's typically related by concept, stage, feature, or other project-specific criteria. +Antora determines the module a source file belongs to according to its module name. + +A [.term]*module name* is a unique identifier Antora calculates based on the name of the module directory from where it retrieved the content's source files. + +//// +[#where-module-name-is-used] +== Where is the module name used? + +When inserting or linking to content that belongs to another module, you'll specify the target module's name in the page IDs of cross references and the resource IDs for images, examples, and partials. + +In addition to internal processes, Antora uses the module name, except for `ROOT`, as a xref:module-url-segment.adoc[segment in page URLs]. +//// + +//// +All of the content that is assigned to a specific module is often stored in a single <<module-dir,module directory>>. +However, a module can also be assembled from files stored at multiple content source root locations as long as the assigned component name and version are the same and the name of each module directory the content is retrieved from is the same. + +Antora applies additional preset behavior to the files stored in a [.path]_ROOT_ module directory. + +As for named module directories, carefully consider the names you give to these directories because they're used during site configuration and generation. +Antora extracts the name of a module directory and assigns this name as the module coordinate to the source files stored in that directory. + +[#nav-files] +== Navigation files + +A module can contain none, one, or numerous navigation files. +A xref:navigation:filenames-and-locations.adoc[navigation file] is an AsciiDoc file (e.g., [.path]_nav.adoc_) that is stored in the directory of the module, but not in any of the module's family subdirectories. +In order to be displayed in the xref:navigation:index.adoc[component version's page menu], a navigation file must be xref:component-navigation.adoc[declared in the component version descriptor]. +//// diff --git a/docs/modules/ROOT/pages/module-url-segment.adoc b/docs/modules/ROOT/pages/module-url-segment.adoc new file mode 100644 index 000000000..0d432f9c9 --- /dev/null +++ b/docs/modules/ROOT/pages/module-url-segment.adoc @@ -0,0 +1,53 @@ += Module Segment in Page URLs +:xrefstyle: short +:listing-caption: Example + +[#root-module-urls] +== URLs for ROOT module pages + +When a ROOT module's xref:pages-directory.adoc[pages] are published to a site, they become the top-level pages of their assigned xref:component-version.adoc[component version]. +That means the xref:root-module-directory.adoc[module name], _ROOT_, is never displayed in the site's page URLs. + +To demonstrate this concept, let's compare the URLs of two pages, one assigned to a ROOT module and one assigned to a named module. +The xref:standard-directories.adoc[standard directory structure] illustrated in <<fig-modules>> contains content source files for a project named _Hyper Lemur_. + +[#fig-modules] +.Two module directories containing content that's part of the Hyper Lemur project +---- +📒 repository + 📄 antora.yml + 📂 modules + 📂 admin + 📂 pages + 📄 user-management.adoc + 📄 nav.adoc + 📂 ROOT + 📂 images + 📂 pages + 📄 deploy.adoc + 📄 index.adoc + 📄 nav.adoc +---- + +Notice the file named [.path]_deploy.adoc_ in the [.path]_pages_ directory of the [.path]_ROOT_ module directory. +When Antora generates a documentation site for Hyper Lemur, the URL for the page created from the [.path]_deploy.adoc_ source file will look like this. + +image::root-page-url.svg[ROOT module page URL,role=grow-x] + +The base URL, _\https://my-company.com_, xref:playbook:configure-site.adoc#configure-url[is set in the playbook] that Antora used to generate the site. +The component name segment, _hyperlemur_, and version segment, _1.0_, are set in the xref:component-version-descriptor.adoc[component version descriptor]. +The page segment, _deploy_, is the basename of the AsciiDoc source file [.path]_deploy.adoc_. +The name of the module, _ROOT_, isn't in the URL. + +Now, let's see what the URL of a page stored in the named module, _admin_, would look like. + +[#named-module-urls] +== URLs for named module pages + +Using the Hyper Lemur source files in <<fig-modules>>, let's see what the URL for the [.path]_user-management.adoc_ file would look like. +The file is assigned to the _pages_ family of the _admin_ module. + +//.URL for user-management.adoc page in a-module +image::module-page-url.svg[Named module page URL,role=grow-x] + +Notice that the xref:named-module-directory.adoc#named-module[name of the module], _admin_, is in the URL directly after the component's version. diff --git a/docs/modules/ROOT/pages/modules.adoc b/docs/modules/ROOT/pages/modules.adoc deleted file mode 100644 index d439ad69b..000000000 --- a/docs/modules/ROOT/pages/modules.adoc +++ /dev/null @@ -1,176 +0,0 @@ -= Modules, Families, and Subdirectories -:xrefstyle: short -:image-caption: Figure - -== What is a module? - -A documentation component is composed of one or more modules. -A [.term]*module* is a discrete bundle of content that is usually related by concept, stage, feature, or workflow. -A module can contain full page text files, reusable text and example snippets, images, and other source materials that are organized into <<family,families>>. -The content associated with a module is stored in a module directory and its files are sorted into family subdirectories. - -== Module directory names and structure - -A module directory represents a module in a documentation component. -A component's module directories must reside in the xref:component-structure.adoc#modules-dir[_modules_ directory]. -<<fig-1>> illustrates a documentation component with three module directories. -You can create as many module directories as you require. - -.Directory structure of a documentation component containing two named modules and a ROOT module. -[#fig-1] -image::module-dir-structure.png[alt="Directory structure of a component containing three modules. The ROOT module contains all of the possible family subdirectories.",width="240"] - -<<fig-1>> contains two directories that represent named modules, [.path]_a-named-module_ and [.path]_another-named-module_. -You choose the directory name of a named module. -This directory name is then used as the module coordinate in a resource ID, so it can't contain spaces. -If your team often references pages, examples, images, or partials across modules, they'll have to type the target file's module coordinate in a resource ID, so don't make the directory name hard to remember or extremely long. - -In addition to being the module coordinate, the directory name of a module, with the exception of the special [.path]_ROOT_ directory, also appears in the site's output path. -See <<named-module-urls>> to learn more. - -Inside of a module directory, you can create one or more <<family,family subdirectories>>. -Antora recognizes family subdirectories named [.path]_attachments_, [.path]_examples_, [.path]_images_, [.path]_pages_, and [.path]_partials_. -In <<fig-1>>, the [.path]_a-named-module_ directory contains two family subdirectories while the [.path]_ROOT_ directory just happens to contain all five possible family subdirectories. - -Let's examine the role of the ROOT module in more depth. - -[#root-dir] -=== ROOT module - -The [.term]*ROOT module* typically contains the content that's directly associated with the documentation component itself. - -image::root-dir-structure.png[alt="Directory structure of the ROOT module that uses the subdirectories named examples, pages, and partials.",width="190"] - -The directory name, [.path]_ROOT_, as well as when the module coordinate, `ROOT`, is used in a resource ID, must be written in uppercase. - -We recommend you create a [.path]_ROOT_ module directory in your component because Antora automatically applies component-level URLs to the <<pages-dir,page files>> stored in it. -When the pages in the ROOT module are published, these pages are promoted a level above any other modules`' pages in that component's URL. -This means that, unlike the named modules, the directory name [.path]_ROOT_ isn't displayed in the site's output path. -You can see an example of a ROOT page's URL in <<root-module-urls>>. - -Small documentation components may never need more than a ROOT module. -However, as your project grows, you can easily add more modules and gradually redistribute the content without having to restructure the project. -So while the extra structure seems like overkill now, in the long run, you'll be glad you gave your content the space to grow. - -Now, let's review the requirements of each of the family subdirectories in more detail. - -[#family] -== What is a family? - -A [.term]*family* is a collection of files in a module that share the same content type or output role. -These files are stored in the standardized family subdirectories, [.path]_attachments_, [.path]_examples_, [.path]_images_, [.path]_pages_, and [.path]_partials_, within a module. -Antora automatically assigns preset behavior to the files it finds in these subdirectories. -Example, image, page, and partial files can be referenced by any module or component using Antora's resource IDs. -(The ability to reference attachments using a resource ID is coming soon.) - -[#attachments-dir] -== Attachments - -image::attachments-dir.png[The attachments subdirectory of a module,179] - -An attachment is a resource, such as the ZIP archive of a sample project, that a site visitor can download via a link. -Attachment files are saved in the [.path]_attachments_ directory. -A link to an attachment is created using the xref:asciidoc:link-attachment.adoc[AsciiDoc link macro]. - -=== Binaries and other large files - -If your documentation component contains large attachment files, such as sample project binaries, libraries, or PDFs, we don't recommend storing them in a regular git repository. -Instead, host them in a binary repository such as Bintray or S3, or use git LFS (Large File Storage). - -[#examples-dir] -== Examples - -image::examples-dir.png[The examples subdirectory of a module,176] - -The [.path]_examples_ directory contains non-AsciiDoc file types, such as source code or sample data sets. -An example is inserted into a page using the xref:asciidoc:include-example.adoc[AsciiDoc include directive and the example's resource ID]. - -[#images-dir] -== Images - -image::images-dir.png[The images subdirectory of a module,176] - -Photographs, diagrams, screenshots, and other graphics files are saved in the [.path]_images_ directory. -They're inserted into a page using the xref:asciidoc:insert-image.adoc[block or inline image macros]. -AsciiDoc supports PNG, JPG, SVG, and GIF (static and animated) image file formats. - -[#pages-dir] -== Pages - -image::pages-dir.png[The pages subdirectory of a module,174] - -AsciiDoc files destined to become xref:page:index.adoc#standard[site pages] are stored in the [.path]_pages_ directory of a module. -These files are converted to HTML and automatically published as individual pages in the generated site. - -[#root-module-urls] -=== URLs for ROOT module pages - -When the AsciiDoc files stored in the [.path]_pages_ directory of ROOT are published to a documentation site, they're promoted a level above any other modules`' pages in that component's URL. -To demonstrate this concept, let's compare the URLs of two pages, one from a ROOT module and one from a named module. -The standardized directory structure illustrated in <<fig-2>> contains the documentation for a software product named _Hyper Lemur_. -Notice that there is a file named [.path]_deploy.adoc_ in the [.path]_pages_ directory of ROOT. - -.Directory structure of the Hyper Lemur documentation. -[#fig-2] -image::hyperlemur-dir-structure.png[,260] - -When Antora generates a site that includes the documentation for Hyper Lemur, the URL for the page created from the [.path]_deploy.adoc_ file would look like this. - -//.URL for deploy.adoc page in ROOT module -image::root-page-url.svg[ROOT module page URL,role=grow-x] - -The base URL, _\https://my-company.com_, xref:playbook:configure-site.adoc#configure-url[is set in the playbook] Antora uses to generate the site. -The component name segment, _hyperlemur_, is set by the `name` key in the xref:component-descriptor.adoc#name-key[component descriptor]. -The version segment, _1.0_, is set by the `version` key in the xref:component-descriptor.adoc#version-key[component descriptor]. -The page name segment, _deploy_, is the basename of the AsciiDoc file [.path]_deploy.adoc_. - -Notice that the name of the module, _ROOT_, isn't in the URL. -Now, let's see what the URL of a page stored in the named module, _admin_, would look like. - -[#named-module-urls] -=== URLs for named module pages - -AsciiDoc files stored in the [.path]_pages_ directory of named modules are preceded by the name of the module. -The module name is the name of the module directory where that page is stored. -Using the Hyper Lemur documentation shown in <<fig-2>>, let's see what the URL for the [.path]_user-management.adoc_ file stored in the [.path]_pages_ directory of the _admin_ module would look like. - -//.URL for user-management.adoc page in a-module -image::module-page-url.svg[Named module page URL,role=grow-x] - -Notice that the name of the module, _admin_, is in the URL directly after the documentation component's version. - -[#partials-dir] -== Partials - -image::partials-dir.png[The partials subdirectory of a module,177] - -xref:page:index.adoc#partial[Partials] are AsciiDoc files that contain reusable content snippets such as product descriptions and definitions. -They're stored in the [.path]_partials_ directory in a module. -A partial file or a tagged portion of a partial file is inserted into a page using the xref:asciidoc:include-partial.adoc[AsciiDoc include directive and the partial's resource ID]. - -[#assets-dir] -.Assets -**** -A module can also contain a directory named [.path]_assets_. -This is an alternate location, recognized by Antora, where the [.path]_attachments_ and [.path]_images_ family subdirectories can be placed. - -image::component-dir-structure-with-assets.png[The assets subdirectory of a module that contains an images folder and an attachments folder,200] - -You don't need to set the path to these predefined subdirectories in the header of your AsciiDoc files. -This is managed automatically by Antora. -**** - -//[#videos-dir] -//=== Video files - -//Self-hosted video files are saved in [.path]_assets/videos_ in the same module where the page that references that video is located. -//Videos are inserted into a page using the xref:asciidoc:embed-video.adoc[AsciiDoc video macro]. - -//// -For instance: - -* Full page AsciiDoc documents go in the [.path]_pages_ directory. -* Photographs, diagrams, screenshots, and other graphics go in the [.path]_images_ directory. -* Source code snippets and terminal output go in the [.path]_examples_ directory. -* Reusable, AsciiDoc content snippets, such as product descriptions and definitions, go in the [.path]_partials_ directory. -//// diff --git a/docs/modules/ROOT/pages/named-module-directory.adoc b/docs/modules/ROOT/pages/named-module-directory.adoc new file mode 100644 index 000000000..126f67749 --- /dev/null +++ b/docs/modules/ROOT/pages/named-module-directory.adoc @@ -0,0 +1,51 @@ += Named Module Directory +:xrefstyle: short +:listing-caption: Example + +== What's a named module directory? + +Named module directories are xref:module-directories.adoc#module-dir[optional module directories] that are located in a xref:module-directories.adoc#modules-dir[_modules_ directory]. +You can create as many named module directories as you need. + +[#fig-named] +.Named module directories +---- +📒 repository + 📂 docs <1> + 📄 antora.yml <2> + 📂 modules <3> + 📂 a-named-module <4> + 📂 pages <5> + 📄 a-source-file.adoc <6> + 📄 nav.adoc <7> + 📂 get-started <8> + 📂 pages + 📄 a-source-file.adoc +---- +<1> Content source root +<2> Required [.path]_antora.yml_ file +<3> Required [.path]_modules_ directory +<4> A named module directory +<5> [.path]_pages_ family directory +<6> A source file for a page +<7> A navigation file +<8> Another module directory, named [.path]_get-started_ + +A <<named-module,module's name>> corresponds to the name of the module directory. +For this reason, it's important to carefully consider xref:module-directory-names.adoc[what you name your named module directories]. +At a minimum, a named module directory must contain at least one xref:family-directories.adoc[family directory] with at least one source file. +A named module directory can also contain an optional navigation file. + +[#named-module] +== What's a named module? + +Source files in each named module directory become part of a named module in a xref:component-version.adoc[component version]. +The name of a module corresponds to the name of a module directory. +For instance, source files stored in the [.path]_get-started_ module directory shown in <<fig-named>> will be assigned to the module `get-started`. + +[#where-name-is-used] +== Where is a module's name used? + +When you target content that belongs to a named module from another module or component version, you'll specify the module's name in the page IDs of cross references and the resource IDs for images, examples, and partials. + +The module's name is also used as a xref:module-url-segment.adoc#named-module-urls[segment in page URLs]. diff --git a/docs/modules/ROOT/pages/root-module-directory.adoc b/docs/modules/ROOT/pages/root-module-directory.adoc new file mode 100644 index 000000000..2dbd0d4a1 --- /dev/null +++ b/docs/modules/ROOT/pages/root-module-directory.adoc @@ -0,0 +1,50 @@ += ROOT Module Directory + +[#root-dir] +== What's a ROOT module directory? + +The [.path]_ROOT_ directory is an xref:module-directories.adoc#module-dir[optional module directory]. +A [.path]_ROOT_ module directory is located in a xref:module-directories.adoc#modules-dir[_modules_ directory], and its name must be written in all uppercase letters. +A [.path]_ROOT_ directory stores content source files in one or more of the xref:family-directories.adoc[family directories]. + +---- +📒 repository + 📂 docs <1> + 📄 antora.yml <2> + 📂 modules <3> + 📂 ROOT <4> + 📂 pages <5> + 📄 a-source-file.adoc <6> + 📄 nav.adoc <7> +---- +<1> Content source root +<2> Required [.path]_antora.yml_ file +<3> Required [.path]_modules_ directory +<4> [.path]_ROOT_ module directory +<5> [.path]_pages_ family directory +<6> A source file for a page +<7> A navigation file + +At a minimum, a [.path]_ROOT_ module directory must contain at least one xref:family-directories.adoc[family directory] with at least one source file. +It can also contain an optional navigation file. + +The source files stored in a [.path]_ROOT_ directory become part of a <<root-module,ROOT module>> in a component version. +It's recommended that you create a [.path]_ROOT_ module directory because Antora applies special preset behavior to the pages in a <<root-module,ROOT module>>. + +Small documentation projects may never need more than a [.path]_ROOT_ module directory. +However, as your project grows, you can easily add more module directories and gradually reorganize your source files. +While the extra structure seems like overkill now, in the long run, you'll be glad you gave your content the space to grow. + +[#root-module] +== What's a ROOT module? + +Source files that are stored in a [.path]_ROOT_ directory become part of a module named `ROOT` in a xref:component-version.adoc[component version]. +A ROOT module's pages become the top-level pages of a component version. + +[#where-root-name-is-used] +== Where is the ROOT module name used? + +When you target content that belongs to a ROOT module from another module or component version, you'll specify the module name `ROOT` in the page IDs of cross references and the resource IDs for images, examples, and partials. +`ROOT` is always written in uppercase letters when it's specified. + +Since Antora considers the pages in a ROOT module to be top-level component version pages, the module name `ROOT` isn't displayed in the xref:module-url-segment.adoc#root-module-urls[module segment of its page URLs]. -- GitLab From 538d7245540d019d81fa606489706b2530a41427 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:57:28 -0600 Subject: [PATCH 18/39] move content source versioning sections --- .../ROOT/pages/component-versions.adoc | 143 ------------------ .../content-source-versioning-methods.adoc | 62 ++++++++ 2 files changed, 62 insertions(+), 143 deletions(-) delete mode 100644 docs/modules/ROOT/pages/component-versions.adoc create mode 100644 docs/modules/ROOT/pages/content-source-versioning-methods.adoc diff --git a/docs/modules/ROOT/pages/component-versions.adoc b/docs/modules/ROOT/pages/component-versions.adoc deleted file mode 100644 index 801eba052..000000000 --- a/docs/modules/ROOT/pages/component-versions.adoc +++ /dev/null @@ -1,143 +0,0 @@ -//// -TODO: explain how this relates to page versions -//// -= Component Versions and Branches - -Although there isn't necessarily a relationship between version control repository branches or tags, as specified in the playbook, and component versions, relating these results in a simple, convenient, flexible, and easy to understand organization. - -In this scheme, versions of a xref:component-structure.adoc[documentation component] are stored in branches in a version control repository such as git. -The name of the branch itself doesn't matter. -It's the version property in the component descriptor that determines the name of the version for the component. - -== Branches as versions - -As with software, in this scheme we use branches to store different versions of the documentation. -Branches are ideally suited for managing multiple versions of the same content. - -If we didn't use branches to specify versions, but instead used, for example, folders with trailing version numbers, all stuffed in a single branch, then we'd have to explicitly duplicate all the files in a documentation component for each version. -And we'd have no easy way to compare, manage, and merge different instances of a document. - -Branches handle all this for us. -Creating a new branch is extremely cheap. -You simply create a new branch from an existing reference in the repository, and the repository only stores what's changed since that branch point. - -== Setting the version for a branch - -To set the version of documentation stored in a particular branch, you specify the xref:component-descriptor.adoc#version-key[version in the component descriptor]: - -[source,yaml] ----- -name: versioned-component -version: '2.1' -title: Versioned Component ----- - -This component descriptor communicates that the files taken from this branch contribute to the 2.1 version of the component named versioned-component. -The name of the branch could be v2.1 or v2.1-beta. -It doesn't matter. - -The component descriptor is the only file you have to update when creating a new branch. -All the page references for that component should be relative to the version, so you shouldn't need to update any links. -The next time you run Antora on the repository, you'll see a new version in the component explorer drawer. - -You may need to add the xref:playbook:configure-content-sources.adoc#branches[branch to your playbook file]. -Keep in mind that content sources are filtered by branch name, not by the version they contain. -That's because xref::component-structure.adoc#distributed[a single version can be spread out across multiple branches, or even multiple repositories]. - -[#version-sorting] -== How Antora sorts versions - -Antora sorts the versions of each component. -Understanding how Antora sorts versions is important when choosing your versioning scheme so you can achieve the ordering you want. - -Antora applies the following rules when sorting component versions: - -* Separate named versions from semantic versions. - ** A semantic version is identified either as an integer (e.g., 2 or 30) or a string that starts with a digit and contains at least one dot (.) character (e.g., 2.0.1 or 30.5). -A semantic version may begin with an optional leading "`v`" (e.g., v2.0.1), which is ignored when sorting. - ** All other versions are assumed to be named versions. - ** Although the version named `master` has special meaning when <<versionless-urls,creating URLs for a component version>>, it's given no special treatment when sorting. -* Sort named versions (including `master`) in reverse (i.e., descending) alphabetical order and add them to the list. - ** The assumption is that named versions that fall later in the alphabet are newer. - ** Upper characters come before lower characters (e.g., "`A`" comes before "`a`", meaning it's newer) -* Sort semantic versions in descending order and add them to the list. - ** Discard the leading "`v`", if present. - ** Apply the ordering rules for semantic versioning as defined by https://semver.org. - -Here's an example of a version list that has been sorted according to these rules: - -.... -wily -vivid -utopic -v3.10 -v3.9 -v2.0 -.... - -Whenever Antora displays versions in the UI, it presents them in this order. -Bear in mind that if a display version is specified, the display version is shown instead. -The display version allows the sortable version to differ from the version displayed in the UI. -Thus, to the reader's eyes, the versions may not appear to be sorted in the order described. - -[#prerelease-versions] -== Prerelease versions - -A version may be designated as a [.term]*prerelease version* by assigning a value to the `prerelease` key in [.path]_antora.yml_. -For example: - -[source,yaml] ----- -name: versioned-component -version: '2.2' -prerelease: Beta -title: Versioned Component ----- - -This assignment has two consequences: - -* If the value of the `prerelease` key is a non-empty string, and the `display_version` is specified, the `prerelease` value is appended to the value of the `version` key to generate the `display_version` (e.g., `2.2 Beta`). - ** If the `prerelease` value begins with a hyphen (`-`) or dot (`.`), no space is added when appending the `prerelease` value. - ** Otherwise, the `prerelease` value is separated from the `version` value by a single space. - ** If the `display_version` key is set, that value overrides the computed value just described. -* The version will be skipped when determining the latest version (unless all versions are prerelease versions, in which case it is not skipped). - -[#latest-version] -== Choosing the latest version - -In addition to sorting versions, Antora selects the latest version of each component. -The sorting rules previously covered impact how the latest version is selected. - -The [.term]*latest version* is normally the first version in the sorted list that's not a prerelease. -However, if all versions are prereleases, then the first version in the list is selected. - -Antora uses the latest version when qualifying a resource ID if it cannot otherwise determine the version. -It also uses the latest version when determining the default URL for a component. - -The latest version is available as a property on each component in the xref:antora-ui-default::templates.adoc#site[UI model]. -The latest version information is typically used to inform the reader if there's a newer version of the documentation available. - -[#versionless-urls] -== Versionless URLs - -The version of the component is normally included as a segment in the URL of publishable files. -For example, if the version is a named version like `latest` or a semantic version like `2.1`, that value will appear in the URL (and, by association, the output path) of these files (e.g., [.path]_/component-name/2.1/page-name.html_). - -The exception to this rule is if the version matches the reserved word `master`. -In this case, Antora *does not* include the version segment in the URL for publishable files in that component version. - -Here's an example of a component version that will have versionless URLs: - -[source,yaml] ----- -name: tutorials -version: master -title: Tutorials ----- - -A page with the filename [.path]_build-a-restful-web-service.adoc_ in this component version would have the URL `/tutorials/build-a-restful-web-service.html`. -When making a qualified reference to this page, you'd still include the version as you normally would (e.g., `master@tutorials::build-a-restful-web-service.adoc`). - -If the component only has a single version, and that version matches the reserved word `master`, we say that the component is a [.term]*versionless component*. -That's because when the component only has one version, and that version doesn't show up in the URL, it appears to the reader as though the component has no versions. -Most often, the `master` version is only used when making a versionless component. diff --git a/docs/modules/ROOT/pages/content-source-versioning-methods.adoc b/docs/modules/ROOT/pages/content-source-versioning-methods.adoc new file mode 100644 index 000000000..603fb7c9b --- /dev/null +++ b/docs/modules/ROOT/pages/content-source-versioning-methods.adoc @@ -0,0 +1,62 @@ += Content Source Versioning Methods +:page-aliases: component-versions.adoc + +== Component versions and branches + +Although there isn't necessarily a relationship between version control repository branches or tags, as specified in the playbook, and component versions, relating these results in a simple, convenient, flexible, and easy to understand organization. + +In this scheme, versions of a documentation component are stored in branches in a version control repository such as git. +The name of the branch itself doesn't matter. +It's the xref:component-name-and-version.adoc#version-key[version key] in the xref:component-version-descriptor.adoc[component version descriptor] that determines the version. + +== Version content using branches + +As with software, in this scheme we use branches to store different versions of the documentation. +Branches are ideally suited for managing multiple versions of the same content. + +If we didn't use branches to specify versions, but instead used, for example, folders with trailing version numbers in a single branch, then we'd have to explicitly duplicate all the files in a documentation component for each version. +And we'd have no easy way to compare, manage, and merge different instances of a document. + +Branches handle this for us. +Creating a new branch is extremely cheap. +You simply create a new branch from an existing reference in the repository, and the repository only stores what's changed since that branch point. + +== Version content using tags + +== Version content using directories + + +== Learn more +// The list items IDs exist because they're the previous section IDs for sections that were originally in the aliased page, but have now become their own pages. + +* xref:component-name-and-version.adoc[Define a component name and version with antora.yml] +* [[version-sorting]]xref:how-component-versions-are-sorted.adoc[How are component versions sorted?] +* [[versionless-urls]]xref:component-with-no-version.adoc[Define a component version with no version] + + +//// +This section is going to become a new page + +== Setting the version for a branch + +To assign a version to a component version stored in a particular branch, you set the xref:component-name-and-version.adoc#version-key[version key in the component version descriptor]: + +[source,yaml] +---- +name: versioned-component +version: '2.1' +title: Versioned Component +---- + +This component version descriptor communicates that the files taken from this branch contribute to the `2.1` version of the component named `versioned-component`. +The name of the branch where the component version's source files are stored could be _v2.1_ or _v2.1-beta_. +It doesn't matter. + +The component version descriptor is the only file you have to update when creating a new branch. +All the page references for that component version should be relative to the version, so you shouldn't need to update any links. +The next time you run Antora on the repository, you'll see a new version in the component explorer drawer. + +You may need to add the xref:playbook:configure-content-sources.adoc#branches[branch to your playbook file]. +Keep in mind that content sources are filtered by branch name, not by the version they contain. +That's because xref::component-structure.adoc#distributed[a single component version's source files can be located in multiple branches, or even multiple repositories]. +//// -- GitLab From 79f3cbff3a7701632fe64e058b80fa04eec82588 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 19:59:35 -0600 Subject: [PATCH 19/39] write how to organize your content page --- .../ROOT/pages/component-structure.adoc | 95 ------------------- .../ROOT/pages/organize-content-files.adoc | 41 ++++++++ 2 files changed, 41 insertions(+), 95 deletions(-) delete mode 100644 docs/modules/ROOT/pages/component-structure.adoc create mode 100644 docs/modules/ROOT/pages/organize-content-files.adoc diff --git a/docs/modules/ROOT/pages/component-structure.adoc b/docs/modules/ROOT/pages/component-structure.adoc deleted file mode 100644 index facab1607..000000000 --- a/docs/modules/ROOT/pages/component-structure.adoc +++ /dev/null @@ -1,95 +0,0 @@ -= Documentation Components and Repositories -:xrefstyle: short -:image-caption: Figure - -Antora uses content organized into documentation components when it generates a documentation site. - -== What is a documentation component? - -A [.term]*documentation component* typically represents the documentation for a product, application, project, microservice, or training course. -It's a collection of files grouped into modules and families that share common metadata. -Antora can generate a site that only contains one documentation component or a site that contains as many documentation components as you require. -For simplicity, most of this page is written to describe the simple case when a component has one [.path]_antora.yml_ file from one source. -The more complicated distributed component case is described at the end. - -[#overview] -== Standard directory structure of a documentation component - -Antora extracts the metadata that defines a documentation component from its component descriptor file ([.path]_antora.yml_) and the standardized directory structure used to store the component's source files. -//The source files of a documentation component are organized into a standard directory structure. -Antora also uses this structure to automatically assign preset behavior to the files stored in each directory. -<<fig-1>> shows an example of this standard directory structure. - -.Standard directory structure of a documentation component. -[#fig-1] -image::component-dir-structure.png[alt="Directory structure of a component that contains three module directories and the family subdirectories named attachments, images, pages, examples, and partials.",width="240"] - -At a minimum, a documentation component contains: - -* a component descriptor file ([.path]_antora.yml_), -* a [.path]_modules_ directory, -* at least one module directory, such as [.path]_ROOT_ or a named module (that is, a module directory that you name), and -* at least one family subdirectory ([.path]_attachments_, [.path]_examples_, [.path]_images_, [.path]_pages_, or [.path]_partials_). - -[#modules-dir] -=== _modules_ directory - -Except for [.path]_antora.yml_, all of a component's source files must reside in the [.path]_modules_ directory. -This directory allows Antora to locate a documentation component that is stored in a repository or directory with other files, such as an application's source code. - -=== Named and ROOT module directories - -The [.path]_modules_ directory can contain a single module directory or as many module directories as you require. -A module directory represents a module in that documentation component. -A xref:modules.adoc[module] is a discrete bundle of content, such as text, images, and other source materials, that is usually related by concept, stage, feature, or workflow. -The directory name of a module is used as the module coordinate in a resource ID and, with the exception of the special `ROOT` module, appears in the site's output path. - -The xref:modules.adoc#root-dir[_ROOT_ directory is a special module directory]. -Its name doesn't appear in the site's output path. -Instead, it becomes the parent of any named modules in that component. - -=== Family directories - -Each module directory, whether [.path]_ROOT_ or a module you name, can contain any of the following xref:modules.adoc#family[family subdirectories]: - -* xref:modules.adoc#attachments-dir[_attachments_] -* xref:modules.adoc#examples-dir[_examples_] -* xref:modules.adoc#images-dir[_images_] -* xref:modules.adoc#pages-dir[_pages_] -* xref:modules.adoc#partials-dir[_partials_] - -Antora automatically assigns preset behavior to the files in these directories. -For example, AsciiDoc files in [.path]_pages_ are automatically converted to individual HTML pages. - -=== Navigation file - -A module can contain none, one, or numerous navigation files. -A xref:navigation:filenames-and-locations.adoc[navigation file] is an AsciiDoc file ([.path]_nav.adoc_) that is stored in the directory of the module, but not in any of the module's family subdirectories. -In order to be displayed in the xref:navigation:index.adoc[component's navigation menu], the navigation file must be xref:navigation:register-navigation-files.adoc[declared in the component descriptor]. - -=== _antora.yml_ file - -The component descriptor file tells Antora that the contents of the repository or directory are a documentation component. -This file contains crucial metadata that's applied to all of a component's files. -See xref:component-descriptor.adoc[Component Descriptor: antora.yml] to learn about the required and optional information you can assign to a component. - -//Antora easily builds and publishes documentation sites with over 60 documentation components--that are collected from even more repositories since a <<distributed,component can be distributed>>--and hundreds of component versions. - -[#distributed] -.Distributed component -[TIP] -While all of a documentation component's source files can be stored in a single repository, it isn't a requirement. -Antora can collect a component's source files from 5, 25, and even more repositories. -That means a few of a component's modules could be stored in one repository, while the [.path]_examples_ directory of another module is stored in a tutorial repository that's maintained by a training team, and then that same module's pages could be stored in [.path]_pages_ directories across three different repositories. -When a documentation component's source files are stored in multiple repositories, it's referred to as a [.term]*distributed component*. -This capability is provided by the simple, but-oh-so-powerful component descriptor file, [.path]_antora.yml_. - -Recall that an [.path]_antora.yml_ component descriptor specifies the component name and version. -If Antora discovers several [.path]_antora.yml_ files that specify the same component name and version, that component is said to be [.term]*distributed*. -All the sources associated with these [.path]_antora.yml_ files are added to the content catalog and included in the component version. - -Only one [.path]_antora.yml_ file should specify additional metadata, such as the title, start page, display version, and navigation files in addition to the required component name and version. -All other [.path]_antora.yml_ files for that component version should only specify the component name and version. -Results of conflicting or duplicate metadata may be unpredictable. - -Antora will fail with an error if there is a duplicated path/name for navigation or content files across multiple sources for a component. diff --git a/docs/modules/ROOT/pages/organize-content-files.adoc b/docs/modules/ROOT/pages/organize-content-files.adoc new file mode 100644 index 000000000..34a2a6798 --- /dev/null +++ b/docs/modules/ROOT/pages/organize-content-files.adoc @@ -0,0 +1,41 @@ += How to Organize Your Content Files + +Antora generates a site based on configuration input and structural conventions. +Before setting up or reorganizing your repositories, let's go over some key concepts that may impact how you organize and classify your source files. + +== Storing your content source files + +Antora can retrieve source files from a lot of git repositories--and that includes their tags, branches, and directories. +And these repositories don't need to be used exclusively for storing content. +Antora can retrieve files from repositories that also host application code, tests, and other materials. + +In order to fetch source files from multiple and multi-use repositories, Antora requires that each discreet group of files be: + +* Located at a unique xref:content-source-repositories.adoc[content source root] +* Stored with a file named xref:component-version-descriptor.adoc[_antora.yml_] +* Organized into a xref:standard-directories.adoc[standard set of directories] + +== Classifying your content source files + +Antora decouples the source files from their storage locations after it collects them. +//That means the names and URLs of the repositories, branches, tags, and content source roots doesn't have any bearing on a site that's generated from these files. +Except for the family relative path of files stored in a [.path]_pages_ directory, the source files`' storage locations don't impact how they're referenced internally, organized, labeled, and versioned in the published site, or even how their resulting page URLs are constructed when the site is being generated. + +Instead, groups of source files are assigned a component name and version (or no version) using a component version descriptor file named _antora.yml_. +Antora uses these descriptor files to sort and organize the collected source files into component versions. +You can think of a component version as all of the documentation for a version of a project. +For example, you're reading a page in the {page-component-title} {page-component-display-version} component version right now. + +These _antora.yml_ files are how content that belongs to the same version of a project can be stored using a repository (or even more than one repository) and versioning method that supports the team working on it, and also be published to a site using the names, version labels, navigation flows, and URLs that are helpful to the project's users. + +See xref:component-version.adoc[What's a component version?] and xref:component-version-descriptor.adoc[What's antora.yml?] to learn how to assign a component name and version, as well as other optional information, to groups of content source files. + +//// +== What is a documentation component? + +A [.term]*documentation component* typically represents the documentation for a product, application, project, microservice, or training course. +It's a collection of files grouped into modules and families that share common metadata. +Antora can generate a site that only contains one documentation component or a site that contains as many documentation components as you require. +For simplicity, most of this page is written to describe the simple case when a component has one [.path]_antora.yml_ file from one source. +The more complicated distributed component case is described at the end. +//// -- GitLab From 4f425d81feb00db902cf162ac2a095b8f9643fde Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:02:57 -0600 Subject: [PATCH 20/39] move and restructure assets, images, and attachments --- .../ROOT/images/assets-dir-structure.png | Bin 16993 -> 0 bytes docs/modules/ROOT/images/attachments-dir.png | Bin 12505 -> 0 bytes .../component-dir-structure-with-assets.png | Bin 24235 -> 0 bytes docs/modules/ROOT/images/images-dir.png | Bin 13079 -> 0 bytes .../ROOT/pages/attachments-directory.adoc | 35 ++++++++++++++++++ docs/modules/ROOT/pages/images-directory.adoc | 35 ++++++++++++++++++ .../ROOT/partials/assets-directory.adoc | 24 ++++++++++++ .../ROOT/partials/videos-directory.adoc | 7 ++++ 8 files changed, 101 insertions(+) delete mode 100644 docs/modules/ROOT/images/assets-dir-structure.png delete mode 100644 docs/modules/ROOT/images/attachments-dir.png delete mode 100644 docs/modules/ROOT/images/component-dir-structure-with-assets.png delete mode 100644 docs/modules/ROOT/images/images-dir.png create mode 100644 docs/modules/ROOT/pages/attachments-directory.adoc create mode 100644 docs/modules/ROOT/pages/images-directory.adoc create mode 100644 docs/modules/ROOT/partials/assets-directory.adoc create mode 100644 docs/modules/ROOT/partials/videos-directory.adoc diff --git a/docs/modules/ROOT/images/assets-dir-structure.png b/docs/modules/ROOT/images/assets-dir-structure.png deleted file mode 100644 index e865fec92fa65e5db79fb6980a6a4e9823330e91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16993 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 diff --git a/docs/modules/ROOT/images/attachments-dir.png b/docs/modules/ROOT/images/attachments-dir.png deleted file mode 100644 index 6a9abce3706391f60c8ccf8259af3b4fcc9e00cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12505 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 bkN@}F`JyeU{v?-yfq}u()z4*}Q$iB}tfkfq diff --git a/docs/modules/ROOT/images/component-dir-structure-with-assets.png b/docs/modules/ROOT/images/component-dir-structure-with-assets.png deleted file mode 100644 index 0006f2e40c0f73c7113d2171f4697583da7baed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24235 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 E04;2ni2wiq diff --git a/docs/modules/ROOT/images/images-dir.png b/docs/modules/ROOT/images/images-dir.png deleted file mode 100644 index 46a84a70684481e25ba127ce38583bbcd532e5da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13079 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%0A+9a#di` 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 diff --git a/docs/modules/ROOT/pages/attachments-directory.adoc b/docs/modules/ROOT/pages/attachments-directory.adoc new file mode 100644 index 000000000..4b1149edb --- /dev/null +++ b/docs/modules/ROOT/pages/attachments-directory.adoc @@ -0,0 +1,35 @@ += Attachments Directory and Attachment Files + +[#attachments-dir] +== Attachments family directory + +A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_attachments_. + +---- +📂 modules + 📂 ROOT + 📂 attachments <1> + 📄 a-source-file.zip <2> + 📂 pages + 📄 a-source-file.adoc + 📄 nav.adoc +---- +<1> An [.path]_attachments_ family directory in a [.path]_ROOT_ module directory +<2> An attachment source file + +Antora applies preset behavior to the source files stored in an [.path]_attachments_ directory when it generates a site. + +[#attachments] +== Attachments + +An [.term]*attachment* is a resource, such as the ZIP archive of a sample project, that a site visitor can download via a link. +Attachments are stored in an [.path]_attachments_ directory. +A link to an attachment is created in a page or partial using the xref:asciidoc:link-attachment.adoc[AsciiDoc link macro]. +(The ability to reference attachments using a resource ID is coming soon.) + +=== Binaries and other large files + +If your content includes large attachment files, such as sample project binaries, libraries, or PDFs, we don't recommend storing them in a regular git repository. +Instead, host them in a binary repository such as Bintray or S3, or use git LFS (Large File Storage). + +include::partial$assets-directory.adoc[] diff --git a/docs/modules/ROOT/pages/images-directory.adoc b/docs/modules/ROOT/pages/images-directory.adoc new file mode 100644 index 000000000..e74cda4d7 --- /dev/null +++ b/docs/modules/ROOT/pages/images-directory.adoc @@ -0,0 +1,35 @@ += Images Directory and Image Files + +[#images-dir] +== Images family directory + +A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_images_. + +---- +📂 modules + 📂 ROOT + 📂 images <1> + 📄 a-source-file.jpg <2> + 📄 a-source-file.gif + 📂 pages + 📄 a-source-file.adoc + 📄 nav.adoc +---- +<1> An [.path]_images_ family directory in a [.path]_ROOT_ module directory +<2> An image source file + +Antora applies preset behavior to the source files stored in an [.path]_images_ directory when it generates a site. + +[#images] +== Images + +[.term]*Images* are source files, such as photographs, diagrams, and screenshots, that are saved in an [.path]_images_ family directory. + +Images can be inserted into any page or partial, regardless of the module or component version it belongs to, using the xref:asciidoc:insert-image.adoc[block or inline image macros]. +AsciiDoc supports PNG, JPG, SVG, and GIF (static and animated) image file formats. +If an image isn't referenced in an AsciiDoc image macro, its content won't be published to a site. + +NOTE: When referencing an image, you don't need to include the `image` family name in its resource ID. +Antora automatically applies it to a target resource ID in an AsciiDoc image macro. + +include::partial$assets-directory.adoc[] diff --git a/docs/modules/ROOT/partials/assets-directory.adoc b/docs/modules/ROOT/partials/assets-directory.adoc new file mode 100644 index 000000000..b429728d6 --- /dev/null +++ b/docs/modules/ROOT/partials/assets-directory.adoc @@ -0,0 +1,24 @@ +[#assets-dir] +.Assets +**** +A module directory can also contain a directory named [.path]_assets_. +This is an alternate location, recognized by Antora, where the [.path]_attachments_ and [.path]_images_ family directories can be placed. + +---- +📒 repository + 📄 antora.yml + 📂 modules + 📂 ROOT + 📂 assets + 📂 attachments + 📄 a-source-file.zip + 📂 images + 📄 a-source-file.png + 📂 pages + 📄 a-source-file.adoc + 📄 nav.adoc +---- + +You don't need to set the path to these predefined directories in the header of your pages. +This is managed automatically by Antora. +**** diff --git a/docs/modules/ROOT/partials/videos-directory.adoc b/docs/modules/ROOT/partials/videos-directory.adoc new file mode 100644 index 000000000..ebe4ae41f --- /dev/null +++ b/docs/modules/ROOT/partials/videos-directory.adoc @@ -0,0 +1,7 @@ +// Don't use this partial because this feature isn't active. + +[#videos-dir] +== Video files + +Self-hosted video files are saved in [.path]_assets/videos_ in the same module where the page that references that video is located. +Videos are inserted into a page using the xref:asciidoc:embed-video.adoc[AsciiDoc video macro]. -- GitLab From c3a660997fffa20aac9bc97bf8737d926f7e158b Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:06:03 -0600 Subject: [PATCH 21/39] rename quickstart file and page --- .../{quickstart.adoc => install-and-run-quickstart.adoc} | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) rename docs/modules/ROOT/pages/{quickstart.adoc => install-and-run-quickstart.adoc} (94%) diff --git a/docs/modules/ROOT/pages/quickstart.adoc b/docs/modules/ROOT/pages/install-and-run-quickstart.adoc similarity index 94% rename from docs/modules/ROOT/pages/quickstart.adoc rename to docs/modules/ROOT/pages/install-and-run-quickstart.adoc index 9068a2444..3b0690090 100644 --- a/docs/modules/ROOT/pages/quickstart.adoc +++ b/docs/modules/ROOT/pages/install-and-run-quickstart.adoc @@ -1,4 +1,4 @@ -= Antora Quickstart += Install and Run Antora Quickstart :version-node-major: 12 :version-node: {version-node-major}.16.1 :url-node-releases: https://nodejs.org/en/about/releases/ @@ -110,7 +110,7 @@ ui: # <3> url: https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/master/raw/build/ui-bundle.zip?job=bundle-stable snapshot: true ---- -<1> A page from a documentation component to be used as the home page for your site. +<1> A page from a component version to be used as the home page for your site. <2> The `sources` category contains the list of git repository locations, branch name patterns, and other repository properties that Antora uses when aggregating the site content. <3> The `ui` category contains keys that specify the location of the UI bundle and how it should be processed. @@ -131,7 +131,6 @@ You've successfully built your first site with Antora. TIP: For more detailed information about running Antora and troubleshooting help, see xref:run-antora.adoc[Run Antora to generate your site]. -== What's next? +== Learn more -* Check how xref:component-structure.adoc[files are organized] in Antora. -* What xref:page:index.adoc[pages] are available in Antora. +* Learn how to xref:organize-content-files.adoc[organize your content files] for Antora. -- GitLab From 1e19e580f748ff9cc1c0e622bfb1c069a459a0b1 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:08:00 -0600 Subject: [PATCH 22/39] write families; restructure pages, partials, and examples --- docs/modules/ROOT/images/examples-dir.png | Bin 12453 -> 0 bytes docs/modules/ROOT/images/pages-dir.png | Bin 14323 -> 0 bytes docs/modules/ROOT/images/partials-dir.png | Bin 12011 -> 0 bytes .../ROOT/pages/examples-directory.adoc | 39 +++++++++++++ .../ROOT/pages/family-directories.adoc | 48 ++++++++++++++++ docs/modules/ROOT/pages/pages-directory.adoc | 53 ++++++++++++++++++ .../ROOT/pages/partials-directory.adoc | 38 +++++++++++++ 7 files changed, 178 insertions(+) delete mode 100644 docs/modules/ROOT/images/examples-dir.png delete mode 100644 docs/modules/ROOT/images/pages-dir.png delete mode 100644 docs/modules/ROOT/images/partials-dir.png create mode 100644 docs/modules/ROOT/pages/examples-directory.adoc create mode 100644 docs/modules/ROOT/pages/family-directories.adoc create mode 100644 docs/modules/ROOT/pages/pages-directory.adoc create mode 100644 docs/modules/ROOT/pages/partials-directory.adoc diff --git a/docs/modules/ROOT/images/examples-dir.png b/docs/modules/ROOT/images/examples-dir.png deleted file mode 100644 index fd4a42fed8cd556c88419cf1a69b857d77468c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/docs/modules/ROOT/images/pages-dir.png b/docs/modules/ROOT/images/pages-dir.png deleted file mode 100644 index 85db28c95aa9db3f82d4a5688b919e3fec279254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14323 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 diff --git a/docs/modules/ROOT/images/partials-dir.png b/docs/modules/ROOT/images/partials-dir.png deleted file mode 100644 index a96fbdc88de7fac2c6e7eaf5baf43f09e682ce0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12011 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 diff --git a/docs/modules/ROOT/pages/examples-directory.adoc b/docs/modules/ROOT/pages/examples-directory.adoc new file mode 100644 index 000000000..2ebd7f20a --- /dev/null +++ b/docs/modules/ROOT/pages/examples-directory.adoc @@ -0,0 +1,39 @@ += Examples Directory and Example Files + +[#examples-dir] +== Examples family directory + +A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_examples_. + +---- +📂 modules + 📂 a-named-module + 📂 examples <1> + 📄 a-source-file.js <2> + 📂 ROOT + 📂 examples <3> + 📄 a-source-file.rb <4> + 📄 a-source-file.json + 📂 pages + 📄 a-source-file.adoc + 📄 nav.adoc +---- +<1> An [.path]_examples_ family directory in a named module directory +<2> An example source file +<3> An [.path]_examples_ family directory in a [.path]_ROOT_ module directory +<4> An example source file + +Antora applies preset behavior to the source files stored in an [.path]_examples_ directory when it generates a site. + +[#examples] +== Examples + +[.term]*Examples* are source code snippets (e.g., [.path]_runner.js_), terminal output, or sample data sets (e.g., [.path]_choptank-co2.csv_). +The source files for examples are stored in an [.path]_examples_ directory. +Examples shouldn't be confused with the AsciiDoc example block, though they can be inserted into an example block using an include directive. + +If an example isn't referenced in an AsciiDoc include directive, its content won't be published to a site (unlike xref:pages-directory.adoc#pages[pages]). +Examples and tagged regions in an example can be inserted into any page or partial, regardless of the module or component version it belongs to, using the xref:asciidoc:include-partial.adoc[include directive and the example's resource ID]. + +When referencing an example, the `example` family name must be included in its resource ID. +The family name, `example`, is required because the include directive is also used to reference xref:partials-directory.adoc[partial source files]. diff --git a/docs/modules/ROOT/pages/family-directories.adoc b/docs/modules/ROOT/pages/family-directories.adoc new file mode 100644 index 000000000..c4793dddc --- /dev/null +++ b/docs/modules/ROOT/pages/family-directories.adoc @@ -0,0 +1,48 @@ += Family Directories and Families + +Antora assigns preset, format- and content type-specific behavior to the source files stored in the family directories. + +[#family-dir] +== What is a family directory? + +A [.term]*family directory* stores source files that share the same output role (i.e., standalone page, image inserted into a page) and, in some cases, the same file format (i.e., _.adoc_). +Antora recognizes five standard family directories: [.path]_attachments_, [.path]_examples_, [.path]_images_, [.path]_pages_, and [.path]_partials_. + +---- +📒 repository + 📄 antora.yml + 📂 modules + 📂 a-named-module + 📂 attachments + 📂 examples + 📂 images + 📂 pages + 📂 partials +---- + +A family directory can only be stored in a xref:module-directories.adoc#module-dir[module directory]. +At runtime, Antora collects the source files stored in the family directories and assigns them to a <<family,family>> within a xref:module-directories.adoc#module[module] and xref:component-version.adoc[component version]. + +[#family] +== What is a family? + +A [.term]*family* is a classification Antora applies to content collected from a family directory. +The family corresponds to the name of the <<family-dir,family directory>>. +Content is configured, converted, and published according to the preset behavior associated with its assigned family. + +The families are: + +* xref:attachments-directory.adoc[attachments] +* xref:examples-directory.adoc[examples] +* xref:images-directory.adoc[images] +* xref:pages-directory.adoc[pages] +* xref:partials-directory.adoc[partials] + +//// +For instance: + +* Full page AsciiDoc documents go in the [.path]_pages_ directory. +* Photographs, diagrams, screenshots, and other graphics go in the [.path]_images_ directory. +* Source code snippets and terminal output go in the [.path]_examples_ directory. +* Reusable, AsciiDoc content snippets, such as product descriptions and definitions, go in the [.path]_partials_ directory. +//// diff --git a/docs/modules/ROOT/pages/pages-directory.adoc b/docs/modules/ROOT/pages/pages-directory.adoc new file mode 100644 index 000000000..89b5a8980 --- /dev/null +++ b/docs/modules/ROOT/pages/pages-directory.adoc @@ -0,0 +1,53 @@ += Pages Directory and Page Files + +[#pages-dir] +== Pages family directory + +A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_pages_. +Only AsciiDoc source files with the file extension (_.adoc_) should be stored in the [.path]_pages_ directory because Antora applies preset behavior to these files when it runs. + +---- +📂 modules + 📂 a-named-module <1> + 📂 pages <2> + 📄 a-source-file.adoc <3> + 📂 ROOT + 📂 pages + 📄 a-source-file.adoc + 📄 nav.adoc +---- +<1> A named module directory +<2> [.path]_pages_ family directory +<3> AsciiDoc source file with valid _.adoc_ file extension + +A [.path]_pages_ family directory must contain at least one AsciiDoc source file. + +[#pages] +== Pages + +[.term]*Pages* are AsciiDoc source files (_.adoc_) that are stored in a [.path]_pages_ directory. +Each page is automatically converted to HTML and published as an individual page in a site. +Antora uses the file name of each page source file as the page segment in its URL. + +A page can be referenced by any other page, regardless of the component version or module it's assigned to, using the AsciiDoc xref macro and the page's page ID. + + +//// +.pages directories located in two module directories +.... +📂 modules + 📂 get-started <1> + 📂 pages <2> + 📄 tour.adoc <3> + 📂 ROOT + 📂 images + 📂 pages + 📄 index.adoc <4> + 📄 results-and-rewards.adoc + 📄 nav.adoc +.... +<1> Module directory named [.path]_get-started_. +<2> [.path]_pages_ directory stored in the module directory [.path]_get-started_. +<3> Antora will automatically convert the AsciiDoc source file, [.path]_tour.adoc_, that's stored in the [.path]_pages_ directory, into an individual site page, i.e., [.path]_tour.html_. +<4> In some cases, Antora applies default behavior to a source file named [.path]_index.adoc_ that's stored in the [.path]_pages_ directory of the [.path]_ROOT_ module directory. +//// diff --git a/docs/modules/ROOT/pages/partials-directory.adoc b/docs/modules/ROOT/pages/partials-directory.adoc new file mode 100644 index 000000000..c799342eb --- /dev/null +++ b/docs/modules/ROOT/pages/partials-directory.adoc @@ -0,0 +1,38 @@ += Partials Directory and Partial Files + +[#partials-dir] +== Partials family directory + +A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_partials_. + +---- +📂 modules + 📂 a-named-module + 📂 partials <1> + 📄 a-source-file.adoc <2> + 📂 ROOT + 📂 pages + 📄 a-source-file.adoc + 📂 partials <3> + 📄 a-source-file.csv <4> + 📄 nav.adoc +---- +<1> A [.path]_partials_ family directory in a named module directory +<2> A partial AsciiDoc source file +<3> A [.path]_partials_ family directory in a [.path]_ROOT_ module directory +<4> A partial source file + +Antora applies preset behavior to the source files stored in the [.path]_partials_ directory when it generates a site. + +[#partials] +== Partials + +[.term]*Partials* are usually AsciiDoc source files (_.adoc_) that contain content snippets, such as common descriptions, terminology, or reference tables, that you plan to insert in multiple pages. +They may also be reusable UML, STEM, or CSV/TSV content. +The source files for partials are stored in a [.path]_partials_ directory. + +If a partial isn't referenced in an AsciiDoc include directive, its content won't be published to a site (unlike xref:pages-directory.adoc#pages[pages], which are always automatically published). +Partials and tagged regions in a partial can be inserted into any page, regardless of the module or component version that page belongs to, using the xref:asciidoc:include-partial.adoc[include directive and the partial's resource ID]. + +When referencing a partial, the `partial` family name must be included in its resource ID. +The family name, `partial`, is required because the include directive is also used to reference xref:examples-directory.adoc[example source files]. -- GitLab From 6e71b359d53d5ded61ea538d591fefe4bc1a66e5 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:09:20 -0600 Subject: [PATCH 23/39] write module directory name recommendations page --- .../ROOT/pages/module-directory-names.adoc | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 docs/modules/ROOT/pages/module-directory-names.adoc diff --git a/docs/modules/ROOT/pages/module-directory-names.adoc b/docs/modules/ROOT/pages/module-directory-names.adoc new file mode 100644 index 000000000..f9c29f9f7 --- /dev/null +++ b/docs/modules/ROOT/pages/module-directory-names.adoc @@ -0,0 +1,52 @@ += Recommendations for Module Directory Names +:xrefstyle: short +:listing-caption: Example + +When you're creating module directories, you need to consider the team using them and your site's URLs. + +== Selecting module directory names + +Antora calculates the xref:named-module-directory.adoc#named-module[name of a module] from the name of a xref:module-directories.adoc#module-dir[module directory]. +A module name is used in page cross references, image macros, and include directives. +It's also used in the xref:module-url-segment.adoc#named-module-urls[URLs of the pages assigned to that module]. + +When choosing a module directory name, keep the following requirements and recommendations in mind: + +* Named module directories *can't contain blank spaces or forward slashes (`/`)*. +These characters aren't permitted in AsciiDoc cross references, image macros, or include directives. +* If possible, *don't use uppercase letters, underscores (`_`), and other characters that aren't recommended in URLs*. +Such characters can limit web server portability, downgrade site search results, and cause visitor accessibility problems. +* If your team often references pages, examples, images, or partials across modules, they'll have to type a module's name in page and resource IDs, so *don't make the directory name hard to remember or extremely long*. + +<<fig-named>> shows a standard directory structure that contains three named module directories. + +[#fig-named] +.Three named module directories +---- +📒 repository + 📂 docs + 📄 antora.yml + 📂 modules + 📂 gear <1> + 📂 images + 📄 a-source-file.jpg + 📂 la-garita <2> + 📂 pages + 📄 a-source-file.adoc + 📂 ROOT <3> + 📂 pages + 📄 a-source-file.adoc + 📄 nav.adoc + 📂 sdk <4> + 📂 examples + 📄 a-source-file.js + 📂 pages + 📄 a-source-file.adoc + 📄 nav.adoc +---- +<1> Module directory named [.path]_gear_ +<2> Module directory named [.path]_la-garita_ +<3> [.path]_ROOT_ module directory +<4> Module directory named [.path]_sdk_ + +Antora would calculate the following module names from the named module directories in <<fig-named>>: `gear`, `la-garita`, and `sdk`. -- GitLab From f38062e83f1316b969724e415951f9495ed753aa Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:13:14 -0600 Subject: [PATCH 24/39] clean up examples and xrefs; add include directives --- .../ROOT/pages/component-attributes.adoc | 38 ++++--- .../ROOT/pages/component-display-version.adoc | 19 ++-- .../pages/component-name-and-version.adoc | 103 +++++------------- .../ROOT/pages/component-navigation.adoc | 52 +++++++-- .../ROOT/pages/component-start-page.adoc | 37 +++++-- docs/modules/ROOT/pages/component-title.adoc | 11 +- .../pages/component-version-descriptor.adoc | 49 ++++----- .../modules/ROOT/pages/component-version.adoc | 19 ++-- .../environment-and-page-attributes.adoc | 28 ++--- 9 files changed, 175 insertions(+), 181 deletions(-) diff --git a/docs/modules/ROOT/pages/component-attributes.adoc b/docs/modules/ROOT/pages/component-attributes.adoc index 0eca4951e..aab6e0081 100644 --- a/docs/modules/ROOT/pages/component-attributes.adoc +++ b/docs/modules/ROOT/pages/component-attributes.adoc @@ -1,16 +1,21 @@ = Assign Attributes to a Component Version -Built-in and user-defined AsciiDoc attributes as well as `page-` attributes can be declared in a component version descriptor file ([.path]_antora.yml_). -These attributes are applied to all of a component version's pages according to the attribute precedence rules. -Attributes declared in a component version descriptor file are referred to as [.term]*component version attributes*. +You can apply AsciiDoc attributes to all of the pages in a component version by declaring them in its [.path]_antora.yml_ file. + +== Component version attributes + +AsciiDoc document attributes that are defined in a component version descriptor are referred to as [.term]*component version attributes*. +These document attributes can be built-in AsciiDoc attributes, user-defined AsciiDoc attributes, and user-defined or built-in `page-` prefixed attributes that Antora will pass to the reference UI. +These attributes are applied and available to all of a component version's pages according to the attribute precedence rules. [#set-and-unset] == Set and unset attributes in antora.yml Component version attributes are set or unset in a component version's [.path]_antora.yml_ file. -Each attribute is entered on its own line under the `asciidoc` and `attributes` category keys. +First, the `asciidoc` and `attributes` keys must be set. +Then, each component version attribute is entered on its own line under `attributes`. -.Declaring attributes in antora.yml for version-name@component-name +.Declaring attributes in antora.yml [source,yaml] ---- name: light @@ -26,20 +31,17 @@ asciidoc: # <1> nav: - modules/ROOT/nav.adoc ---- -<1> Enter the `asciidoc` key, followed by a colon (`:`), and press kbd:[Enter]. -<2> The `attributes` key is nested under the `asciidoc` key. -Enter `attributes`, followed by a colon (`:`), and press kbd:[Enter]. -<3> Attributes are nested under the `attributes` key. -To declare a user-defined attribute that is available to the site's UI, type `page-` and the name of your component version attribute, followed by a colon (`:`). -Press kbd:[space] once after the colon, then enter the value of the attribute. -<4> This attribute is hard set. -See the <<assign-precedence,next section>> to learn more about hard and soft setting rules. +<1> On a new line, type `asciidoc`, followed by a colon (`:`), and press kbd:[Enter]. +<2> Nest the `attributes` key on the line directly underneath the `asciidoc` key. +Press kbd:[Space] twice, then type `attributes`, followed by a colon (`:`), and press kbd:[Enter]. +<3> Each attribute is nested under the `attributes` key and defined on its own line. +Type the name of the attribute, followed by a colon (`:`). +Press kbd:[space] once after the colon, then type the value of the attribute. +<4> This attribute is <<assign-precedence,hard set>>. <5> When an attribute has multiple, independent values, separate each value with a semicolon (`;`). -<6> To assign the default value, or in the case of a boolean attribute, the _empty string_ value to a built-in AsciiDoc attribute, type two consecutive single quotation marks (`''`) in the value field. -<7> The value `false` soft unsets this attribute. -See the <<assign-precedence,next section>> to learn more about hard and soft unsetting rules. +<6> To assign the default value, or in the case of a boolean AsciiDoc attribute, the _empty string_ value, type two consecutive single quotation marks (`''`) in the value field. +<7> The value `false` <<assign-precedence,soft unsets>> this attribute. -The attributes are applied and available to every page in the component version. The values of user-defined attributes, such as `page-level`, and built-in `page-` attributes can be displayed in a page using the AsciiDoc attribute reference syntax (e.g., `+{page-level}+` or `+{page-version}+`). TIP: Antora declares `page-` attributes for most of the keys in the component version descriptor file. @@ -54,7 +56,7 @@ Pages can't override hard set and unset component version attributes, but they c The following example shows how component version attributes are assigned hard and soft precedence. -.Assigning hard and soft precedence to attributes in antora.yml for version-name@component-name +.Assigning hard and soft precedence to attributes in antora.yml [source,yaml] ---- asciidoc: diff --git a/docs/modules/ROOT/pages/component-display-version.adoc b/docs/modules/ROOT/pages/component-display-version.adoc index 090ea4eb3..fa4ed768e 100644 --- a/docs/modules/ROOT/pages/component-display-version.adoc +++ b/docs/modules/ROOT/pages/component-display-version.adoc @@ -1,13 +1,13 @@ = Customize the Display Version -The `display_version` key is strictly used for presentation purposes in the reference UI when a component version's official version contains uppercase letters, symbols, or blank spaces. -It doesn't affect page and resource IDs, the version segment in the page URL, or how component versions are sorted. +The `display_version` key is strictly used for presentation purposes in the reference UI when a version identifier contains uppercase letters, symbols, or blank spaces. +It doesn't affect page and resource IDs, the version segment in the page URL, or xref:how-component-versions-are-sorted.adoc[how component versions are sorted]. [#display-version-key] == display_version key The `display_version` key is optional. -It's set in a component version's [.path]_antora.yml_ file and used by the reference UI where ever the version is displayed, including the xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and xref:navigation:index.adoc#page-dropdown[page version selector]. +It's set in a component version's [.path]_antora.yml_ file and used by the reference UI where ever the version is displayed, including the xref:navigation:index.adoc#component-dropdown[component version selector] and xref:navigation:index.adoc#page-dropdown[page version selector]. If `display_version` isn't set, the reference UI falls back to xref:component-name-and-version.adoc#version-key[the version key]. Unlike `version`, the value of `display_version` can contain empty spaces, uppercase letters, and most characters (e.g., `3.0 Beta`, `RED WREN!`, `rawhide`). @@ -18,16 +18,15 @@ Unlike `version`, the value of `display_version` can contain empty spaces, upper name: colorado title: Colorado ∆ version: '5.6' -display_version: '5.6 (EOL)' # <1> +display_version: '5.6 EOL' # <1> ---- -<1> If the value starts with a number, enclose it within a set of single quote marks (`'`). +<1> If the value starts with a number, enclose it in a set of single quote marks (`'`). The `display_version` key should be used when a version contains spaces or characters that break Antora's page and resource IDs, prevent portability between web servers, and aren't recommended in URLs. -It's also useful when the component version is a prerelease or is archived since the value of `display_version` doesn't affect page URLs or internal IDs. +It's useful when the component version is a xref:component-prerelease.adoc[prerelease], xref:component-with-no-version.adoc[unversioned], or archived because the value of `display_version` doesn't affect page URLs, page IDs, and resource IDs. -Prerelease versions (e.g., alpha, beta, etc.) can also be configured with xref:component-prerelease.adoc[the prerelease key]. -The `prerelease` key provides additional UI presentation and sorting capabilities. -//The `display_version` key overrides the label assigned to the `prerelease` key when both keys are set in the component version's [.path]_antora.yml_ file. +TIP: The xref:component-prerelease.adoc[prerelease key] provides additional UI routing, sorting, and presentation capabilities. +While the value of the `display_version` key is shown in the UI when both keys are set, the computed prerelease version generated from a xref:component-prerelease.adoc#identifier[prerelease identifier] is used for sorting and routing. [#assign-display-version] == Assign a display_version to a component version @@ -60,4 +59,4 @@ display_version: '7.1 Spiny' . Save the file. -Now, the UI will display _7.1 Spiny_ in the component navigation menu, component version selector, and page version selector. +Now, the UI will display _7.1 Spiny_ in the component version selector and page version selector. diff --git a/docs/modules/ROOT/pages/component-name-and-version.adoc b/docs/modules/ROOT/pages/component-name-and-version.adoc index 7ac8808ca..52f880355 100644 --- a/docs/modules/ROOT/pages/component-name-and-version.adoc +++ b/docs/modules/ROOT/pages/component-name-and-version.adoc @@ -1,4 +1,4 @@ -= Define a Component Version with antora.yml += Define a Component Name and Version //:listing-caption: Example //:xrefstyle: short :note-caption: ASSUMPTIONS @@ -15,23 +15,22 @@ On this page, you'll learn: * [x] How to assign a valid value to the `version` key. * [x] How to enter keys and values in an [.path]_antora.yml_ file. -[#requirements] +[#antora-yml-requirements] == antora.yml requirements -The component version descriptor file must: +A component version descriptor must: * be named [.path]_antora.yml_ * be written in valid YAML * contain the `name` key and its value * contain the `version` key and its value -* be stored xref:component-structure.adoc#overview[at the same directory level as the _modules_ directory] +* be stored xref:module-directories.adoc[at the same directory level as the _modules_ directory] [#name-key] == name key -A component name is assigned in [.path]_antora.yml_ using the `name` key. -The `name` key is required. -The `name` typically represents the name of your project, library, or course (e.g., `fauna`, `rudder`, `nrepl`). +A component name typically represents the name of your project, library, or service (e.g., `fauna`, `rudder`, `nrepl`). +The `name` key is required and assigned in [.path]_antora.yml_. .antora.yml with defined component name [source,yaml] @@ -40,39 +39,44 @@ name: colorado ---- The value can contain letters, numbers, underscores (`+_+`), hyphens (`-`), and periods (`.`). -The value *cannot* contain spaces. +The value *cannot* contain spaces or forward slashes (`/`). TIP: To minimize the likelihood of portability issues between web servers, letters used in the `name` key's value should be lowercase. Antora uses the `name` key when interpreting page and resource IDs and generating the URLs for the component version's pages. -It also uses `name` where ever the component's name is displayed in the reference UI unless the xref:component-title.adoc[title key is set]. -The reference UI shows the component name in the xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and +Unless the xref:component-title.adoc[title key is set], it uses `name` for sorting components in the component version selector and where ever the component's name is displayed in the reference UI, which includes the xref:navigation:index.adoc#component-menu[component version page menu], xref:navigation:index.adoc#component-dropdown[component version selector], and the first breadcrumb position on a component version's pages. [#version-key] == version key -A version, such as an identifier (e.g., `master`, `stable`), code name (e.g., `jesse`), or number (e.g., `1.0`), is assigned to the `version` key in [.path]_antora.yml_. +TIP: If you aren't familiar with how Antora sorts component versions, see xref:how-component-versions-are-sorted.adoc[How are component versions sorted?] before committing to a versioning scheme. + +A version, such as a named identifier (e.g., `master`, `jesse`, `edge`) or semantic identifier (e.g., `1.5`, `8`), is assigned to the `version` key in [.path]_antora.yml_. + The `version` key is required. -The `version` key is used as the version coordinate in page and resource IDs and as the version segment in page URLs. -It's used to xref:component-versions.adoc[sort component versions that have the same name by descending version order] in the reference UI. -When the optional `display_version` key isn't set, the value of `version` is shown in the reference UI's xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and xref:navigation:index.adoc#page-dropdown[page version selector]. +Its value is used: + +* as the version coordinate in page and resource IDs +* as the version segment in page URLs, unless assigned the xref:component-with-no-version.adoc[reserved value master] +* to xref:how-component-versions-are-sorted.adoc[sort component versions] in the reference UI +* for display purposes, unless the optional `display_version` key is set, in the reference UI's xref:navigation:index.adoc#component-dropdown[component version selector] and xref:navigation:index.adoc#page-dropdown[page version selector] .antora.yml with defined component version [source,yaml] ---- name: colorado -version: '5.6' +version: '5.6' # <1> ---- +<1> Values that start with a number should be enclosed in a set of single quote marks (`'`). -The value can contain letters, numbers, periods (`.`), underscores (`+_+`), and hyphens (`-`) (e.g., `2.8`, `rawhide`) -If the value starts with a number, YAML recommends that it be enclosed in a set of single quote marks (`'`). -The value *cannot* contain spaces. +The value can contain letters, numbers, periods (`.`), underscores (`+_+`), and hyphens (`-`). +It *cannot* contain spaces. -TIP: To minimize the likelihood of portability issues between web servers, letters used in the `version` key's value should be lowercase. +TIP: To minimize the likelihood of portability issues between web servers, letters used in the `version` value should be lowercase. -The `version` key isn't related, though it may be similar, to the xref:component-versions.adoc[name of the branch, tag, or directory] where the component version's source files are stored. -See xref:component-versions.adoc#setting-the-version-for-a-branch[Setting the version for a branch] for more examples and xref:component-versions.adoc#versionless-components[Versionless components] to learn how to create a versionless component. +If a component version is unstable or a prerelease, you may want to set the xref:component-prerelease.adoc[optional prerelease key] in addition to `version`. +xref:component-with-no-version.adoc[Unversioned or version-less component versions] can be defined using the reserved value `master`. [#assign-name-and-version] == Assign a name and version to a component version @@ -105,63 +109,12 @@ version: '7.1' That is, it should be located adjacent to the [.path]_modules_ directory. You've now associated a set of source files with a component version! -When Antora runs, all of the subsequent subdirectories and source files will be assigned the component name `silver-leaf` and the version `7.1`. -These values will also be used as page and resource ID coordinates and in the URLs of the pages generated from the component version's source files. +When Antora runs, all of the xref:standard-directories.adoc[subsequent subdirectories and source files] will be assigned the component name `silver-leaf` and the version `7.1`. +These values will be used as page and resource ID coordinates and in the URLs of the pages generated from the component version's source files. [#optional-keys] == Optional antora.yml keys You can assign additional metadata, designate a component version as a prerelease, apply AsciiDoc attributes, and register a component version's navigation list and start page using the component version descriptor. -[cols="1,3"] -|=== -|Key |Description - -|xref:component-attributes.adoc[asciidoc] -|Accepts the `attributes` key and its nested list of `key: value` pairs. - -|xref:component-attributes.adoc[attributes] -|Requires the `asciidoc` key. -Accepts a nested list of `key: value` pairs that represent AsciiDoc attributes (e.g., `idseparator: '-'`, `page-level: Advanced`) -Attributes that are set or unset in [.path]_antora.yml_ are applied to all of the pages and resources (where applicable) in a component version. - -|xref:component-display-version.adoc[display_version] -|Alternate version displayed in the reference UI's component navigation menu, component version selector, and page version selector. -When `display_version` isn't set, the reference UI falls back to `version`. -`display_version` can accept empty spaces, uppercase letters, and most characters (e.g., `3.0 Beta`, `RED WREN!`). - -|xref:component-navigation.adoc[nav] -|List of navigation files Antora uses to build the component version's navigation menu. -Navigation files (e.g., [.path]_nav.adoc_) that aren't registered under the `nav` key will not be used in the component version's navigation menu. - -|xref:component-prerelease.adoc[prerelease] -|Designates the component version as a prerelease version. -Antora applies alternate sorting and routing rules to component versions marked as prereleases. -Key can be used to append a prerelease label (e.g., Beta, alpha.2) to `version` without affecting the version coordinate or version URL segment. - -|xref:component-start-page.adoc[start_page] -|Specifies that the page corresponding to the assigned page ID is the component version's home page. -By default, Antora uses the [.path]_index.adoc_ file in a component version's ROOT module if `start_page` isn't set. - -|xref:component-title.adoc[title] -|Alternate component name displayed in the reference UI's component navigation menu, component version selector, and page breadcrumbs. -The `title` key can accept empty spaces, uppercase letters, and a broader range of characters (e.g., `SUSE Manager`, `APIkit`). -|=== - -//// -.antora.yml -[#ex-1] -[source,yaml] ----- -name: name-of-component -title: The title of the component used for display in the UI -version: name-of-version -start_page: name-of-a-module:filename.adoc -nav: -- modules/name-of-a-module/nav.adoc -- modules/ROOT/nav.adoc ----- - -The <<name-key>> and <<version-key>> keys are always required. -The <<title>>, <<display-version>>, <<start-page-key>>, and <<nav-key>> keys may be optional depending on the version name, structure, and file names associated with a documentation component. -//// +include::partial$optional-component-version-keys.adoc[] diff --git a/docs/modules/ROOT/pages/component-navigation.adoc b/docs/modules/ROOT/pages/component-navigation.adoc index 31a578d8f..ec8a170cd 100644 --- a/docs/modules/ROOT/pages/component-navigation.adoc +++ b/docs/modules/ROOT/pages/component-navigation.adoc @@ -1,16 +1,48 @@ -= Register a Component Version's Navigation Files += Assign Navigation Files to a Component Version +//:listing-caption: Example +:xrefstyle: short + +On this page, you'll learn: + +* [x] How to register navigation files with the `nav` key in [.path]_antora.yml_. +* [x] How registration order affects the component version's page menu. [#nav-key] == nav key -The `nav` key accepts a list of xref:navigation:filenames-and-locations.adoc[navigation files]. +The `nav` key is optional. +It's set in a component version's [.path]_antora.yml_ file and accepts a list of xref:navigation:filenames-and-locations.adoc[navigation files]. +Each value specifies the path to a navigation file (e.g., [.path]_modules/module-directory/nav-file.adoc_) from [.path]_antora.yml_. + +.antora.yml that registers two navigation files +[source,yaml] +---- +name: colorado +title: Colorado ∆ +version: '5.6' +nav: # <1> +- modules/get-started/nav.adoc # <2> +- modules/ROOT/nav.adoc # <3> +---- +<1> The `nav` key must be entered on its own line and be directly followed by a colon (`:`). +<2> Value registering a navigation file located in the [.path]_get-started_ module directory. +<3> Value registering a navigation file located in the [.path]_ROOT_ module directory. + +Each value listed under `nav` must be structured as follows: + +* Don't indent the values. +* Enter each value on its own line. +* Start each value with a hyphen (`-`), followed by a blank space. +* After the blank space, enter the path to an individual navigation file relative to the location of the [.path]_antora.yml_ file. + +A navigation file is [.term]*registered* when it's assigned to the `nav` key. +Only the xref:navigation:list-structures.adoc[contents of registered navigation files] are assembled into and published as the component version's page menu. +The order of the values dictates the order the contents of the navigation files are displayed in the xref:navigation:index.adoc#component-menu[component version's page menu] on your site. + +== Learn more -```yaml -nav: -- modules/ROOT/nav.adoc -- modules/module-three/nav.adoc -- modules/module-one/install-nav.adoc -``` +Learn more about creating navigation lists and navigation files: -Each xref:navigation:register-navigation-files.adoc[value specifies the path to a navigation file] (e.g., [.path]_modules/name-of-module/name-of-nav-file.adoc_). -The order the values are listed in dictates the order the contents of the navigation files are assembled in the site's xref:navigation:index.adoc#component-menu[component menu]. +* xref:navigation:filenames-and-locations.adoc[Navigation file names and storage locations] +* xref:navigation:list-structures.adoc[Single and multi-list navigation files] +* xref:navigation:link-syntax-and-content.adoc[Navigation link syntax and content formatting] diff --git a/docs/modules/ROOT/pages/component-start-page.adoc b/docs/modules/ROOT/pages/component-start-page.adoc index c82e2b6bf..fa87084fc 100644 --- a/docs/modules/ROOT/pages/component-start-page.adoc +++ b/docs/modules/ROOT/pages/component-start-page.adoc @@ -1,21 +1,34 @@ = Select a Start Page +:listing-caption: Example +:xrefstyle: short + +== Default start page + +By default, Antora looks for a page named [.path]_index.adoc_ in the ROOT module of a component version and uses it as the component version's start page (e.g., _\https://site-url.org/component-name/version/index.html_). +If Antora doesn't find this page, site visitors are directed to a 404 page every time they click on that component version from the xref:navigation:index.adoc#component-dropdown[component version selector]. + +Antora won't look for [.path]_index.adoc_ in the ROOT module when the <<start-page-key,start_page key>> is set in a component version's [.path]_antora.yml_. +Instead, the page assigned to `start_page` will be used as the component version's start page. [#start-page-key] == start_page key -By default, Antora looks for a file named [.path]_index.adoc_ in the ROOT module of a component version. -It uses this page as the component version's start page (e.g., _\https://example.org/component-name/version/index.html_). -If there isn't an [.path]_index.adoc_ file in the ROOT module, you must specify a file as the start page in the component descriptor. +The `start_page` key must be set in [.path]_antora.yml_ when: -```yaml -start_page: getting-started:overview.adoc -``` +. a component version doesn't have a page named [.path]_index.adoc_ in its ROOT module, or +. when Antora should use a an alternate page (that is, not [.path]_index.adoc_, even if it exists) as the component version's start page. -The `start_page` key accepts a xref:page:page-id.adoc[page ID] that points to a page in the component version. +`start_page` accepts a xref:page:page-id.adoc[page ID] that points to a page in the component version. +The page ID must specify a module coordinate. -.*Start page value examples* -* security:get-started.adoc -* ROOT:welcome.adoc -* org-governance:help.adoc +[#ex-start] +.antora.yml +[source,yaml] +---- +name: colorado +title: Colorado ∆ +version: '5.6' +start_page: get-started:overview.adoc +---- -If Antora can't find [.path]_index.adoc_ in a component version's ROOT module and a start page isn't specified in its component version descriptor, site visitors are directed to a 404 page when navigating to that component version from the xref:navigation:index.adoc#component-dropdown[component version selector] on any page. +In <<ex-start>>, the component version's start page, `overview.adoc`, is located in the module `get-started`. diff --git a/docs/modules/ROOT/pages/component-title.adoc b/docs/modules/ROOT/pages/component-title.adoc index ff144ec96..c72b0320c 100644 --- a/docs/modules/ROOT/pages/component-title.adoc +++ b/docs/modules/ROOT/pages/component-title.adoc @@ -1,14 +1,15 @@ = Customize the Title -The `title` key is strictly used for display purposes in the reference UI when a project's official name contains uppercase letters, symbols, or blank spaces. +The `title` key is used for xref:how-component-versions-are-sorted.adoc[sorting the versions by name] and for display purposes in the reference UI when a component name contains uppercase letters, symbols, or blank spaces. +It doesn't affect page and resource IDs or the component name segment in the page URL. [#title-key] == title key The `title` key is optional. -It's set in a component version's [.path]_antora.yml_ file and used by the reference UI where ever the component's name is displayed, including the xref:navigation:index.adoc#component-menu[component navigation menu], xref:navigation:index.adoc#component-dropdown[component version selector], and first breadcrumb position on a component version's pages. +It's set in a component version's [.path]_antora.yml_ file and used by the reference UI where ever the component's name is displayed, including the xref:navigation:index.adoc#component-menu[component version page menu], xref:navigation:index.adoc#component-dropdown[component version selector], and first breadcrumb position on a component version's pages. -If `title` isn't set, the reference UI uses the value of `name` instead. +If `title` isn't set, the reference UI uses the xref:component-name-and-version.adoc#name-key[value of name] instead. Unlike `name`, the value of `title` can contain empty spaces, uppercase letters, and a broader range of characters (e.g., `SUSE Manager`, `APIkit`). .antora.yml @@ -19,7 +20,7 @@ title: Colorado ∆ version: '5.6' ---- -This key should be used when a project's name contains spaces or characters that break Antora's page and resource IDs, prevent portability between web servers, and aren't recommended in URLs. +This key is useful when a project's name contains spaces or characters that break Antora's page and resource IDs, prevent portability between web servers, or aren't recommended in URLs. Also, if the name of your project changes, you can change the value of the `title` key but not have to update page and resource IDs or redirect URLs. [#assign-title] @@ -50,4 +51,4 @@ version: '7.1' . Save the file. -Now, the UI will display _Silver Leaf_ in the component navigation menu, component version selector, and page breadcrumbs. +Now, the UI will display _Silver Leaf_ in the component version page menu, component version selector, and page breadcrumbs. diff --git a/docs/modules/ROOT/pages/component-version-descriptor.adoc b/docs/modules/ROOT/pages/component-version-descriptor.adoc index 885c447d1..df32e7757 100644 --- a/docs/modules/ROOT/pages/component-version-descriptor.adoc +++ b/docs/modules/ROOT/pages/component-version-descriptor.adoc @@ -1,44 +1,39 @@ = What's antora.yml? :page-aliases: component-descriptor.adoc -//When Antora receives instructions from a playbook to scan a content source repository, its first objective is to find a xref:component-version-descriptor.adoc[component version descriptor file named _antora.yml_] in that repository. -//This file marks the subsequent directories and files as part of a xref:component-version.adoc[component version] and classifies the files according to the component name, component version, and other stable metadata it provides. +//When Antora receives instructions from a playbook to scan a content source repository, its first objective is to find a component version descriptor file named _antora.yml_ in that repository. +//This file marks the subsequent directories and files as part of a component version and classifies the files according to the component name, component version, and other stable metadata it provides. -== antora.yml +== Component version marker and descriptor -[.path]_antora.yml_ is a YAML file that has two crucial functions: +The component version descriptor is a configuration file named [.path]_antora.yml_. +It has two crucial functions: -. [.path]_antora.yml_ marks the system location of a set of directories and source files that belong to a component version. -. [.path]_antora.yml_ provides required and optional component version metadata, that Antora assigns to the source files it collects from the system location marked by that [.path]_antora.yml_ file. +. [.path]_antora.yml_ marks the location of a set of directories and source files that belong to a component version. +. [.path]_antora.yml_ provides required and optional component version metadata that Antora assigns to the source files it collects from the marked location. -[#component-version-marker] -== How does antora.yml mark the location of a component version's source files? +[#marker] +== How does Antora use an antora.yml file to find a component version's source files? -A xref:playbook:index.adoc[playbook] tells Antora what xref:playbook:configure-content-sources.adoc[remote repositories and local content sources] it should fetch and use. -Then Antora searches those content sources for [.path]_antora.yml_ files. -Once Antora finds an [.path]_antora.yml_ file, it considers all of the xref:component-structure.adoc[subsequent directories and files] to be part of that xref:component-version.adoc[component version]. +A xref:playbook:index.adoc[playbook] tells Antora what xref:playbook:configure-content-sources.adoc[remote repositories and local content sources] it should fetch. +Then, starting at each content source root, Antora looks for an [.path]_antora.yml_ file. +If it finds [.path]_antora.yml_, it searches for a xref:module-directories.adoc[sibling _modules_ directory] and considers all of the [.path]_modules_ directory's xref:standard-directories.adoc[subdirectories and files] to be part of a xref:component-version.adoc[component version]. -This ability to store the source files of component version anywhere in a directory hierarchy as long as the parent directory contains an [.path]_antora.yml_ file, allows you to maintain and manage a component version (or part of a component version) in a repository with the software it documents, a sample project, or in its own repository. +This ability to store the source files of a component version anywhere in a directory hierarchy, as long as the parent directory contains an [.path]_antora.yml_ file, allows you to maintain and manage a component version (or part of a component version) in a repository with the software it documents, a sample project, or in its own repository. -[#component-version-configuration] +[#metadata-configuration] == What component version information does antora.yml provide? -[.path]_antora.yml_ is often referred to as the [.term]*component version descriptor* file because it provides required and optional information that identifies, describes, and configures a xref:component-version.adoc[component version]. +The [.path]_antora.yml_ file is referred to as the [.term]*component version descriptor* because it provides required and optional information that identifies, describes, and configures a xref:component-version.adoc[component version]. In turn, this metadata and configuration is applied to all of the source files that belong to the component version. -This assignment of component version information decouples the source files from the repository, branch, tag, and directory where they're stored. + +This is why Antora can collect files from multiple repositories, directories, branches, and tags and compile them into a component version. Antora doesn't process files based on their file system or repository location. Instead, Antora classifies and converts files based on the information assigned to the source files by a component version descriptor file. -This is why Antora can collect files from multiple repositories, directories, branches, and tags and compile them into one component version. -An [.path]_antora.yml_ file can contain the following keys and their assigned values: +An [.path]_antora.yml_ file contains the following required keys: + +include::partial$required-component-version-keys.adoc[] -* `name` key (required) -* `version` key (required) -* `title` key -* `display_version` key -* `prerelease` key -* `start_page` key -* `asciidoc` and `attributes` keys -* `nav` key +An [.path]_antora.yml_ file can also contain any of the following optional keys: -//The `name` and `version` keys in the component version's [.path]_antora.yml_ file are also used for constructing its page IDs and resource IDs. -//Finally, the component descriptor identifies and orders the files Antora uses to build the component version's navigation. +include::partial$optional-component-version-keys.adoc[] diff --git a/docs/modules/ROOT/pages/component-version.adoc b/docs/modules/ROOT/pages/component-version.adoc index db4caac37..cac55fcbb 100644 --- a/docs/modules/ROOT/pages/component-version.adoc +++ b/docs/modules/ROOT/pages/component-version.adoc @@ -2,22 +2,21 @@ == Component version -A [.term]*component version* typically represents a discreet and unique version of the documentation for a single product, library, project, microservice, or training course. -Antora can identify all of a component version's source files, regardless of where the files are stored and collected from, because they're associated with the same xref:component-name-and-version.adoc#name-key[component name] and xref:component-name-and-version.adoc#version-key[component version]. -A xref:component-version-descriptor.adoc[file named _antora.yml_] is responsible for defining the component version and applying the specified configuration to the component version's source files. -//Source files are associated with a component version by the existence of a file named , which is located in a parent directory. +A [.term]*component version* typically represents a discreet and unique version of the documentation for a project, library, service, or training course. +Antora collates all of a component version's source files, regardless of where the files are stored and collected from, that are associated with the same xref:component-name-and-version.adoc#name-key[component name] and xref:component-name-and-version.adoc#version-key[component version]. +A xref:component-version-descriptor.adoc[file named _antora.yml_] is responsible for marking the location of a set of source files that belong to a component version, defining the component version, and applying the specified configuration to the component version's source files. [#component-version-vs-docs-component] == What's the difference between a component version and a docs component? -The term [.term]*documentation component*, also known as a *docs component* or *component*, is used when a concept or action applies to all of the component versions that have the xref:component-name-and-version.adoc#name-key[same component name]. -//// -However, when it comes to producing your documentation site, Antora classifies source files by component version. -It doesn't recognize files solely by component name, and therefore it doesn't apply metadata and attributes, sort and process files, or display pages solely by component name (even though it may look like it does in some cases). +The term [.term]*docs component*, also known as a *documentation component* or simply *component*, is used when a concept or action applies to all of the component versions that have the xref:component-name-and-version.adoc#name-key[same component name]. + //// +move to better location [#docs-component-vs-site] == What's the difference between a docs component and a site? -A [.term]*documentation site* or *site* is a website generated by Antora and published to directory or domain specified in a playbook. -A site consists of one or more docs components and each docs component consists of one or more component versions. +A [.term]*documentation site* or *site* is a website generated by Antora and published to a directory or domain specified in a playbook. +A site typically consists of one or more docs components and each docs component consists of one or more component versions. +//// diff --git a/docs/modules/ROOT/pages/environment-and-page-attributes.adoc b/docs/modules/ROOT/pages/environment-and-page-attributes.adoc index 5f172cd8e..eb709ab97 100644 --- a/docs/modules/ROOT/pages/environment-and-page-attributes.adoc +++ b/docs/modules/ROOT/pages/environment-and-page-attributes.adoc @@ -7,7 +7,7 @@ Antora provides built-in `page-`, environment, and generator attributes. [#page-attributes] == Built-in page- attributes -Antora automatically sets the following attributes for each page: +Antora automatically sets the following attributes for each page when it runs: [cols="1,2,1"] |=== @@ -35,11 +35,11 @@ Antora automatically sets the following attributes for each page: |`page-origin-branch` |The name of the repository branch where the page's source file is stored. (mutually exclusive with `page-origin-tag`) -|v7.1.x +|v7.1.0 |`page-origin-refname` |The name of the reference where the page's source file is stored. -|{page-origin-refname} +|v7.1.0 |`page-origin-reftype` |The reference type (e.g., tag or branch) where the page's source file is stored. @@ -63,7 +63,7 @@ Antora automatically sets the following attributes for each page: |`page-origin-worktree` |Set if the file was taken from the git worktree. -|{page-origin-worktree} +|_Boolean attribute, no output is returned_ |`page-relative` |The family-relative path (e.g., pages) and file name of the page's source file. @@ -74,26 +74,26 @@ Antora automatically sets the following attributes for each page: |7.1 |=== -Attributes that are prefixed with `page-` are available to the pipeline and UI model during site generation, and they can be displayed in a page using the attribute reference syntax (e.g., `+{page-version}+`). +The output of these `page-` attributes can be displayed in a page using the AsciiDoc attribute reference syntax (e.g., `+{page-version}+`). +.Reference the current page's module name, component title, and version [source] ---- -Let's install *{page-component-title} {page-component-version}*. -The source file for {page-relative} is in the *{page-module}* module. +This page is part of the *{page-module}* module in the *{page-component-title} {page-component-version}* component version. ---- -Rendered as: +The attribute references in the above example output the data (shown below) for the current page, that is, the page you're reading right now. -[%hardbreaks] -Let's install *{page-component-title} {page-component-version}*. -The source file for *{page-relative}* is in the *{page-module}* module. +==== +This page is part of the *{page-module}* module in the *{page-component-title} {page-component-version}* component version. +==== -TIP: This data is also available via the xref:antora-ui-default::templates.adoc#template-variables[UI model]. +Attributes that are prefixed with `page-` are also available to the Antora pipeline and xref:antora-ui-default::templates.adoc#template-variables[UI model] during site generation. [#environment-attributes] == Built-in environment and generator attributes -There may be times when your document needs to know that it's being processed by Antora. +There may be times when your page needs to know that it's being processed by Antora. Antora sets these attributes for each page. * `env=site` @@ -104,5 +104,5 @@ Antora sets these attributes for each page. == Learn more * xref:component-name-and-version.adoc[Define a component name and version with antora.yml] -* xref:asciidoc:page-header.adoc#set-attribute[Set and unset AsciiDoc attributes]. +* xref:asciidoc:page-header.adoc#set-attribute[Set and unset AsciiDoc attributes] //* Create your own page attributes. -- GitLab From 5f6f75e19e4690719c7fc30ef3269b6fe945f9d9 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:14:35 -0600 Subject: [PATCH 25/39] write identify a prerelease version page --- .../ROOT/pages/component-prerelease.adoc | 92 +++++++++++++++++-- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/docs/modules/ROOT/pages/component-prerelease.adoc b/docs/modules/ROOT/pages/component-prerelease.adoc index 917d8d565..bfddcb51f 100644 --- a/docs/modules/ROOT/pages/component-prerelease.adoc +++ b/docs/modules/ROOT/pages/component-prerelease.adoc @@ -1,17 +1,91 @@ -= Label a Prerelease Version += Identify a Prerelease Version +:listing-caption: Example +:xrefstyle: short -Informs Antora that the component version is a prerelease version. -Antora applies alternate sorting and routing rules to component versions designated as prereleases. -Key can be used to append a prerelease label (e.g., Beta, -alpha.2) to the value of `version` without affecting the version coordinate or version URL segment. +The `prerelease` key informs Antora that a component version is a prerelease. +When generating a site, Antora doesn't apply the default routing rules to component versions designated as prereleases. [#prerelease-key] == prerelease key -The `prerelease` key is a marker that this version is considered prerelease. -xref:component-versions.adoc#prerelease-versions[Prerelease versions] are skipped when selecting the xref:component-versions.adoc#latest-version[latest version of a component] (unless all versions are prereleases, in which case the normal rules apply). +The `prerelease` key is optional. +It's set in a component version's [.path]_antora.yml_ file and assigned a user-defined identifier or the reserved `true` value. +Antora doesn't apply the default routing rules to a component version that is defined as a prerelease with the `prerelease` key, even if it's the <<sort-and-route,latest version in that docs component>> (unless all versions of that docs component are prereleases). -```yaml +[#identifier] +=== Assign an identifier to prerelease + +A component version becomes a prerelease when the `prerelease` key is set in [.path]_antora.yml_ and assigned an identifier. +An [.term]*identifier* is a user-defined, non-empty string such as `.alpha.2`, `YAY`, `Beta`, and `-rc.5`. +It can contain uppercase letters and a broad range of characters. + +The component version defined in <<ex-append-identifier>> is a prerelease. + +[#ex-append-identifier] +.antora.yml with prerelease assigned the identifier -rc.3 +[source,yaml] +---- +name: colorado +title: Colorado ∆ +version: '6.0' +prerelease: -rc.3 # <1> +---- +<1> Assign an identifier to `prerelease` to designate the component version as a prerelease. + +When `prerelease` is assigned an identifier, Antora computes an internal prerelease version value for UI sorting and, if `display_version` isn't set, for display purposes. +This computed prerelease version depends on the first character in the prerelease identifier. + +Identifiers that begin with a hyphen(`-`) or dot(`.`):: +The computed prerelease version takes the form of `version-identifier` or `version.identifier`. +Antora directly appends the prerelease identifier to the `version` key's value to compute the prerelease version. +For instance, using <<ex-append-identifier>>, the computed prerelease version would be _6.0-rc.3_. + +Identifiers that begin with any other valid character:: +The computed prerelease version takes the form of `version identifier`. +Antora separates the identifier from the `version` key's value with one blank space to compute the prerelease version. ++ +-- +[#ex-compute] +.antora.yml with prerelease assigned the identifier Beta +[source,yaml] +---- +name: colorado +title: Colorado ∆ +version: '6.0' +prerelease: Beta +---- + +Using <<ex-compute>>, the computed prerelease version would be _6.0 Beta_. +-- + +Unless the `display_version` key already has a value, Antora automatically assigns the computed prerelease version to it. +If `display_version` is defined in [.path]_antora.yml_, then that value is displayed in the reference UI. +However, the component version is still <<sort-and-route,sorted according to the internally computed prerelease version value>>. + +[#true] +=== Assign true to prerelease + +A component version becomes a prerelease when the `prerelease` key is set in [.path]_antora.yml_ and assigned the value `true`. + +[#ex-true] +.antora.yml with prerelease defined as true +[source,yaml] +---- +name: colorado +title: Colorado ∆ +version: '6.0' prerelease: true -``` +---- + +When `prerelease` is `true`, the component version is sorted by the value of `version` but the <<sort-and-route,default routing rules>> aren't applied to it even if it's the latest version in that docs component. +Also, there's no visual cue displayed in the reference UI that indicates to a visitor that the component version is a prerelease version. +To visually indicate in a site that a component version is a prerelease, you need to either: + +* define `prerelease` as `true` and xref:component-display-version.adoc[assign a value to display_version] that provides a prerelease version name or number, or +* <<identifier,assign an identifier>> to `prerelease`. + +[#sort-and-route] +== Prerelease sorting and routing -The `prerelease` key is not set by default. +Prerelease versions are skipped when Antora selects the xref:how-component-versions-are-sorted.adoc#latest-version[latest version of a docs component] (unless all component versions are prereleases, in which case the default rules apply). +They're sorted according to the xref:how-component-versions-are-sorted.adoc#version-schemes[versioning scheme criteria] the computed prerelease version meets. -- GitLab From 001390a4372973b1b9fffa7a454bef797c2d1080 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:15:07 -0600 Subject: [PATCH 26/39] add new pages to navigation --- docs/modules/ROOT/nav.adoc | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index 5f088febd..adabd8bfd 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -1,7 +1,7 @@ * xref:whats-new.adoc[What's New in Antora] * xref:features.adoc[How Antora Can Help] * xref:how-antora-works.adoc[How Antora Works] -* xref:quickstart.adoc[Antora Quickstart] +* xref:install-and-run-quickstart.adoc[Install and Run Antora Quickstart] * Get Antora ** xref:install:linux-requirements.adoc[Linux Requirements] @@ -11,23 +11,37 @@ ** xref:install:upgrade-antora.adoc[Upgrade Antora] ** xref:install:supported-platforms.adoc[Supported Platforms] -* Project & File Setup -** xref:component-structure.adoc[Documentation Components and Repositories] -** xref:modules.adoc[Modules, Families, and Subdirectories] -** xref:component-versions.adoc[Component Versions and Branches] +* Set Up Content Sources +** xref:organize-content-files.adoc[How to Organize and Classify Your Content] +** xref:content-source-repositories.adoc[Repositories and Content Source Roots] +** xref:content-source-versioning-methods.adoc[Content Source Versioning Methods] +** xref:standard-directories.adoc[Standard File and Directory Set] +** xref:module-directories.adoc[Module Directories and Modules] +*** xref:root-module-directory.adoc[ROOT Module Directory] +*** xref:named-module-directory.adoc[Named Module Directory] +**** xref:module-directory-names.adoc[Recommendations for Module Directory Names] +*** xref:module-url-segment.adoc[Module Segment in Page URLs] +** xref:family-directories.adoc[Family Directories and Families] +*** xref:pages-directory.adoc[Pages Directory and Page Files] +*** xref:partials-directory.adoc[Partials Directory and Partial Files] +*** xref:examples-directory.adoc[Examples Directory and Example Files] +*** xref:images-directory.adoc[Images Directory and Image Files] +*** xref:attachments-directory.adoc[Attachments Directory and Attachment Files] * Configure Component Versions ** xref:component-version.adoc[What's a Component Version?] ** xref:component-version-descriptor.adoc[What's antora.yml?] -** How are Component Versions Sorted? -** xref:component-name-and-version.adoc[Define a Component Version with antora.yml] +** xref:component-name-and-version.adoc[Define a Component Name and Version] +*** xref:how-component-versions-are-sorted.adoc[How are Component Versions Sorted?] ** xref:component-title.adoc[Customize the Title] ** xref:component-display-version.adoc[Customize the Display Version] -** xref:component-prerelease.adoc[Label a Prerelease Version] +** xref:component-prerelease.adoc[Identify a Prerelease Version] +** xref:component-with-no-version.adoc[Define a Component Version with No Version] ** xref:component-attributes.adoc[Assign Attributes to a Component Version] ** xref:component-start-page.adoc[Select a Start Page] ** xref:component-navigation.adoc[Register a Component Version's Navigation Files] ** xref:environment-and-page-attributes.adoc[Built-in Page and Environment Attribute Reference] +** xref:distributed-component-version.adoc[Distributed Component Version] * xref:run-antora.adoc[Run Antora] ** xref:run-antora.adoc#cache[About the Cache] -- GitLab From 3e60d9a91428b061b57bb87842e510a12c591783 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 28 Mar 2020 20:15:42 -0600 Subject: [PATCH 27/39] align on component version; update and add xrefs [skip CI] --- docs/modules/ROOT/pages/how-antora-works.adoc | 33 ++++++------ docs/modules/ROOT/pages/index.adoc | 11 +--- docs/modules/ROOT/pages/run-antora.adoc | 10 ++-- .../modules/install/pages/install-antora.adoc | 4 +- .../install/pages/supported-platforms.adoc | 2 +- docs/modules/page/pages/index.adoc | 22 ++++---- docs/modules/page/pages/page-id.adoc | 54 +++++++------------ 7 files changed, 56 insertions(+), 80 deletions(-) diff --git a/docs/modules/ROOT/pages/how-antora-works.adoc b/docs/modules/ROOT/pages/how-antora-works.adoc index 7ab80ed38..050922618 100644 --- a/docs/modules/ROOT/pages/how-antora-works.adoc +++ b/docs/modules/ROOT/pages/how-antora-works.adoc @@ -6,8 +6,8 @@ This page describes that process in detail. The default pipeline is opinionated to get you started as quickly as possible. But understand that Antora features a modular, open architecture. -That means this architecture can accommodate specialized use cases by allowing custom components, such as a validators, to be inserted into the pipeline at strategic points as needed. -This page focuses on the core, built-in components and capabilities in Antora. +That means this architecture can accommodate specialized use cases by allowing custom Antora components, such as a validators, to be inserted into the pipeline at strategic points as needed. +This page focuses on the core, built-in Antora components and capabilities in Antora. == Steps in the Default Generator Pipeline @@ -29,27 +29,26 @@ Using the xref:playbook:configure-content-sources.adoc[content sources] listed i For each remote URL, Antora clones the remote git repository into a local cache using the built-in git client. If the repository has already been cloned, Antora fetches updates if configured to do so. + -Finally, Antora determines which references (branches and/or tags) to use from the specified repositories. +Finally, Antora determines which references (branches, tags, and start paths) to use from the specified repositories. -Find the documentation component in each selected branch and/or tag:: -Antora identifies a group of files as a documentation component when it finds a component descriptor file named [.path]_antora.yml_. -+ -A xref:component-structure.adoc[documentation component] is a set of files that are versioned together and usually share a common subject, such as all of the content source files for a software product. -Component source files can be stored in a single repository, at the root of a repository or in a subpath, or distributed across multiple repositories. +Find the content source roots:: +Starting at a xref:content-source-repositories.adoc[content source root], Antora identifies a group of files as being part of a component version when it finds a component version descriptor file named [.path]_antora.yml_. +These source files can be stored in a single repository, at the root of a repository or in a subpath, or distributed across multiple repositories. Transform input files into virtual file objects:: -Antora collects all of the files--text, images, samples, and other supporting materials--from each documentation component subtree. +Antora collects all of the files--text, images, samples, and other supporting materials--from each xref:standard-directories.adoc[content source root subtree]. Then it creates a virtual file of each input file. Assign files to component version buckets:: -Antora reads the component descriptor (i.e., [.path]_antora.yml_) files. +Antora reads the component version descriptor ( [.path]_antora.yml_) files. + -A xref:component-descriptor.adoc[component descriptor] associates the files under it with a specified component name and version (aka component version). -This allows the files to be decoupled from the repository and branch in which they live. -The component descriptor file makes Antora's repository-spanning, file system and URL agnostic xref:asciidoc:page-to-page-xref.adoc[cross references] possible. +A xref:component-version-descriptor.adoc[component version descriptor] associates the files under it with a specified component name and version, that is, a component version. +This allows the files to be decoupled from the repository in which they live and makes Antora's URL agnostic xref:asciidoc:page-to-page-xref.adoc[cross references] possible. + -Antora assigns the descriptor information and other source metadata to the appropriate virtual files. +Antora assigns the descriptor information and other source metadata to the virtual files. Then it sorts each file into a virtual collection based on the assigned component version data. ++ +A xref:component-version.adoc[component version] typically represents a discreet and unique version of the documentation for a project, library, service, or training course. Compute additional metadata:: Using xref:playbook:configure-site.adoc[site properties] from the playbook and information assigned to the files in the previous step, Antora adds module, family, family-relative path, and other metadata values to each file. @@ -60,7 +59,7 @@ Antora further sorts the aggregated files into a content catalog that can be que // add pages xref when page is available Convert AsciiDoc files to embeddable HTML:: -The AsciiDoc files in the xref:page:index.adoc[page family] of the content catalog are converted to embeddable HTML with Asciidoctor.js. +The AsciiDoc files in the xref:pages-directory.adoc[page family] of the content catalog are converted to embeddable HTML with Asciidoctor.js. Convert navigation files:: Antora retrieves xref:navigation:index.adoc[navigation files] from the content catalog, translates their contents into navigation items organized in a specified hierarchy (navigation trees grouped inside a navigation menu), and returns a navigation model. @@ -90,8 +89,8 @@ Relying on a page template to produce the pages gives the site owner complete co Produce sitemap:: Antora generates a site map that can be used as an internal report or published with the site. -This sitemap is partitioned by component (using a sitemap index). -The sitemap index links to the sitemap for each component, which is where the URLs for the individual pages can be found. +This sitemap is partitioned by component name (using a sitemap index). +The sitemap index links to the sitemap for each component name, which is where the URLs for the individual pages can be found. Publish site:: Antora writes the generated pages to a default or xref:playbook:configure-output.adoc#output-dir[user-specified location]. diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc index 5df1e4a58..a8d914044 100644 --- a/docs/modules/ROOT/pages/index.adoc +++ b/docs/modules/ROOT/pages/index.adoc @@ -1,12 +1,5 @@ = Antora Documentation :keywords: Docs as Code, DocOps, content management system, docs writers, publish software documentation, CI and docs, CD and docs -// URLs -:url-changelog: https://gitlab.com/antora/antora/blob/master/CHANGELOG.adoc -//// -[caption="RELEASE STATUS"] -TIP: Antora {release-version} is now available! -See the {url-changelog}[CHANGELOG^] for details. -//// [discrete.tagline] === The Static Site Generator for Tech Writers @@ -80,9 +73,9 @@ This is a sharp contrast to many other site generators that intermix all of thes == Where to begin If you're just beginning your journey with Antora, you'll probably want to know xref:features.adoc[how Antora can help you]. -When you are familiar with the basic concepts, you can try out Antora using the xref:quickstart.adoc[Antora quickstart guide]. +When you are familiar with the basic concepts, you can try out Antora using the xref:install-and-run-quickstart.adoc[Antora quickstart guide]. -If you're ready to set up a new documentation project, or you want to migrate an existing project to Antora, start by xref:component-structure.adoc[organizing your documentation files] into the project structure Antora expects. +If you're ready to set up a new documentation project, or you want to migrate an existing project to Antora, start by xref:organize-content-files.adoc[organizing your documentation files] into the project structure Antora expects. You'll then need to xref:playbook:index.adoc[create a playbook] to tell Antora where to find the documentation and UI to use for your site. If you already have a documentation component set up, and you're ready to create your first site, check that you've met Antora's xref:install:supported-platforms.adoc[system requirements], then xref:install:install-antora.adoc[install Antora], and finally xref:run-antora.adoc[generate your site] using the `antora` command. diff --git a/docs/modules/ROOT/pages/run-antora.adoc b/docs/modules/ROOT/pages/run-antora.adoc index c475d46a9..780f9b1f9 100644 --- a/docs/modules/ROOT/pages/run-antora.adoc +++ b/docs/modules/ROOT/pages/run-antora.adoc @@ -10,7 +10,7 @@ Assumptions: * [x] You've xref:install:install-antora.adoc[installed the Antora CLI and a site generator pipeline]. * [x] You have your own xref:playbook:index.adoc[playbook], or you're using the Demo playbook. -* [x] Your playbook is configured to access at least one of your own xref:component-structure.adoc[documentation component repositories] or Antora's Demo docs components. +* [x] Your playbook is configured to access at least one of your own xref:content-source-repositories.adoc[repositories containing content source files] or Antora's Demo content repositories. * [x] Your playbook is configured to use a xref:playbook:configure-ui.adoc[custom UI bundle or Antora's default UI bundle]. On this page, you'll learn: @@ -20,10 +20,10 @@ On this page, you'll learn: * [x] How to update the cache. * [x] How to preview a generated site locally. -== Antora demo playbook and components +== Antora demo playbook and content repositories -You don't need to set up a playbook file, documentation component, or UI to evaluate Antora. -Instead, you can use the Antora demo playbook and components. +You don't need to set up a playbook file, xref:component-version.adoc[component version], or UI to evaluate Antora. +Instead, you can use the Antora demo playbook and content repositories. The demo consists of a {url-demo-project}[playbook repository] containing a playbook file and content repositories ({url-demo-component-a}[component-a] and {url-demo-component-b}[component-b]) to which that playbook refers. It also uses the UI bundle produced by the {url-default-ui}[default UI project]. @@ -36,7 +36,7 @@ The instructions and examples on this page will guide you through the process. To produce a documentation site, Antora needs a playbook. But first, you'll need to create or choose a directory where you'll store the playbook and where the generated site files will be saved (assuming you use the default output configuration). -For the examples on this page, we'll use the demo playbook and documentation components. +For the examples on this page, we'll use the demo playbook and content repositories. . Open a terminal and make a new directory named [.path]_demo-site_. diff --git a/docs/modules/install/pages/install-antora.adoc b/docs/modules/install/pages/install-antora.adoc index a0ad8288a..92f7759c4 100644 --- a/docs/modules/install/pages/install-antora.adoc +++ b/docs/modules/install/pages/install-antora.adoc @@ -99,10 +99,10 @@ Next, install the site generator package. The `@antora/site-generator-default` and its dependent packages will be installed into the [.path]_node_modules_ folder inside your project. The `antora` command will look for these packages there first before looking in the global installation folder. -== Next +== Learn more Now that Antora is installed, you're ready to: * Set up your own xref:playbook:index.adoc[playbook] or use the Demo playbook. -* Organize a xref:ROOT:component-structure.adoc[documentation component repository] or use Antora's Demo docs components. +* Organize your xref:ROOT:organize-content-files.adoc[content source files and repositories] or use Antora's Demo content repositories. * xref:ROOT:run-antora.adoc[Run Antora] and generate a documentation site. diff --git a/docs/modules/install/pages/supported-platforms.adoc b/docs/modules/install/pages/supported-platforms.adoc index 1b42cf1da..b77a49c85 100644 --- a/docs/modules/install/pages/supported-platforms.adoc +++ b/docs/modules/install/pages/supported-platforms.adoc @@ -93,7 +93,7 @@ On subsequent runs, Antora only reconnects to the remote repositories if the xre |Maximum throughput and minimum latency always make things nicer but aren't required. |=== -== Next +== Learn more * xref:upgrade-antora.adoc[Upgrade to the latest Antora release]. diff --git a/docs/modules/page/pages/index.adoc b/docs/modules/page/pages/index.adoc index f814c45f3..24b836f49 100644 --- a/docs/modules/page/pages/index.adoc +++ b/docs/modules/page/pages/index.adoc @@ -27,16 +27,16 @@ Learn more: * xref:create-standard-page.adoc[Create a standard page] * xref:asciidoc:include-page.adoc[Insert content from a standard page into another page] -* xref:ROOT:modules.adoc#pages-dir[The _pages_ directory] -* xref:ROOT:component-structure.adoc[Documentation component overview] +* xref:ROOT:pages-directory.adoc[The _pages_ directory] * xref:navigation:link-syntax-and-content.adoc#page[Add a page xref to a navigation file] [#partial] == Reusable partial pages -Partials are AsciiDoc files located in a [.path]_partials_ directory. -// (or [.path]_pages/_partials_). -These files are *not* converted to HTML by Antora automatically. +Partials are usually AsciiDoc source files (_.adoc_) that contain content snippets, such as common descriptions, terminology, or reference tables, that you plan to insert in multiple pages. +They may also be reusable UML, STEM, or CSV/TSV content. +The source files for partials are stored in a [.path]_partials_ directory. +Partials aren't converted to HTML by Antora automatically. Instead, they must be referenced by an xref:asciidoc:include-partial.adoc[include directive] in a standard page. Partials are good for storing snippets of content, such as concept definitions or project introductions, that you reuse in one or more standard pages. @@ -44,24 +44,22 @@ When you change the content in a partial, those changes will be disseminated to Learn more: -//* Create a partial -* xref:ROOT:modules.adoc#partials-dir[The _partials_ directory] +* xref:ROOT:partials-directory.adoc[The _partials_ directory] * xref:asciidoc:include-partial.adoc[Insert a partial into a standard page] -* xref:ROOT:component-structure.adoc[Documentation component overview] -== Component index page +== Component version index page -If a file named [.path]_index.adoc_ exists in the ROOT module of a component, Antora will automatically set this page as the start page of that component. +If a file named [.path]_index.adoc_ exists in the ROOT module of a component, Antora will automatically set this page as the start page of that component version. component:ROOT:index.adoc => site.com/component/index.html Learn more: //* Create a component index page -* xref:ROOT:component-descriptor.adoc#start-page-key[Use another page to act as a component's start page] +* xref:ROOT:component-start-page.adoc[Specify a component version's start page] //* html extension options -* xref:ROOT:modules.adoc#root-dir[The ROOT directory] +* xref:ROOT:root-module-directory.adoc[The ROOT module directory] // TIP: see the html strategies for dropping the html and index for URLs diff --git a/docs/modules/page/pages/page-id.adoc b/docs/modules/page/pages/page-id.adoc index 90c70c1da..5991dee6c 100644 --- a/docs/modules/page/pages/page-id.adoc +++ b/docs/modules/page/pages/page-id.adoc @@ -1,48 +1,39 @@ -= Page Identifier += Page ID -== What is a page identifier? - -In order for a page to be linked to, i.e., referenced, that page must have a unique and stable identifier. -This identifier is like your mobile phone number. -When someone calls your mobile number, they know they're calling you and that they'll reach your phone no matter where your phone is located. -So, when an identifier is "`called`", the page that is connected to that identifier answers, no matter where it's published. - -We call a page's "`number`" a page identifier, or page ID for short. +In order for a page to be linked to, i.e., referenced, that page must have an identifier--a page ID. +An [.term]*Antora page ID* is a unique and reliable set of identifying coordinates, organized in a standard order, that are constructed from the properties assigned to each page's source file. [#structure] == How is a page ID structured? -The page ID is unique and stable because it's constructed from the properties of the source document. - -A page ID is based on a documentation component's xref:ROOT:component-structure.adoc[standard project structure]. -Documentation components ensure that each page lives in a defined, describable location. -From this structure, each location derives unique, reliable coordinates we can use to refer to it. - -These source document coordinates are described below. +Antora constructs a page ID for a page source file from the key-value pairs specified in a xref:component-version-descriptor.adoc[component version descriptor] and the xref:ROOT:standard-directories.adoc[standard directory set]. +Using this information, each page can be referenced using a unique and reliable set of page ID coordinates. [#id-version] Version:: -The version of the component in which the page lives; often mapped to a repository branch. +The xref:ROOT:component-name-and-version.adoc#version-key[version of the component] to which the page belongs. [#id-component] Component:: -The documentation component to which the page belongs; often mapped to a repository. +The xref:ROOT:component-name-and-version.adoc#name-key[name of the component] to which the page belongs. [#id-module] Module:: -The content bundle in which the page is grouped; if empty, defaults to ROOT. +The xref:ROOT:module-directories.adoc#module[module] in which the page is grouped. Page:: -The path to the page's source file in the module, including any leading topic directories and the _.adoc_ file extension. +The path to the xref:ROOT:pages-directory.adoc[page's source file] in the module, including any leading topic directories and the _.adoc_ file extension. These coordinates are organize in a standard structure to create a unique, fully-qualified page ID. image::page-id-anatomy-diagram.svg[Page ID anatomy,600] -For example, this is the fully-qualified page ID for the "`How Antora Works`" page, which is located in the ROOT module of the Antora docs component. +For example, this is the fully-qualified page ID for the "`How Antora Works`" page, which belongs to the ROOT module of the {page-component-title} {page-component-version} component version. -[source,asciidoc] -1.1@antora:ROOT:how-antora-works.adoc +[subs=attributes+] +---- +{page-component-version}@antora:ROOT:how-antora-works.adoc +---- == How is a page referenced with its ID? @@ -52,19 +43,15 @@ image::xref-macro-anatomy-diagram.svg[Page reference anatomy,780] Here's how that looks in practice: -[source,asciidoc] -Learn all about xref:1.0@antora:ROOT:how-antora-works.adoc[the Antora pipeline]. +[subs=attributes+] +---- +Learn about xref:{page-component-version}@antora:ROOT:how-antora-works.adoc[the Antora pipeline]. +---- -Specifying the version, component, and even module every time seems like overkill, right? +Specifying the version, component name, and even module every time seems like overkill, right? Don't worry, there's a shorthand. For instance, if you're linking to a page in the same module as the page you're linking from, all you need to do is specify the `page` coordinate. -The next example shows a cross reference from the "`How Antora Works`" page ([.path]_how-antora-works.adoc_) to the "`Run Antora`" page ([.path]_run-antora.adoc_). -Both of these pages live in the same component and module. - -[source,asciidoc] -Let's xref:run-antora.adoc[run Antora]! - A whole range of examples, from linking between different components to linking to different versions of a page, are explained in xref:asciidoc:page-to-page-xref.adoc[page cross references]. [#important] @@ -75,8 +62,7 @@ Notice the page coordinate ends with [.path]_.adoc_, the file extension of an As Regardless of whether you're deploying your site locally, to a staging or production environment, or you change URL strategies, the page ID always remains the same. The cross reference locks on to the target page and produces a URL that points to it wherever it gets published. -*We've avoided coupling to the filesystem* by using a location based on the documentation component structure. -The page ID describes the source file's project (component & version) and where the source file is located in that project (module, family, & family-relative path). +*We've avoided coupling to the filesystem* by using an identifier based on the Antora's virtual component version classification system. *We've eliminated the relative path (../../) problem* by specifying the page as a module-relative path. The path always starts from a module's [.path]_pages_ directory, even when the referencing page is located inside a topic folder. -- GitLab From 3aa3391528a2e739fc0479cf44ed6202c9114a01 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sun, 29 Mar 2020 13:59:16 -0600 Subject: [PATCH 28/39] create generate nav file and split run Antora page --- docs/modules/ROOT/nav-run.adoc | 9 ++ docs/modules/ROOT/nav.adoc | 7 - docs/modules/ROOT/pages/antora-container.adoc | 2 +- docs/modules/ROOT/pages/cache.adoc | 30 ++++ docs/modules/ROOT/pages/preview-a-site.adoc | 72 ++++++++++ .../ROOT/pages/publish-to-github-pages.adoc | 36 +++++ docs/modules/ROOT/pages/run-antora.adoc | 129 +----------------- .../modules/install/pages/upgrade-antora.adoc | 2 +- .../install/pages/windows-requirements.adoc | 2 +- 9 files changed, 151 insertions(+), 138 deletions(-) create mode 100644 docs/modules/ROOT/nav-run.adoc create mode 100644 docs/modules/ROOT/pages/cache.adoc create mode 100644 docs/modules/ROOT/pages/preview-a-site.adoc create mode 100644 docs/modules/ROOT/pages/publish-to-github-pages.adoc diff --git a/docs/modules/ROOT/nav-run.adoc b/docs/modules/ROOT/nav-run.adoc new file mode 100644 index 000000000..d20f08a88 --- /dev/null +++ b/docs/modules/ROOT/nav-run.adoc @@ -0,0 +1,9 @@ +.Generate a Site +* xref:run-antora.adoc[Run Antora] +* xref:preview-a-site.adoc[Preview a Site] +* xref:antora-container.adoc[Run Antora in a Container] +* xref:cache.adoc[Configure Antora's Cache] +* xref:cli:index.adoc[CLI Reference] + +.Publish a Site +* xref:publish-to-github-pages.adoc[Publish to GitHub Pages] diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index adabd8bfd..d3f85e135 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -42,10 +42,3 @@ ** xref:component-navigation.adoc[Register a Component Version's Navigation Files] ** xref:environment-and-page-attributes.adoc[Built-in Page and Environment Attribute Reference] ** xref:distributed-component-version.adoc[Distributed Component Version] - -* xref:run-antora.adoc[Run Antora] -** xref:run-antora.adoc#cache[About the Cache] -** xref:run-antora.adoc#local-site-preview[Local Preview] -** xref:run-antora.adoc#publish-to-github-pages[Publish to GitHub Pages] -** xref:antora-container.adoc[Run Antora in a Container] -** xref:cli:index.adoc[CLI Reference] diff --git a/docs/modules/ROOT/pages/antora-container.adoc b/docs/modules/ROOT/pages/antora-container.adoc index ebfe7e222..f1658ac2c 100644 --- a/docs/modules/ROOT/pages/antora-container.adoc +++ b/docs/modules/ROOT/pages/antora-container.adoc @@ -66,7 +66,7 @@ This option allows you to use volume mounts when running SELinux. This option tells Docker to run the entrypoint command (i.e., `antora`) as the current user. If you use the `--privileged` flag without specifying this option, the generated files are (most likely) written as the root user (and become rather tricky to delete). -If you want Antora to put the xref:run-antora.adoc#cache[cache folder] inside the mounted directory, specify a playbook-relative cache directory in the command using the `--cache-dir` option: +If you want Antora to put the xref:cache.adoc[cache folder] inside the mounted directory, specify a playbook-relative cache directory in the command using the `--cache-dir` option: docs-site $ docker run -u $UID --privileged -v `pwd`:/antora --rm -t antora/antora --cache-dir=./.cache/antora antora-playbook.yml diff --git a/docs/modules/ROOT/pages/cache.adoc b/docs/modules/ROOT/pages/cache.adoc new file mode 100644 index 000000000..edfb990c8 --- /dev/null +++ b/docs/modules/ROOT/pages/cache.adoc @@ -0,0 +1,30 @@ += Configure Antora's Cache + +== About Antora's cache + +When Antora runs the first time, it will save resources it fetches over the network in a local cache. +Antora caches two types of resources: + +* cloned git repositories +* downloaded UI bundles + +Antora stores these resources in the cache directory, which are further organized under the [.path]_content_ and [.path]_ui_ folders, respectively. +The xref:playbook:configure-runtime.adoc#default-cache[default cache directory] varies by operating system. + +== Override the default cache location + +You can override the default cache location--listed here in order of precedence--using: + +* the xref:cli:index.adoc#cli-options[--cache-dir] CLI option, +* the `ANTORA_CACHE_DIR` environment variable, or +* the xref:playbook:configure-runtime.adoc[runtime.cache_dir] key in the playbook. + +== Update the cache + +If you want Antora to update the cache on subsequent runs, pass the xref:cli:index.adoc#cli-options[--fetch] option to the Antora CLI or set the `runtime.fetch` key to true in the playbook. +This switch will force Antora to run a fetch operation on each repository it previously cloned. +It will also force Antora to download a fresh copy of the UI bundle, if the URL is remote. + +== Clear the cache + +If you want to clear the cache altogether, locate the Antora cache directory on your system and delete it. diff --git a/docs/modules/ROOT/pages/preview-a-site.adoc b/docs/modules/ROOT/pages/preview-a-site.adoc new file mode 100644 index 000000000..2f4d993e6 --- /dev/null +++ b/docs/modules/ROOT/pages/preview-a-site.adoc @@ -0,0 +1,72 @@ += Preview a Site + +On this page, you'll learn: + +* [x] How to preview a site locally. +* [x] How to run an optional local server to preview a site locally. + +== Local site preview + +Since Antora generates static sites, *you do not have to publish the site to a web server to view it*. +A site generated by Antora works just as well using the browser's local file: protocol. +This characteristic of an Antora site is an essential tool for previewing your work. + +To view the site locally, navigate to any HTML page inside the destination folder in your browser. +If you're following along with the Demo, look for the file [.path]_build/site/index.html_ in your project. +You will be viewing the HTML pages through the file: protocol of the browser, which you can see in the location bar. + +== Run a local server (optional) + +Although the site is viewable without a web server, you may still need to view your site through a web server to test certain features, such as indexified URLs, caching, or scripts that don't work over the file: protocol. +You can use the *node-srv* package for this purpose. +https://yarnpkg.com/en/package/node-srv[node-srv] is a simple, static web server for Node. + +Install the *node-srv* package globally using npm: + + demo-site $ npm i -g node-srv + +or Yarn: + + demo-site $ yarn global add node-srv + +That puts a command by the same name on your PATH. + +Now launch the web server by pointing it at the location of the generated site. +In the terminal, type the command name, `node-srv`, followed by the `-r` flag, then the location of the generated site (i.e., the output dir). +After launching the command, the local address of the web server will be displayed in your terminal. + + demo-site $ node-srv -r build/site + +You should see the following output in your terminal: + +[.output] +.... +Server node-srv running at + => http://localhost:8000 + +Logs are off. +.... + +Paste the provided URL into the location bar of your browser to view your site through a local web server. + +Press kbd:[Ctrl,C] to stop the server. + +TIP: If you get a port conflict when starting the server (i.e., `listen EADDRINUSE: address already in use`), you can use the `-p <port>` option to change to another port. +For example, use `-p 5000` to switch to port 5000. + +//// +When generation is complete, you'll see a URL in the terminal that is specific to your machine. + +[.output] +.... +Loading theme bundle from GitHub release: ... +Using content from repository: ... +... +Finished in 0:00:45 +Site can be viewed at file:///home/user/projects/docs-site/build/site +.... + +You can follow this URL to preview the site locally in your browser. + +Depending on what you built, you may have to navigate to an HTML file from that location to see the actual site. +//// diff --git a/docs/modules/ROOT/pages/publish-to-github-pages.adoc b/docs/modules/ROOT/pages/publish-to-github-pages.adoc new file mode 100644 index 000000000..b32a6c6bb --- /dev/null +++ b/docs/modules/ROOT/pages/publish-to-github-pages.adoc @@ -0,0 +1,36 @@ += Publish to GitHub Pages + +Antora is designed to create sites that run anywhere, whether it be on a static web host or the local filesystem. +However, some hosts offer "`features`" that mess with Antora's output. +GitHub Pages is one of those hosts. + +By default, GitHub Pages runs all files through another static site generator named Jekyll (even if they aren't using a Jekyll project structure). +Since Antora already produces a ready-made site, there's absolutely no need for this step. +This processing is particularly problematic since Jekyll has the nasty side effect of removing all files that begin with an underscore (`+_+`). +Antora puts UI files in a directory named `+_+`, and places images under the directory name `+_images+`, which Jekyll subsequently erases. +As a result, no UI, no images. + +Fortunately, there's a way to disable this "`feature`" of GitHub Pages. +The solution is to add a [.path]_.nojekyll_ file to the root folder of the published site (i.e., the output directory). + +One way to add this file is to touch the [.path]_.nojekyll_ file in the output directory after Antora runs, but before committing the files to GitHub Pages. +For example: + + $ touch build/site/.nojekyll + +To avoid the need for the extra command, the other way to do it is to inject the file using Antora's supplemental UI feature. +To do so, add the following `supplemental_files` block under the `ui` category in your playbook file: + +[source,yml] +---- +ui: + bundle: + url: <url-of-bundle-goes-here> + supplemental_files: + - path: .nojekyll + - path: ui.yml + contents: "static_files: [ .nojekyll ]" +---- + +The presence of the [.path]_.nojekyll_ file at the root of the `gh-pages` branch tells GitHub Pages not to run the published files through Jekyll. +The result is that your Antora-made site will work as expected. diff --git a/docs/modules/ROOT/pages/run-antora.adoc b/docs/modules/ROOT/pages/run-antora.adoc index 780f9b1f9..074bd6e79 100644 --- a/docs/modules/ROOT/pages/run-antora.adoc +++ b/docs/modules/ROOT/pages/run-antora.adoc @@ -16,9 +16,6 @@ Assumptions: On this page, you'll learn: * [x] How to run Antora and generate a site. -* [x] Where files are cached. -* [x] How to update the cache. -* [x] How to preview a generated site locally. == Antora demo playbook and content repositories @@ -150,101 +147,14 @@ Or, you can navigate to an HTML page inside the destination folder in your brows If you've been following along with the Demo materials, once you find the demo-site directory, navigate to the file [.path]_build/site/index.html_. -- -[#cache] -=== Cache - -When Antora runs the first time, it will save resources it fetches over the network in a local cache. -Antora caches two types of resources: - -* cloned git repositories -* downloaded UI bundles - -Antora stores these resources in the cache directory, which are further organized under the [.path]_content_ and [.path]_ui_ folders, respectively. -The xref:playbook:configure-runtime.adoc#default-cache[default cache directory] varies by operating system. -You can override the default cache location--listed here in order of precedence--using: - -* the xref:cli:index.adoc#cli-options[--cache-dir] CLI option, -* the `ANTORA_CACHE_DIR` environment variable, or -* the xref:playbook:configure-runtime.adoc[runtime.cache_dir] key in the playbook. - -If you want Antora to update the cache on subsequent runs, pass the xref:cli:index.adoc#cli-options[--fetch] option to the Antora CLI or set the `runtime.fetch` key to true in the playbook. -This switch will force Antora to run a fetch operation on each repository it previously cloned. -It will also force Antora to download a fresh copy of the UI bundle, if the URL is remote. - -If you want to clear the cache altogether, locate the Antora cache directory on your system and delete it. - [#using-private-repositories] -=== Private git repositories +== Private git repositories Antora can authenticate with private repositories using HTTP Basic authentication over HTTPS. See xref:playbook:private-repository-auth.adoc[Private repository authentication] to learn more. -== Local site preview - -Since Antora generates static sites, *you do not have to publish the site to a web server to view it*. -A site generated by Antora works just as well using the browser's local file: protocol. -This characteristic of an Antora site is an essential tool for previewing your work. - -To view the site locally, navigate to any HTML page inside the destination folder in your browser. -If you're following along with the Demo, look for the file [.path]_build/site/index.html_ in your project. -You will be viewing the HTML pages through the file: protocol of the browser, which you can see in the location bar. - -=== Run a local server (optional) - -Although the site is viewable without a web server, you may still need to view your site through a web server to test certain features, such as indexified URLs, caching, or scripts that don't work over the file: protocol). -You can use the *node-srv* package for this purpose. -https://yarnpkg.com/en/package/node-srv[node-srv] is a simple, static web server for Node. - -Install the *node-srv* package globally using npm: - - demo-site $ npm i -g node-srv - -or Yarn: - - demo-site $ yarn global add node-srv - -That puts a command by the same name on your PATH. - -Now launch the web server by pointing it at the location of the generated site. -In the terminal, type the command name, `node-srv`, followed by the `-r` flag, then the location of the generated site (i.e., the output dir). -After launching the command, the local address of the web server will be displayed in your terminal. - - demo-site $ node-srv -r build/site - -You should see the following output in your terminal: - -[.output] -.... -Server node-srv running at - => http://localhost:8000 - -Logs are off. -.... - -Paste the provided URL into the location bar of your browser to view your site through a local web server. - -Press kbd:[Ctrl,C] to stop the server. - -TIP: If you get a port conflict when starting the server (i.e., `listen EADDRINUSE: address already in use`), you can use the `-p <port>` option to change to another port. -For example, use `-p 5000` to switch to port 5000. //// -When generation is complete, you'll see a URL in the terminal that is specific to your machine. - -[.output] -.... -Loading theme bundle from GitHub release: ... -Using content from repository: ... -... -Finished in 0:00:45 -Site can be viewed at file:///home/user/projects/docs-site/build/site -.... - -You can follow this URL to preview the site locally in your browser. - -Depending on what you built, you may have to navigate to an HTML file from that location to see the actual site. - - The script loads and executes Antora and passes any trailing configuration flags and switches. #Move this to a fragment or file in the playbook module# @@ -261,40 +171,3 @@ These subsequent runs complete much faster because only the changes to the repos The repositories are cached under the [.path]_build/sources/_ directory. If you remove the [.path]_build/_ directory, the repositories will have to be downloaded again from scratch. //// - -== Publish to GitHub Pages - -Antora is designed to create sites that run anywhere, whether it be on a static web host or the local filesystem. -However, some hosts offer "`features`" that mess with Antora's output. -GitHub Pages is one of those hosts. - -By default, GitHub Pages runs all files through another static site generator named Jekyll (even if they aren't using a Jekyll project structure). -Since Antora already produces a ready-made site, there's absolutely no need for this step. -This processing is particularly problematic since Jekyll has the nasty side effect of removing all files that begin with an underscore (`+_+`). -Antora puts UI files in a directory named `+_+`, and places images under the directory name `+_images+`, which Jekyll subsequently erases. -As a result, no UI, no images. - -Fortunately, there's a way to disable this "`feature`" of GitHub Pages. -The solution is to add a [.path]_.nojekyll_ file to the root folder of the published site (i.e., the output directory). - -One way to add this file is to touch the [.path]_.nojekyll_ file in the output directory after Antora runs, but before committing the files to GitHub Pages. -For example: - - $ touch build/site/.nojekyll - -To avoid the need for the extra command, the other way to do it is to inject the file using Antora's supplemental UI feature. -To do so, add the following `supplemental_files` block under the `ui` category in your playbook file: - -[source,yml] ----- -ui: - bundle: - url: <url-of-bundle-goes-here> - supplemental_files: - - path: .nojekyll - - path: ui.yml - contents: "static_files: [ .nojekyll ]" ----- - -The presence of the [.path]_.nojekyll_ file at the root of the `gh-pages` branch tells GitHub Pages not to run the published files through Jekyll. -The result is that your Antora-made site will work as expected. diff --git a/docs/modules/install/pages/upgrade-antora.adoc b/docs/modules/install/pages/upgrade-antora.adoc index 9dbaa37b8..35dfccd68 100644 --- a/docs/modules/install/pages/upgrade-antora.adoc +++ b/docs/modules/install/pages/upgrade-antora.adoc @@ -114,6 +114,6 @@ It may be necessary to pass the `--force` flag to force an update. You've now upgraded to the latest version of Antora. -== Next +== Learn more Review xref:ROOT:whats-new.adoc[What's New in Antora] for the latest features and potential breaking changes. diff --git a/docs/modules/install/pages/windows-requirements.adoc b/docs/modules/install/pages/windows-requirements.adoc index f2848cd17..7db431e9d 100644 --- a/docs/modules/install/pages/windows-requirements.adoc +++ b/docs/modules/install/pages/windows-requirements.adoc @@ -94,6 +94,6 @@ If you have nvm installed but your Node version is not an LTS release, type the IMPORTANT: When using nvm for Windows, you must enter the full version of Node (i.e., `nvm install {version-node}`). -== Next +== Learn more Once you've installed Node, you're ready to xref:install-antora.adoc[install Antora]. -- GitLab From 30dbb33ac09a87b6acb7c628e6859939488e0c04 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sun, 29 Mar 2020 13:59:48 -0600 Subject: [PATCH 29/39] create pages and resources category; register nav files --- docs/antora.yml | 2 ++ docs/modules/asciidoc/nav.adoc | 21 ++++----------------- docs/modules/page/nav.adoc | 12 ++++++++++++ 3 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 docs/modules/page/nav.adoc diff --git a/docs/antora.yml b/docs/antora.yml index 9b20a3fc9..186a5fd74 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -4,8 +4,10 @@ prerelease: -alpha.2 title: Antora nav: - modules/ROOT/nav.adoc +- modules/page/nav.adoc - modules/asciidoc/nav.adoc - modules/navigation/nav.adoc - modules/playbook/nav.adoc +- modules/ROOT/nav-run.adoc - modules/pipeline/nav.adoc - modules/ROOT/nav-end.adoc diff --git a/docs/modules/asciidoc/nav.adoc b/docs/modules/asciidoc/nav.adoc index 55f34a218..3818b0bd8 100644 --- a/docs/modules/asciidoc/nav.adoc +++ b/docs/modules/asciidoc/nav.adoc @@ -1,12 +1,9 @@ -.xref:page:index.adoc[Pages] -* xref:page:page-id.adoc[Antora Page ID] -* xref:page:create-standard-page.adoc[Create a Standard Page] -* xref:page:page-aliases.adoc[Set Up URL Redirects with Page Aliases] +.AsciiDoc * xref:page-header.adoc[Page Header] ** xref:page-header.adoc#page-title[Title] ** xref:page-header.adoc#page-meta[Metadata] ** xref:page-header.adoc#page-attrs[Attributes] -* xref:section-headings.adoc[Page Sections] +* xref:section-headings.adoc[Sections] * xref:text-and-punctuation.adoc[Text and Punctuation Styles] ** xref:bold.adoc[Bold] ** xref:italic.adoc[Italic] @@ -15,23 +12,13 @@ ** xref:quotes-and-apostrophes.adoc[Quote Marks and Apostrophes] ** xref:special-characters-and-symbols.adoc[Special Characters and Symbols] ** xref:subscript-and-superscript.adoc[Subscript and Superscript] -* Cross References and Links -** xref:page-to-page-xref.adoc[Page to Page Xrefs] -** xref:in-page-xref.adoc[Same Page Xrefs] -** xref:external-urls.adoc[URLs] +* xref:in-page-xref.adoc[Same Page Xrefs] +* xref:external-urls.adoc[URLs] * xref:lists.adoc[Lists] ** xref:ordered-and-unordered-lists.adoc[Bullet and Numbered Lists] ** xref:description-lists.adoc[Description Lists] ** xref:checklists.adoc[Checklists] -* Include Partials, Pages, and Examples -** xref:page:resource-id.adoc[Antora Resource ID] -** xref:include-partial.adoc[Include a Partial] -** xref:include-example.adoc[Include an Example] -** xref:include-page.adoc[Include a Page] -// Assets & Attachments -* xref:insert-image.adoc[Insert an Image] * xref:embed-video.adoc[Embed a Video] -* xref:link-attachment.adoc[Link to an Attachment] * xref:ui-macros.adoc[UI Macros] // Paragraphs and Blocks * xref:admonitions.adoc[Admonitions] diff --git a/docs/modules/page/nav.adoc b/docs/modules/page/nav.adoc new file mode 100644 index 000000000..4631a9192 --- /dev/null +++ b/docs/modules/page/nav.adoc @@ -0,0 +1,12 @@ +.Pages & Resources +* xref:index.adoc[Pages] +* xref:create-standard-page.adoc[Create a Standard Page] +* xref:page-id.adoc[Antora Page ID] +* xref:asciidoc:page-to-page-xref.adoc[Page to Page Xrefs] +* xref:page-aliases.adoc[Set Up URL Redirects with Page Aliases] +* xref:resource-id.adoc[Antora Resource ID] +* xref:asciidoc:include-partial.adoc[Include a Partial] +* xref:asciidoc:include-example.adoc[Include an Example] +* xref:asciidoc:include-page.adoc[Include a Page] +* xref:asciidoc:insert-image.adoc[Insert an Image] +* xref:asciidoc:link-attachment.adoc[Link to an Attachment] -- GitLab From d5981eaff2cfdd1078de4387a2724cf8fd5e9df7 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:22:53 -0600 Subject: [PATCH 30/39] unify ID coordinate definitions and create partial --- .../asciidoc/pages/page-to-page-xref.adoc | 114 ------------------ docs/modules/page/pages/page-id.adoc | 100 +++++++++------ docs/modules/page/pages/resource-id.adoc | 86 +++++++++---- docs/modules/page/partials/antora-id.adoc | 44 +++++++ 4 files changed, 169 insertions(+), 175 deletions(-) delete mode 100644 docs/modules/asciidoc/pages/page-to-page-xref.adoc create mode 100644 docs/modules/page/partials/antora-id.adoc diff --git a/docs/modules/asciidoc/pages/page-to-page-xref.adoc b/docs/modules/asciidoc/pages/page-to-page-xref.adoc deleted file mode 100644 index 096dd6bdf..000000000 --- a/docs/modules/asciidoc/pages/page-to-page-xref.adoc +++ /dev/null @@ -1,114 +0,0 @@ -= Page Cross References -:colon: : - -To link between documentation pages, you'll use the the AsciiDoc cross reference macro and a page ID. -This syntax is also used to xref:navigation:link-syntax-and-content.adoc[reference pages from your navigation files]. - -== Reference by page ID - -In Antora, a cross reference, commonly abbreviated to xref, needs a xref:page:page-id.adoc[page ID] in order to link to another page in the site. -The number of page ID coordinates you need to specify in the xref depends on the location of the current page in relation to the location of the destination page (i.e., the page you want to link to). -The closer the two files are, the shorter the page ID. - -In the next section, we'll go over each part of the xref and page ID syntax. - -NOTE: The page ID is integral to Antora's ability to publish a site to multiple environments and domains without you needing to modify your source content. -If you want to learn more about the page ID, see xref:page:page-id.adoc#important[Why are page IDs important?] - -== Xref and page ID anatomy - -Let's dissect a cross reference with a fully-qualified page ID. - -image::xref-macro-anatomy-diagram.svg[Page reference anatomy,role=grow-x] - -Here's what each part of the cross reference and page ID does: - -xref{colon}:: -The prefix of the AsciiDoc cross reference (xref) macro, which we're using here to make a page reference. - -[#page-id-vname-def] -version@:: -The first page ID coordinate is used to specify the version name of the destination component. -This value is defined in the xref:ROOT:component-descriptor.adoc#version-key[component descriptor file] ([.path]_antora.yml_) in the branch of the component repository that hosts the destination file. -When the version coordinate is filled, it must be directly followed by an at sign (`@`). - -[#page-id-cname-def] -component-name{colon}:: -The second coordinate specifies the name of the destination component. -The component name is directly followed by one colon (`:`). -This value is defined in the xref:ROOT:component-descriptor.adoc#name-key[name key] of the component descriptor in the branch of the component repository that hosts the destination file. -If a component name is present, a module name must be specified after the `:`. -Otherwise, this coordinate gets interpreted as the module name. - -module-name{colon}:: -The third coordinate specifies the name of the destination module. -The module name is directly followed by one colon (`:`). -If a component name is present, and the name of the module is ROOT, the module name position can be left empty in some cases. -That's why you see a component name followed by two colons (`::`) sometimes. - -page.adoc:: -The fourth coordinate specifies the local path of the destination file relative to the module's documents directory. -This value may include one or more optional topic folders. -The destination file name must have the _.adoc_ file extension. - -#fragment:: -An optional ID of a section or anchor point to link to in the destination page (i.e., deep link). -This part is always optional. - -[link text]:: -The text of the link that is displayed to the reader. -This text must be entered inside a set of square brackets (`[]`) at the end of the macro. -If the text is not specified, the raw target is used. - -[#same-module] -== Scenario: In the same component and module - -When the current page and the destination page are in the same module, you only need to enter the name of the destination file. - -.Link to a page in the same module -[source,asciidoc] -xref:error-handling.adoc[Error Handling] - -.Link to a page in a topic folder -[source,asciidoc] -xref:concept/index.adoc[Key Concepts] - -.Link to a page in the same module but in a different version -[source,asciidoc] -xref:3.3@error-handling.adoc#message-list[error messages] - -[#different-module] -== Scenario: In the same component but a different module - -When the current page and the destination page are in the same component but different modules, you'll enter the name of the destination module and destination file. - -.Link to a page in another module -[source,asciidoc] -xref:get-started:implement-api.adoc[implement an API] - -.Link to a page in the ROOT module and in a topic folder -[source,asciidoc] -xref:ROOT:transports/c04-reference.adoc[C04 Transports] - -.Link to a page in the ROOT module and in a different version -[source,asciidoc] -The xref:3.4@ROOT:scopes/super-mass.adoc[super massive scope] splits atoms. - -[#different-component] -== Scenario: In a different component - -When the current page and the destination page are in different components, you must specify the target component. -If a version is not specified, the implicit value is the xref:ROOT:component-versions.adoc#latest-version[latest version]. -If the module is not specified, the implicit value is `ROOT`. - -.Link to a page in the ROOT module of a component explicitly specifying the version -[source,asciidoc] -How do I xref:2.0@default-ui::modify-template.adoc[modify a UI template]? - -.Link to a page in the ROOT module of a component without specifying version resolves to the latest version -[source,asciidoc] -xref:icons::index.adoc#intro[Introducing the Icon Project] - -.Link to a page in a module of a component without specifying version resolves to the latest version -[source,asciidoc] -xref:icons:web:modify-svg.adoc[Get started with the SVG assets] diff --git a/docs/modules/page/pages/page-id.adoc b/docs/modules/page/pages/page-id.adoc index 5991dee6c..acbe4f7a9 100644 --- a/docs/modules/page/pages/page-id.adoc +++ b/docs/modules/page/pages/page-id.adoc @@ -1,72 +1,94 @@ -= Page ID += Page IDs and Cross References +:page-aliases: asciidoc:page-to-page-xref.adoc +:family: page +:colon: : -In order for a page to be linked to, i.e., referenced, that page must have an identifier--a page ID. -An [.term]*Antora page ID* is a unique and reliable set of identifying coordinates, organized in a standard order, that are constructed from the properties assigned to each page's source file. +[#whats-a-page-id] +== What's a page ID? -[#structure] -== How is a page ID structured? +In order for a page to be referenced, that page must have an identifier--a page ID. +An [.term]*Antora page ID* is a unique and reliable set of identifying coordinates, organized in a standard sequence, that are constructed from the properties assigned to each page's source file. +A page ID is most often used as a target in an AsciiDoc xref macro, but it can also be assigned to certain attributes and keys. -Antora constructs a page ID for a page source file from the key-value pairs specified in a xref:component-version-descriptor.adoc[component version descriptor] and the xref:ROOT:standard-directories.adoc[standard directory set]. -Using this information, each page can be referenced using a unique and reliable set of page ID coordinates. +[#id-coordinates] +== What are the page ID coordinates? -[#id-version] -Version:: -The xref:ROOT:component-name-and-version.adoc#version-key[version of the component] to which the page belongs. +Antora constructs a page ID for a page source file from the key-value pairs specified in a xref:ROOT:component-version-descriptor.adoc[component version descriptor] and the xref:ROOT:standard-directories.adoc[standard directory set]. +Using this information, each page can be cross referenced using a sequence of page ID coordinates. -[#id-component] -Component:: -The xref:ROOT:component-name-and-version.adoc#name-key[name of the component] to which the page belongs. +include::partial$antora-id.adoc[tags=*;!resource] -[#id-module] -Module:: -The xref:ROOT:module-directories.adoc#module[module] in which the page is grouped. +The coordinates are organized into the standard sequence shown below. -Page:: -The path to the xref:ROOT:pages-directory.adoc[page's source file] in the module, including any leading topic directories and the _.adoc_ file extension. +image::page-id-anatomy-diagram.svg[Page ID anatomy,600] -These coordinates are organize in a standard structure to create a unique, fully-qualified page ID. +A page ID is used in an <<xref-macro,AsciiDoc xref macro>> to create a link from one page to another page. +They're also used to create the links in a xref:navigation:link-syntax-and-content.adoc[component version's navigation files]. -image::page-id-anatomy-diagram.svg[Page ID anatomy,600] +[#whats-a-cross-reference] +== What's a cross reference? -For example, this is the fully-qualified page ID for the "`How Antora Works`" page, which belongs to the ROOT module of the {page-component-title} {page-component-version} component version. +A [.term]*cross reference* indicates that an element in a page, such as a term or concept, is related to information on another page. +Cross reference is often abbreviated to *xref*. -[subs=attributes+] ----- -{page-component-version}@antora:ROOT:how-antora-works.adoc ----- +A cross reference is created using the AsciiDoc xref macro and the <<whats-a-page-id,page ID>> of the target page. +[[target-page]]The [.term]*target page* is the page the xref will link the site visitor to. +[[current-page]]The [.term]*current page* is the page containing the xref that links to the target page. +When a visitor clicks on an xref in the current page, that is, the page they're currently viewing, they'll be redirected to the target page. + +[#xref-macro] +== AsciiDoc xref macro + +An AsciiDoc xref macro needs to be supplied with a valid <<whats-a-page-id,page ID>> in order to create a link to the target page when the site is generated. +How many page ID coordinates you need to specify depends on the component version and module of the <<current-page,current page>> in relation to the <<target-page,target page>>. + +First, let's review the AsciiDoc xref macro syntax. + +image::xref-macro-anatomy-diagram.svg[Page reference anatomy,role=grow-x] + +xref{colon}:: +The prefix of the AsciiDoc xref macro. -== How is a page referenced with its ID? +page ID:: The page ID coordinates of the target page relative to the current page. -A page ID is used in an AsciiDoc cross reference, also called an xref, to link one documentation page to another documentation page. +#fragment:: +A section, block, or inline ID that deep links to an element in the target page. +A fragment is always optional. +The fragment ID starts with the hash symbol (`#`). -image::xref-macro-anatomy-diagram.svg[Page reference anatomy,780] +[link text]:: +The text that's displayed on the site. +When a visitor clicks on the link text, they're directed to the target page. +The text is entered inside a set of square brackets (`[]`) at the end of the macro. +If no text is specified, the generated URL of the target page is displayed. -Here's how that looks in practice: +Here's how an xref macro with a fully qualified page ID looks in practice: [subs=attributes+] ---- -Learn about xref:{page-component-version}@antora:ROOT:how-antora-works.adoc[the Antora pipeline]. +See xref:{page-component-version}@antora:ROOT:how-antora-works.adoc[how Antora works]. ---- -Specifying the version, component name, and even module every time seems like overkill, right? -Don't worry, there's a shorthand. +Specifying the version, component name, and even module every time seems verbose, right? +Don't worry, the more related the current and target pages are, the less coordinates you need to enter in the page ID. +For instance, if the target and current pages belong to the same component version and module, you only need to specify the page coordinate of the target page. -For instance, if you're linking to a page in the same module as the page you're linking from, all you need to do is specify the `page` coordinate. -A whole range of examples, from linking between different components to linking to different versions of a page, are explained in xref:asciidoc:page-to-page-xref.adoc[page cross references]. +xref:module-and-page-xrefs.adoc[Xrefs to pages in the same component version] has several examples showing how to create xrefs to pages that belong to the same module or component version. +For xref examples where the target and current pages belong to different components or different versions of the same component, see xref:version-and-component-xrefs.adoc[Xrefs to pages in other components and versions]. [#important] == Why are page IDs important? -*We've avoided coupling to the published URL* by using a source-to-source reference. +*They're not coupled to a published URL* because they're a source-to-source reference. Notice the page coordinate ends with [.path]_.adoc_, the file extension of an AsciiDoc source file. Regardless of whether you're deploying your site locally, to a staging or production environment, or you change URL strategies, the page ID always remains the same. -The cross reference locks on to the target page and produces a URL that points to it wherever it gets published. +The xref locks on to the target page and produces a URL that points to it wherever it gets published. -*We've avoided coupling to the filesystem* by using an identifier based on the Antora's virtual component version classification system. +*They're minimally coupled to the filesystem* by using an identifier based on the Antora's virtual component version classification system. -*We've eliminated the relative path (../../) problem* by specifying the page as a module-relative path. +*They've eliminated the relative path (../../) problem* by specifying the page as a pages-relative path. The path always starts from a module's [.path]_pages_ directory, even when the referencing page is located inside a topic folder. -If you move or rename a page within a module, you don't have to change any references to other pages. +//If you move or rename a page within a module, you don't have to change any references to other pages. *This human-friendly referencing system saves you from having to do computations in your head while writing*. You just specify the coordinates of the page you want to reference. diff --git a/docs/modules/page/pages/resource-id.adoc b/docs/modules/page/pages/resource-id.adoc index eb2968596..5d5496f41 100644 --- a/docs/modules/page/pages/resource-id.adoc +++ b/docs/modules/page/pages/resource-id.adoc @@ -1,37 +1,79 @@ -= Resource Identifier += Resources and Resource IDs +:family: resource +:colon: : -No matter which component or module it is stored in, you can include any partial or example in any page, just like you can "`call`" any page using its page ID. +No matter which component version or module a resource's source file belongs to, you can add it to any page in your site using its resource ID and the applicable AsciiDoc syntax. -To insert a partial or example from another module or component into a page, you use it's resource ID. -A resource ID is very similar to a page ID except it specifies a family coordinate. +[#whats-a-resource-id] +== What's a resource ID? -== How is a resource ID structured? +An [.term]*Antora resource ID* is a unique and reliable set of identifying coordinates, organized in a standard sequence, that are constructed from the properties assigned to each resource's source file. -The resource ID is identical to a xref:page-id.adoc#structure[page ID], except it specifies one additional coordinate, the Family. +A [.term]*resource* is a source file that is assigned to the attachments, examples, images, pages, or partials family. +When a resource is referenced, the target value in the corresponding AsciiDoc macro or include directive must be a valid Antora resource ID. -Family:: -The purpose of a resource file. -Files are assigned a family designation based on whether they're stored in _partials_ or _examples_. +In Antora, a resource is referenced using an AsciiDoc include directive, link macro, or image macro and the resource ID of the target resource. +(Except for <<reference-syntax-id-requirements,attachments>>.) +[[target-resource]]The [.term]*target resource* is the source file that will be embedded in current page when the site is published. +[[current-page]]The [.term]*current page* is the page, partial, or example containing the AsciiDoc macro or directive that references the target resource. -The family coordinate is appended with a dollar sign (`$`) and specified after the module coordinate but before the page coordinate. +[#id-coordinates] +== What are the resource ID coordinates? - version@component:module:family$relative/path-to/resource.ext +Antora constructs a resource ID for a source file from the key-value pairs specified in a xref:ROOT:component-version-descriptor.adoc[component version descriptor] and the xref:ROOT:standard-directories.adoc[standard directory set]. +Using this information, a resource can be referenced from any page, partial, or example in your site using a unique and reliable set of resource ID coordinates. -The family coordinate accepts the value `partial` or `example`. +include::partial$antora-id.adoc[tags=*;!page] -== How is a resource referenced with its ID? +A fully qualified resource ID with its coordinates organized in the standard sequence is shown below. -A resource ID is used in an AsciiDoc include directive. -Here's how the include directive is structured when inserting a specific version of a partial resource from the ROOT module of a component named cli. + version@component:module:family$resource.ext - include::2.2@cli::partial$commands.adoc[] +How many resource ID coordinates you need to specify when referencing a resource depends on the component version and module of the <<current-page,current page>> in relation to the <<target-resource,target resource>>. -Or, if you included a tagged region of an example into a page in the same module. +[#requires-family-coordinate] +== When is the family coordinate required? - include::example$config.json[tag=parse] +The family coordinate doesn't always need to be specified in a resource ID. +It may be implicitly assigned by the AsciiDoc syntax you use to reference the resource. +For instance, an image is always embedded in a page using an AsciiDoc image macro. +Since images are only referenced using the image macros, the `image$` coordinate is automatically applied to the target resource ID at runtime. -== Learn more +On the other hand, the AsciiDoc include directive can be used to reference partials, examples, and pages, so a family coordinate must be specified in the target resource ID. +The syntax that requires an explicit family coordinate is listed in the table below. -* xref:asciidoc:include-partial.adoc[Include a partial] -* xref:asciidoc:include-example.adoc[Include an example] -* xref:asciidoc:include-page.adoc[Include content from a standard page] +[#reference-syntax-id-requirements] +[cols="1,4,5"] +|=== +|Resource |Referencing syntax |Resource ID requirements + +|Attachments +|`+link:{attachmentsdir}/file-name.ext[]+` +|Currently, an attachment can't be referenced using a resource ID. +*The attribute reference `+{attachmentsdir}+` is required* in the target value. +See xref:asciidoc:link-attachment.adoc[Link to an attachment]. + +|Examples +|`include::resource-id[]` +|*The `example$` coordinate is required* in the target value. +See xref:asciidoc:include-example.adoc[Include an example]. + +.2+|xref:images.adoc[Images] +|`image::resource-id[]` +|No family coordinate required; it's automatically applied at runtime. +See xref:block-images.adoc[Add block images] and xref:image-resource-id-examples.adoc[Image resource ID examples]. + +|`+image:resource-id[]+` +|No family coordinate required; it's automatically applied at runtime. +See xref:inline-images.adoc[Add inline images] and xref:image-resource-id-examples.adoc[Image resource ID examples]. + +|xref:index.adoc[Pages] +|`include::resource-id[]` +|*The `page$` coordinate is required* in the target value. +See xref:asciidoc:include-page.adoc[Include a page]. + +|xref:partials-and-content-snippets.adoc[Partials] +|`include::resource-id[]` +|*The `partial$` coordinate is required* in the target value. +See xref:asciidoc:include-partial.adoc[Include a partial]. +|=== diff --git a/docs/modules/page/partials/antora-id.adoc b/docs/modules/page/partials/antora-id.adoc new file mode 100644 index 000000000..0703f0389 --- /dev/null +++ b/docs/modules/page/partials/antora-id.adoc @@ -0,0 +1,44 @@ +//:family: page +//:family: resource +//:colon: : + +// tag::id[] +[#id-version] +version@:: +The first coordinate identifies the version of the component to which the target {family} belongs. +The version is specified by the xref:ROOT:component-name-and-version.adoc#version-key[version key] in the [.path]_antora.yml_ file that defines the {family}'s component version. +The version coordinate is directly followed by an at sign (`@`). + +[#id-component] +component{colon}:: +The second coordinate identifies the name of the component to which the target {family} belongs. +The component name is specified by the xref:ROOT:component-name-and-version.adoc#name-key[name key] in the [.path]_antora.yml_ file that defines the {family}'s component version. +The component name is directly followed by one colon (`:`). + +[#id-module] +module{colon}:: +The third coordinate identifies the name of the module to which the target {family} belongs. +The module name is derived from the xref:ROOT:module-directories.adoc#module[module directory] where the {family} is stored. +The module name is directly followed by one colon (`:`). + +// tag::resource[] +[#id-family] +family$:: +The fourth coordinate identifies the name of the family to which the target {family} belongs. +The family is derived from the xref:ROOT:family-directories.adoc[family directory] where the {family} is stored. +Remove the "`s`" at the end of the family's name and replace it with a dollar sign (`$`) when constructing a resource ID. +Whether or not the family coordinate needs to be specified xref:page:resource-id.adoc#requires-family-coordinate[depends on the AsciiDoc syntax used to reference the resource]. + +[#id-resource] +resource.ext:: +The fifth coordinate specifies the path, relative to the xref:ROOT:family-directories.adoc[family directory], of the target resource's source file. +The filename must include the file extension. +// end::resource[] + +// tag::page[] +[#id-page] +page.adoc:: +The fourth coordinate specifies the path, relative to the xref:ROOT:pages-directory.adoc[_pages_ family directory], of the target page's source file. +The filename must include the _.adoc_ file extension. +// end::page[] +// end::id[] -- GitLab From a327525950b4e5b19af81195190543232c2cd4a3 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:28:19 -0600 Subject: [PATCH 31/39] create xref pages and write new examples --- .../page/pages/module-and-page-xrefs.adoc | 103 +++++++++++ .../pages/version-and-component-xrefs.adoc | 167 ++++++++++++++++++ 2 files changed, 270 insertions(+) create mode 100644 docs/modules/page/pages/module-and-page-xrefs.adoc create mode 100644 docs/modules/page/pages/version-and-component-xrefs.adoc diff --git a/docs/modules/page/pages/module-and-page-xrefs.adoc b/docs/modules/page/pages/module-and-page-xrefs.adoc new file mode 100644 index 000000000..34da126f3 --- /dev/null +++ b/docs/modules/page/pages/module-and-page-xrefs.adoc @@ -0,0 +1,103 @@ += Xref Pages in a Component Version +:xrefstyle: short +:listing-caption: Example + +The majority of your cross references will probably be between pages that belong to the xref:ROOT:module-directories.adoc#module[same module] or to the xref:ROOT:component-version.adoc[same component version]. + +[#xref-page-in-module] +== Xref pages that belong to the same module + +Only the xref:page-id.adoc#id-page[page coordinate] of the xref:page-id.adoc#target-page[target page] needs to be entered in the page ID when the xref:page-id.adoc#current-page[current page] and target page belong to the same component version and module. + +[#ex-in-module-base] +.current-page.adoc +---- +xref:target-page-filename.adoc[link text] +---- + +For context, let's use the pages that belong to the component version `colorado 5.2` as the basis for the examples on this page. +The component version's source files are stored in the xref:ROOT:standard-directories.adoc[set of standard directories] listed in <<ex-co>>. + +[#ex-co] +.Standard directories assigned to the component version colorado 5.2 +---- +📒 repository + 📄 antora.yml + 📂 modules + 📂 get-started + 📂 pages + 📄 tour.adoc + 📂 la-garita + 📂 pages + 📄 cochetopa-pass.adoc + 📄 index.adoc + 📂 ROOT + 📂 pages + 📄 index.adoc + 📄 ranges.adoc + 📂 terms + 📄 faqs.adoc +---- + +The simplest xref is when the target and current pages belong to the same module. +<<ex-in-module>> shows an xref in the page [.path]_index.adoc_ (current page) that links to the [.path]_cochetopa-pass.adoc_ page (target page). +Both pages belong to the `la-garita` module. + +[#ex-in-module] +.index.adoc (current page) +---- +There are xref:cochetopa-pass.adoc[historic passes] in the range. +---- + +When the xref in <<ex-in-module>> is converted by Antora, it will become a link to the published site page at [.path]_\https://base-url.com/colorado/5.2/la-garita/cochetopa-pass.html_. + +=== Xref pages in a topic folder + +If the target page is nested in a topic folder, include the [.path]_pages_ family directory relative path in the page coordinate. +In <<ex-topic>>, an xref in the page [.path]_ranges.adoc_ (current page) links to the [.path]_faqs.adoc_ page (target page). +Both pages belong to the `ROOT` module, and [.path]_faqs.adoc_ is nested in the topic folder [.path]_terms_. + +[#ex-topic] +.ranges.adoc (current page) +---- +See the xref:terms/faqs.adoc[FAQs]. +---- + +The xref in <<ex-topic>> will become a link to the published site page at [.path]_\https://base-url.com/colorado/5.2/terms/faqs.html_ when the site is generated. + +[#xref-page-across-modules] +== Xref pages from other modules + +The target page's xref:page-id.adoc#id-module[module coordinate] and page coordinate are required when the current and target pages belong to different modules. + +[#ex-across-modules-base] +.current-page.adoc +---- +xref:module:target-page-filename.adoc[link text] +---- + +The following examples use the pages that belong to the component version <<ex-co,colorado 5.2>>. +As seen in <<ex-across-modules>>, let's create an xref in the page [.path]_ranges.adoc_ (current page) that links to [.path]_cochetopa-pass.adoc_ (target page). +The _ranges.adoc_ page belongs to the `ROOT` module, while [.path]_cochetopa-pass.adoc_ belongs to the `la-garita` module. + +[#ex-across-modules] +.ranges.adoc (current page) +---- +Only xref:la-garita:cochetopa-pass.adoc[one pass is open] in the winter. +---- + +When published to a site, the current page will contain a link to the published target page's URL [.path]_\https://base-url.com/colorado/5.2/la-garita/cochetopa-pass.html_. + +If the target page is nested in a topic folder, include the [.path]_pages_ family directory relative path as part of the page coordinate. +In <<ex-modules-topic>>, an xref in the page [.path]_tour.adoc_ (current page) links to the [.path]_faqs.adoc_ page (target page). +The page [.path]_tour.adoc_ belongs to the `get-started` module, and [.path]_faqs.adoc_ belongs to the `ROOT` module and is nested in the topic folder [.path]_terms_. + +[#ex-modules-topic] +.tour.adoc (current page) +---- +See the xref:ROOT:terms/faqs.adoc[FAQs]. +---- + +== Learn more + +To learn how to create xrefs to pages that belong to other components and component versions see xref:version-and-component-xrefs.adoc[Xref pages in other components and versions]. diff --git a/docs/modules/page/pages/version-and-component-xrefs.adoc b/docs/modules/page/pages/version-and-component-xrefs.adoc new file mode 100644 index 000000000..5638ca068 --- /dev/null +++ b/docs/modules/page/pages/version-and-component-xrefs.adoc @@ -0,0 +1,167 @@ += Xref Pages in Other Components and Versions +:xrefstyle: short +:listing-caption: Example + +Sometimes you'll need to create cross references between pages that belong to different docs components. +In these cases, you'll often construct a fully qualified page ID. +You can also create xrefs between pages that belong to different versions of the same component. + +[#xref-page-in-different-docs-component] +== Xref pages from other docs components + +When the xref:page-id.adoc#current-page[current] and xref:page-id.adoc#target-page[target] pages belong to different docs components, you must, at a minimum, specify the target xref:page-id.adoc#id-coordinates[component, module, and page coordinates]. +You'll almost always specify the target version coordinate, too. + +[#ex-component-version-base] +.current-page.adoc +---- +xref:version@component:module:target-page-filename.adoc[link text] +---- + +For context, let's use the pages that belong to the component versions `colorado 5.2` and `wyoming 1.0` as the basis for the examples on this section. +Their source files are stored in the xref:ROOT:standard-directories.adoc[standard directory trees] listed in <<ex-co-and-wy>>. + +[#ex-co-and-wy] +.Standard directories assigned to the component versions colorado 5.2 and wyoming 1.0 +---- +📒 repository + 📄 antora.yml <- Declares files belong to colorado 5.2 + 📂 modules + 📂 get-started + 📂 pages + 📄 tour.adoc + 📂 la-garita + 📂 pages + 📄 cochetopa-pass.adoc + 📂 ROOT + 📂 pages + 📄 index.adoc + 📄 ranges.adoc + +📒 repository + 📂 docs + 📄 antora.yml <- Declares files belong to wyoming 1.0 + 📂 modules + 📂 sierra-madre + 📂 pages + 📄 elevation.adoc + 📄 wilderness-areas.adoc +---- + +<<ex-across-components>> shows an xref in the page [.path]_index.adoc_ (current page) that links to the [.path]_elevation.adoc_ page (target page). +[.path]_index.adoc_ belongs to version `5.2` of the component `colorado`. +[.path]_elevation.adoc_ belongs to version `1.0` of the component `wyoming`. + +[#ex-across-components] +.index.adoc (current page) +---- +See xref:1.0@wyoming:sierra-madre:elevation.adoc[How are peaks measured]? +---- + +When the xref in <<ex-across-components>> is converted, it will become a link to the published site page at [.path]_\https://base-url.com/wyoming/1.0/sierra-madre/elevation.html_. + +In <<ex-across-components-short-root>>, the page [.path]_ranges.adoc_ is referenced from the page [.path]_elevation.adoc_ (current page). +The target page, [.path]_ranges.adoc_, belongs to the `ROOT` module of the `colorado` component. + +[#ex-across-components-short-root] +.elevation.adoc (current page) +---- +xref:5.2@colorado::ranges.adoc[List of ranges by height] +---- + +Notice in <<ex-across-components-short-root>> that the module name `ROOT` seems to be missing from the page ID. +When a component coordinate is specified in a page ID, and the target page belongs to the `ROOT` module, the module coordinate `ROOT` doesn't have to be explicitly specified. +But you must still enter the colon `:` that would follow the module coordinate. +You can see this `:` directly before the page coordinate `ranges.adoc`. +This shorthand only works when a component coordinate is specified and the target module is `ROOT`. +In all other cases where the target module coordinate is required, the name of the module must be specified. + +[#xref-latest-version-of-component-version-page] +=== Xref the latest version of a page + +TIP: This behavior only applies when the target and current pages belong to different docs components! + +If a version isn't specified in the target page ID, *and the target and current pages belong to a different docs components*, Antora will use the xref:ROOT:how-component-versions-are-sorted.adoc#latest-version[latest version] of the target component to complete the page ID. + +Using the component versions previously described in <<ex-co-and-wy>>, let's create an xref in the page [.path]_index.adoc_ (current page) that links to the [.path]_elevation.adoc_ page (target page). +The xref is shown below in <<ex-across-components-latest>>. +[.path]_index.adoc_ belongs to version `5.2` of the component `colorado`. +[.path]_elevation.adoc_ belongs to version `1.0` of the component `wyoming`. +Notice that the target page's version coordinate isn't specified. + +[#ex-across-components-latest] +.index.adoc (current page) +---- +See xref:wyoming:sierra-madre:elevation.adoc[How are peaks measured]? +---- + +Since there isn't a version coordinate in <<ex-across-components-latest>>, Antora will automatically complete the page ID at runtime using the latest version -- `1.0` -- of the `wyoming` component. +When you release a newer version of `wyoming`, such as version `1.5`, and add it to your site, the xref in <<ex-across-components-latest>> will automatically link to the [.path]_elevation.adoc_ page in version `1.5` of `wyoming`. + +WARNING: This behavior of linking to the latest version only applies when the version coordinate is unspecified and the target and current pages belong to different components. +If you don't specify a version and a component in the page ID, Antora assumes the target page's version and component are the same as the current page's version and component coordinates. + +[#xref-page-in-different-version] +== Xref pages from other versions + +When the current and target pages belong to the same docs component, but the target page belongs to a different version of that component, you'll specify the target version, module (if it's different), and page coordinates. + +[#ex-version-module-base] +.current-page.adoc +---- +xref:version@module:target-page-filename.adoc[link text] +---- + +If the target and current pages belong to the same module, too, then you only need to specify the target version and page coordinates. + +[#ex-version-base] +.current-page.adoc +---- +xref:version@target-page-filename.adoc[link text] +---- + +For context, let's use the pages that belong to the component versions `colorado 5.2` and `colorado 6.0` as the basis for the example in this section. +Their source files are stored in the xref:ROOT:standard-directories.adoc[standard directory trees] listed in <<ex-co-versions>>. + +[#ex-co-versions] +.Standard directories assigned to the component versions colorado 5.2 and colorado 6.0 +---- +📒 repository | branch name v5.2.x + 📄 antora.yml <- Declares files belong to colorado 5.2 + 📂 modules + 📂 get-started + 📂 pages + 📄 tour.adoc + 📂 la-garita + 📂 pages + 📄 cochetopa-pass.adoc + 📂 ROOT + 📂 pages + 📄 index.adoc + 📄 ranges.adoc + +📒 repository | branch name v6.0.x + 📄 antora.yml <- Declares files belong to colorado 6.0 + 📂 modules + 📂 la-garita + 📂 pages + 📄 cochetopa-pass.adoc + 📂 ROOT + 📂 pages + 📄 index.adoc + 📄 ranges.adoc +---- + +Notice that the `colorado 5.2` component version has a [.path]_tour.adoc_ page that belongs to the `get-started` module. +However, `colorado 6.0` has no such module or page. + +Let's reference the page [.path]_tour.adoc_ (target page), which belongs to `colorado 5.2`, from the page [.path]_cochetopa-pass.adoc_ (current page), which belongs to the `colorado 6.0` component version. +In <<ex-across-versions>>, the xref specifies the target page's version, module, and page coordinates. + +[#ex-across-versions] +.cochetopa-pass.adoc (current page) in colorado 6.0 +---- +Last year's xref:5.2@get-started:tour.adoc[excursions] were riveting! +---- + +When the xref in <<ex-across-versions>> is converted by Antora, it will become a link to the published site page at [.path]_\https://base-url.com/colorado/5.2/get-started/tour.html_. -- GitLab From 1d5b3bd00db888bb8d84b6226771615e755611b9 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:31:15 -0600 Subject: [PATCH 32/39] move partial page description; restructure introductions --- .../page/pages/create-standard-page.adoc | 9 +-- docs/modules/page/pages/index.adoc | 74 +++++-------------- .../pages/partials-and-content-snippets.adoc | 10 +++ docs/modules/page/pages/start-page.adoc | 16 ++++ 4 files changed, 47 insertions(+), 62 deletions(-) create mode 100644 docs/modules/page/pages/partials-and-content-snippets.adoc create mode 100644 docs/modules/page/pages/start-page.adoc diff --git a/docs/modules/page/pages/create-standard-page.adoc b/docs/modules/page/pages/create-standard-page.adoc index 2aa915f5a..6c305c066 100644 --- a/docs/modules/page/pages/create-standard-page.adoc +++ b/docs/modules/page/pages/create-standard-page.adoc @@ -1,7 +1,8 @@ -= Create a Standard Page += Name and Set Up a Page -A standard page is an AsciiDoc file in the [.path]_pages_ directory of a module. -Standard pages have a header, which includes the page title, and a body, which includes the majority of the page's displayed content. +A page is an AsciiDoc file in the [.path]_pages_ directory of a module. +Pages have a header and a body. +The page body includes the majority of the page's displayed content. . Start a new file in a plain text editor such as Atom, Brackets, or gedit. @@ -68,8 +69,6 @@ The page body includes the: * section headings * section content such as paragraphs, xref:asciidoc:lists.adoc[lists], source code blocks, images, included partials, and much more -//To explore the full capabilities of each AsciiDoc element, check out the documentation under the AsciiDoc collection in the menu on the left. - [IMPORTANT] .Key Points to Remember ==== diff --git a/docs/modules/page/pages/index.adoc b/docs/modules/page/pages/index.adoc index 24b836f49..6fa153f41 100644 --- a/docs/modules/page/pages/index.adoc +++ b/docs/modules/page/pages/index.adoc @@ -1,66 +1,26 @@ -= Pages -:keywords: Antora file, Antora site page += Add Pages to a Component Version -On this page, you'll learn: +== Source page to site page -* [x] The difference between a standard and a partial page. -* [x] How Antora handles an [.path]_index.adoc_ file stored in the ROOT module of a component. +Antora automatically generates one HTML site page for each AsciiDoc source file assigned to the pages family. +Another way to think about this: one AsciiDoc page file in equals one HTML page out. -Antora generates site pages from AsciiDoc files. -AsciiDoc files are text files marked up with the xref:asciidoc:asciidoc.adoc[AsciiDoc syntax] and saved with the file extension `.adoc`. +[#standard-asciidoc-page] +== Standard AsciiDoc source pages -Whether Antora automatically processes an AsciiDoc file depends on where it is stored in a documentation component. +Page source files are plain text files marked up with the xref:asciidoc:asciidoc.adoc[AsciiDoc syntax] and saved with the file extension `.adoc`. +They're stored in a xref:ROOT:pages-directory.adoc[_pages_ family directory]. -[#standard] -== Standard page +A xref:create-standard-page.adoc[standard page has a title and body content]. +You can use just a little AsciiDoc syntax to mark up your pages, or you can explore the breadth of AsciiDoc and Antora's capabilities such as scoped attributes, including tagged regions from resources, and UI macros. -Antora generates one site page for each AsciiDoc file located in the [.path]_pages_ directory of a module. -These files are converted to individual HTML pages automatically. -Another way to think about this: one AsciiDoc file in equals one HTML page out. +== Linking pages -my-page.adoc => my-page.html +Antora automatically publishes all of the standard source pages to your site, but if you want to create page-to-page links in the content, you'll need to learn about xref:page-id.adoc[Antora's page IDs] and how to create xref:page-id.adoc#whats-a-cross-reference[cross references]. +You'll also use cross references and page IDs to build and organize your site's xref:navigation:index.adoc[component version page menus]. +//If you don't want to include a page in a component menu, visitors will still be able to find it using search tools and through links to it on other pages, and in some scenarios, through dropdown menus such as the page version selector. -While all standard pages are automatically included in your site, if you want visitors to locate and go to a specific page using a component navigation menu, then you must add a cross reference (`xref`) to that page in the appropriate xref:navigation:index.adoc[navigation source file]. -If you don't want to include a page in a component menu, visitors will still be able to find it using search tools and through links to it on other pages, and in some scenarios, through dropdown menus such as the page version selector. +== Learn more -Learn more: - -* xref:create-standard-page.adoc[Create a standard page] -* xref:asciidoc:include-page.adoc[Insert content from a standard page into another page] -* xref:ROOT:pages-directory.adoc[The _pages_ directory] -* xref:navigation:link-syntax-and-content.adoc#page[Add a page xref to a navigation file] - -[#partial] -== Reusable partial pages - -Partials are usually AsciiDoc source files (_.adoc_) that contain content snippets, such as common descriptions, terminology, or reference tables, that you plan to insert in multiple pages. -They may also be reusable UML, STEM, or CSV/TSV content. -The source files for partials are stored in a [.path]_partials_ directory. -Partials aren't converted to HTML by Antora automatically. -Instead, they must be referenced by an xref:asciidoc:include-partial.adoc[include directive] in a standard page. - -Partials are good for storing snippets of content, such as concept definitions or project introductions, that you reuse in one or more standard pages. -When you change the content in a partial, those changes will be disseminated to all of the standard pages where you embedded that partial with an include directive. - -Learn more: - -* xref:ROOT:partials-directory.adoc[The _partials_ directory] -* xref:asciidoc:include-partial.adoc[Insert a partial into a standard page] - -== Component version index page - -If a file named [.path]_index.adoc_ exists in the ROOT module of a component, Antora will automatically set this page as the start page of that component version. - -component:ROOT:index.adoc => site.com/component/index.html - -Learn more: - -//* Create a component index page -* xref:ROOT:component-start-page.adoc[Specify a component version's start page] - -//* html extension options -* xref:ROOT:root-module-directory.adoc[The ROOT module directory] - -// TIP: see the html strategies for dropping the html and index for URLs - -// Site index page +* xref:page-id.adoc[Page IDs and cross references] +* xref:create-standard-page.adoc[Name and set up a page] diff --git a/docs/modules/page/pages/partials-and-content-snippets.adoc b/docs/modules/page/pages/partials-and-content-snippets.adoc new file mode 100644 index 000000000..ddffd9938 --- /dev/null +++ b/docs/modules/page/pages/partials-and-content-snippets.adoc @@ -0,0 +1,10 @@ += Content Snippets and Partials + +Partials contain regular content that's typically written and structured so that it can be inserted into more than one page. +They're stored in a xref:ROOT:partials-directory.adoc[_partials_ directory] and can be referenced by any page or partial, regardless of the component version they belong to. + +== Reusable, single source content + +Partials are good for storing snippets of content, such as common descriptions, project introductions, terminology, frequent admonitions, and reference tables, that you reuse in one or more pages throughout your site. +When you change the content in a partial, those changes will disseminate to all of the pages where you embedded that partial with an xref:asciidoc:include-partial.adoc[AsciiDoc include directive]. +Specific regions or lines from a partial can also be inserted in a page using the include directive's `tag`, `tags`, or `lines` attributes. diff --git a/docs/modules/page/pages/start-page.adoc b/docs/modules/page/pages/start-page.adoc new file mode 100644 index 000000000..b1e53b450 --- /dev/null +++ b/docs/modules/page/pages/start-page.adoc @@ -0,0 +1,16 @@ += Create a Start Page + +A component version needs a start page. +You can create a page named [.path]_index.adoc_, which Antora will use as the component version's start page by default, or you can specify a start page using the `start_page` key. + +== Use the default start page + +To use Antora's default start page option, create an AsciiDoc source file named [.path]_index.adoc_ and save it in the xref:ROOT:pages-directory.adoc[_pages_ directory] of the xref:ROOT:root-module-directory.adoc[_ROOT_ module directory]. +Structure and add content to [.path]_index.adoc_ like you would to any other page you write. +Antora will automatically set this page as the start page of the component version when the site is generated. + +== Specify a start page + +You can assign a specific page, regardless of its file name, to be a component version's start page. +The source file must belong to the component version it will be the starting page for, and it must be in the `pages` family. +Once you've created or selected the page, assign it as the component version's start page using the xref:ROOT:component-start-page.adoc[start_page key] in [.path]_antora.yml_. -- GitLab From c355fbd1ea6ac78a2e23958fcb876317d55ce082 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:33:18 -0600 Subject: [PATCH 33/39] move image topics to discreet pages; rewrite examples --- docs/modules/asciidoc/pages/insert-image.adoc | 290 ------------------ docs/modules/page/pages/block-images.adoc | 69 +++++ .../pages/image-resource-id-examples.adoc | 236 ++++++++++++++ docs/modules/page/pages/images.adoc | 29 ++ docs/modules/page/pages/inline-images.adoc | 60 ++++ 5 files changed, 394 insertions(+), 290 deletions(-) delete mode 100644 docs/modules/asciidoc/pages/insert-image.adoc create mode 100644 docs/modules/page/pages/block-images.adoc create mode 100644 docs/modules/page/pages/image-resource-id-examples.adoc create mode 100644 docs/modules/page/pages/images.adoc create mode 100644 docs/modules/page/pages/inline-images.adoc diff --git a/docs/modules/asciidoc/pages/insert-image.adoc b/docs/modules/asciidoc/pages/insert-image.adoc deleted file mode 100644 index db59f2ac2..000000000 --- a/docs/modules/asciidoc/pages/insert-image.adoc +++ /dev/null @@ -1,290 +0,0 @@ -= Insert an Image -:listing-caption: Example -:xrefstyle: short - -On this page, you'll learn: - -* [x] The basic structure of the block image macro. -* [x] The basic structure of the inline image macro. -* [x] How to insert an image into a page using its resource ID. - -== Block and inline images - -There are two image macro types, block and inline. - ----- -This is a paragraph. - -image::resource-id[optional attributes] // <1> - -This is a sentence with an inline image image:resource-id[optional attributes]. // <2> ----- -<1> A block image is designated by two colons (`::`) after the macro name. -It's preceded by a blank line, entered on a line by itself, and then followed by blank line. -<2> An inline image is entered into the flow of the content. -It's designated by a single colon (`:`) after the macro name. - -=== Block image macro structure - -A block image is usually displayed as a discrete element on a site page. -Let's break down the AsciiDoc syntax and resource coordinates you need to insert a block image into a page. - -. On a new line, enter the macro's name followed by two colons, `image::`. -Make sure there is a blank line between the previous element, such as a paragraph or source block, and the line where you place the image macro. -+ -[subs=+quotes] ----- -This is a paragraph. - -**image::** ----- - -. Enter the resource ID of the image file. -An image's resource coordinates are assembled like the xref:page-to-page-xref.adoc#same-module[coordinates in an xref]. -In this example, the image file is stored in the same module as the page it is being inserted into, so you only need to identify the image's file name. -Enter the image's file name, including its extension, directly after the colons. -+ -[subs=+quotes] ----- -image::**name-of-file.ext** ----- - -. Complete the macro with a set of square brackets (`+[]+`). -+ -[subs=+quotes] ----- -image::name-of-file.ext**[]** ----- - -. Press kbd:Enter[] twice after the last square bracket (`]`) to insert a new line after the image macro. -+ ----- -This is a paragraph. - -image::name-of-file.ext[] - -This is another paragraph. ----- - -=== Inline image macro structure - -An inline image is displayed in the content flow of another element, such as a paragraph. -The inline image macro is structured almost identically to the block image macro except for a few differences. - -. After the word or other content where you want to insert the image, press the kbd:[SPACE] bar once, and then enter the macro's name followed by one colon (`image:`). -+ -[subs=+quotes] ----- -This sentence has an inline *image:* ----- - -. Enter the resource ID of the image file. -An image's resource coordinates are assembled like the xref:page-to-page-xref.adoc#same-module[coordinates in an xref]. -In this example, the image file is stored in the same module as the page it is being inserted into, so you only need to identify the image's file name. -Enter the image's file name, including its extension, directly after the colon. -Then complete the macro with a set of square brackets (`+[]+`). -+ -[subs=+quotes] ----- -This sentence has an inline image:**name-of-file.ext[]** ----- - -. Press the kbd:[SPACE] bar once after the last square bracket (`]`) to insert a space after the macro, then continue entering your content. -+ -[subs=+quotes] ----- -This sentence has an inline image:name-of-file.ext[] image in it. -Yet another sentence! ----- - -== Use images stored in the same component but different modules - -To use an image from the same component but a different module, the image's resource ID needs to specify the module name where the image is stored. -After the macro prefix, enter the name of the module where the image is stored followed by a colon (`:`). -Then enter the image's file name, including its extension, followed by a set of square brackets (`+[]+`). - ----- -image::name-of-module:name-of-file.ext[] ----- - -<<ex-1>> and <<ex-2>> are based on a component named `colorado`. -Colorado contains two modules named `la-garita` and `ROOT`. - -.Directories and files in the Colorado component -.... -colorado - modules - la-garita - images - wilderness-map.jpg - pages - cochetopa-pass.adoc - index.adoc - ROOT - images - peak.svg - pages - index.adoc - ranges.adoc -.... - -In <<ex-1>>, the image [.path]_peak.svg_, stored in `ROOT`, is used in a page stored in the `la-garita` module. - -.Insert peak.svg into cochetopa-pass.adoc -[#ex-1] ----- -The elevation of Cochetopa pass is image:ROOT:peak.svg[] 10,067 ft (3,068 m). ----- - -In <<ex-2>>, the [.path]_wilderness-map.jpg_ image, stored in `la-garita`, is referenced by a page stored in the `ROOT` module. - -.Insert wilderness-map.jpg into ranges.adoc -[#ex-2] ----- -image::la-garita:wilderness-map.jpg[] ----- - -== Use images stored in different components - -To use an image stored in another component, the image's resource ID needs to specify the component and module where the image file is stored. -After the macro prefix, enter the name of the component followed by a colon (`:`) and the name of the module followed by a colon where the image is stored. -Then, enter the image's file name, including its extension, followed by a set of square brackets (`+[]+`). - ----- -image::name-of-component:name-of-module:name-of-file.ext[] ----- - -When the image is stored in the ROOT module of another component, `ROOT` doesn't need to be entered into the resource ID. -It's designated by entering another colon (`:`) directly after the colon following the component's name. - ----- -image::name-of-component::name-of-file.ext[] ----- - -<<ex-3>> and <<ex-4>> are based on a component named `colorado` and a component named `wyoming`. - -.Directories and files in the Colorado component and Wyoming component -.... -colorado - modules - ROOT - images - peak.svg - pages - index.adoc - ranges.adoc - ... - -wyoming - modules - sierra-madre - images - elevation.png - pages - wilderness-areas.adoc - ... -.... - -In <<ex-3>>, the image [.path]_peak.svg_, located in the `ROOT` module of the `colorado` component, is referenced by a page stored in the `wyoming` component. - -.Insert peak.svg into wilderness-areas.adoc -[#ex-3] ----- -image:colorado::peak.svg[] Bridger Peak is located in the Sierra Madre range. ----- - -In <<ex-4>>, the image [.path]_elevation.png_, located in the `sierra-madre` module of the `wyoming` component, is used in a page stored in the `colorado` component. - -.Insert elevation.png into ranges.adoc -[#ex-4] ----- -image::2.8@wyoming:sierra-madre:elevation.png[] ----- - -Specifically, we're using the [.path]_elevation.png_ file from version 2.8 of the Wyoming component. -When referencing an image from another component, you'll usually want to identify a specific version. -Otherwise, when Antora builds your documentation site, it will use the image file from the most recent version of the component. -The next section shows more examples of using the version coordinate. - -== Insert an image into a page from a different version - -To use an image from a different version of a module or component, the image's resource ID needs to specify the version and be followed by the appropriate module or component names if they're needed. - -After the block image macro prefix, enter the version name followed by the `@` symbol. -If the image is stored in the same module as the page you're inserting it into (just in a different version of that module), you only need to specify the image's file name after `name-of-version@`. -Complete the macro with a set of square brackets (`+[]+`). - ----- -image::name-of-version@name-of-file.ext[] ----- - -If the image is stored in a different version and module of the same component, enter the module's name after the `@` symbol. - ----- -image::name-of-version@name-of-module:name-of-file.ext[] - -image::name-of-version@ROOT:name-of-file.ext[] ----- - -When preceded by a component name, the ROOT module's name doesn't need to be entered. -It's designated by entering another colon (`:`) directly after the colon following the component's name. - ----- -image::name-of-version@name-of-component::name-of-file.ext[] - -image::name-of-version@name-of-component:name-of-module:name-of-file.ext[] ----- - -== Learn more - -* xref:ROOT:component-structure.adoc[Organize your documentation into components and modules] -* xref:ROOT:modules.adoc#images-dir[Store image files in a module's image directory] - -//// -== Image resource ID patterns - ----- -image::name-of-file.ext[] // <1> - -image::name-of-version@name-of-file.ext[] // <2> - -image::name-of-module:name-of-file.ext[] // <3> - -image::ROOT:name-of-file.ext[] // <4> - -image::name-of-version@name-of-module:name-of-file.ext[] // <5> - -image::name-of-version@ROOT:name-of-file.ext[] // <6> - -image::name-of-component:name-of-module:name-of-file.ext[] // <7> - -image::name-of-component::name-of-file.ext[] // <8> - -image::name-of-version@name-of-component:name-of-module:name-of-file.ext[] // <9> - -image::name-of-version@name-of-component::name-of-file.ext[] // <10> ----- -<1> Image is in the same version, component, and module as page. -<2> Image is in a different version but same component and module as page. -<3> Image is in a different module but same version and component as page. -<4> Image is in the ROOT module but same version and component as page. -<5> Image is in a different version and module but same component as page. -<6> Image is in a different version and the ROOT module but the same component as page. -<7> Image is in the most recent version of a different component and module. -<8> Image is in the most recent version of a different component and the ROOT module. -<9> Image is in a specific version of a different component and module. -<10> Image is in a specific version of a different component and the ROOT module. - - -== Apply attributes to an image - -The brackets can contain an list of attributes such as alt text, width, or height. -Attributes are optional. -The attributes are entered as key=value pairs separated by commas. -To add alt text to the image, enter the information between the square brackets (`+[]+`). -+ -[subs=+quotes] ----- -image::name-of-file.ext**[This is the alt text for this image]** ----- -//// diff --git a/docs/modules/page/pages/block-images.adoc b/docs/modules/page/pages/block-images.adoc new file mode 100644 index 000000000..afd548fb6 --- /dev/null +++ b/docs/modules/page/pages/block-images.adoc @@ -0,0 +1,69 @@ += Add Block Images + +On this page, you'll learn: + +* [x] The structure of the AsciiDoc block image macro. +* [x] How to insert a block image using its resource ID. + +== AsciiDoc block image macro + +A block image is displayed as a discrete element on a site page. + +---- +This is a paragraph. + +image::resource-id[optional attribute,optional attribute] + +This is another paragraph. +---- + +On its own line, enter the image macro name and two colons (`image::`), followed by the resource ID of the xref:resource-id.adoc#target-resource[target resource file]. +To complete the macro, type a set of square brackets (`+[]+`) directly after the resource ID. +You can specify a comma-separated list of attributes inside the square brackets or leave them empty. + +TIP: When referencing an image, you don't need to include the `image$` family coordinate in its resource ID. +It's applied automatically at runtime when a resource ID is entered into an AsciiDoc image macro. + +[#insert-block-image] +== Insert a block image + +The example below assumes that the image and page belong to the same component version and module. +Only the xref:resource-id.adoc#id-resource[resource coordinate] of the xref:resource-id.adoc#target-resource[target resource file] needs to be entered in the resource ID when the xref:resource-id.adoc#current-page[current page] and target file belong to the same component version and module. + +. On a new line, enter the macro's name followed by two colons, `image::`. +Make sure there is a blank line between the previous element, such as a paragraph or source block, and the line where you place the image macro. ++ +[subs=+quotes] +---- +This is a paragraph. + +**image::** +---- + +. Enter the resource ID of the image file directly after the two colons. ++ +[subs=+quotes] +---- +image::**target-resource-filename.ext** +---- + +. Complete the macro with a set of square brackets (`+[]+`). ++ +[subs=+quotes] +---- +image::target-resource-filename.ext**[]** +---- + +. Press kbd:[Enter] twice after the last square bracket (`]`) to insert a new line after the image macro. ++ +---- +This is a paragraph. + +image::target-resource-filename.ext[] + +This is another paragraph. +---- + +== Learn more + +To learn how to embed images that belong to other modules, docs components, and versions, see xref:image-resource-id-examples.adoc[Image resource ID examples]. diff --git a/docs/modules/page/pages/image-resource-id-examples.adoc b/docs/modules/page/pages/image-resource-id-examples.adoc new file mode 100644 index 000000000..a3f49b176 --- /dev/null +++ b/docs/modules/page/pages/image-resource-id-examples.adoc @@ -0,0 +1,236 @@ += Image Resource ID Examples +:listing-caption: Example +:xrefstyle: short + +You can embed an image into any page in your site, regardless of the module, component, or version the target image file belongs to. +Remember, don't include the family coordinate in an image's resource ID. +It's applied automatically at runtime when a resource ID is entered into an AsciiDoc image macro. + +TIP: If you're looking for examples where the image and page belong to the same module and component version, see the xref:inline-images.adoc#insert-inline-image[Inline images] or xref:block-images.adoc#insert-block-image[Block images] pages. + +[#use-image-across-modules] +== Use an image from another module + +The target resource's xref:resource-id.adoc#id-module[module coordinate] and xref:resource-id.adoc#id-resource[resource coordinate] are required when the xref:resource-id.adoc#current-page[current page] and xref:resource-id.adoc#target-resource[target resource file] belong to different modules of the same component version. + +[#ex-across-module-base] +.current-page.adoc +---- +image::module:target-resource-filename.ext[optional attributes] +---- + +To use an image that belongs to another module, specify the image's module name, followed by a colon (`:`). +Then enter the image's filename, including its extension, followed by a set of square brackets (`+[]+`). + +For context, let's use the pages and images that belong to the component version `colorado 5.2` as the basis for the examples in this section. +The component version's source files are stored in the xref:ROOT:standard-directories.adoc[set of standard directories] listed in <<ex-co>>. + +[#ex-co] +.Standard directories assigned to the component version colorado 5.2 +---- +📒 repository + 📄 antora.yml + 📂 modules + 📂 la-garita + 📂 images + 📄 wilderness-map.jpg + 📂 pages + 📄 cochetopa-pass.adoc + 📄 index.adoc + 📂 ROOT + 📂 images + 📄 peak.svg + 📂 pages + 📄 index.adoc + 📄 ranges.adoc +---- + +In <<ex-across-modules-inline>>, the image [.path]_peak.svg_ belongs to the `ROOT` module. +It's used in the page [.path]_cochetopa-pass.adoc_. + +[#ex-across-modules-inline] +.Insert peak.svg (target resource) as an inline image into cochetopa-pass.adoc (current page) +---- +The elevation is image:ROOT:peak.svg[] 10,067 ft (3,068 m). +---- + +In <<ex-across-modules>>, the [.path]_wilderness-map.jpg_ image belongs to the `la-garita` module and is referenced by a page in the `ROOT` module. + +[#ex-across-modules] +.Insert wilderness-map.jpg (target resource) as a block image into ranges.adoc (current page) +---- +image::la-garita:wilderness-map.jpg[] +---- + +[#use-image-in-different-docs-component] +== Use an image from another docs component + +When the xref:resource-id.adoc#current-page[current page] and the xref:page:resource-id.adoc#target-resource[target resource] belong to different docs components, you must, at a minimum, specify the target xref:resource-id.adoc#id-coordinates[component, module, and resource coordinates]. +You'll almost always want to specify the target version coordinate, too. + +---- +image::version@component:module:target-resource-filename.ext[] +---- + +For context, let's use the pages and images that belong to the component versions `colorado 5.2` and `wyoming 1.0` as the basis for the examples in this section. +Their source files are stored in the xref:ROOT:standard-directories.adoc[standard directory trees] listed in <<ex-co-and-wy>>. + +[#ex-co-and-wy] +.Standard directories assigned to the component versions colorado 5.2 and wyoming 1.0 +---- +📒 repository + 📄 antora.yml <- Declares files belong to colorado 5.2 + 📂 modules + 📂 la-garita + 📂 pages + 📄 cochetopa-pass.adoc + 📄 index.adoc + 📂 ROOT + 📂 images + 📄 peak.svg + 📂 pages + 📄 index.adoc + 📄 ranges.adoc + +📒 repository + 📂 docs + 📄 antora.yml <- Declares files belong to wyoming 1.0 + 📂 modules + 📂 sierra-madre + 📂 images + 📄 panorama.png + 📂 pages + 📄 wilderness-areas.adoc +---- + +<<ex-across-components-root>> shows an xref:inline-images.adoc[inline image macro]. +The image macro will embed the image [.path]_peak.svg_ (target resource), which belongs to the component version `colorado 5.2`, into the current page. +The current page, [.path]_wilderness-areas.adoc_, belongs to the component version `wyoming 1.0`. + +[#ex-across-components-root] +.wilderness-areas.adoc (current page) +---- +image:5.2@colorado::peak.svg[] Bridger Peak is in the Sierra Madre range. +---- + +Notice in <<ex-across-components-root>> that the module name `ROOT` seems to be missing from the resource ID. +When a component coordinate is specified in a resource ID, and the target resource belongs to the `ROOT` module, the module coordinate `ROOT` doesn't have to be explicitly specified. +But you must still enter the colon `:` that would follow the module coordinate. +You can see this `:` directly before the resource coordinate `peak.svg`. +This shorthand is only valid when a component coordinate is specified and the target module is `ROOT`. +In all other cases where the module coordinate is required, the name of the module must be specified. + +Let's reference the image [.path]_panorama.png_ (target resource) from [.path]_ranges.adoc_ (current page) in <<ex-across-components>>. +[.path]_panorama.png_ belongs to the the `sierra-madre` module of the `wyoming` component. + +[#ex-across-components] +.Insert panorama.png (target resource) as a block image into ranges.adoc (current page) +---- +image::1.0@wyoming:sierra-madre:panorama.png[] +---- + +You probably noticed that the version coordinate is specified in both <<ex-across-components-root>> and <<ex-across-components>>. +You'll usually want to identify a version when referencing an image that belongs to a different docs component than the current page. +If you don't specify the version, Antora will use the image file from the most recent version of the target component at runtime. + +[#use-latest-version-of-image] +=== Use the latest version of an image + +TIP: This behavior only applies when the target resource file and current page belong to different docs components! + +If a version isn't specified in the target resource ID, *and the target resource and current pages belong to a different docs components*, Antora will use the xref:ROOT:how-component-versions-are-sorted.adoc#latest-version[latest version] of the target component to complete the resource ID. + +Using the component versions previously described in <<ex-co-and-wy>>, let's create an image macro in the page [.path]_index.adoc_ (current page) that uses the [.path]_panorama.png_ image (target resource). +The image macro is shown below in <<ex-across-components-latest>>. +[.path]_index.adoc_ belongs to version `5.2` of the component `colorado`. +[.path]_panorama.png_ belongs to version `1.0` of the component `wyoming`. +Notice that the target resource's version coordinate isn't specified. + +[#ex-across-components-latest] +.index.adoc (current page) +---- +image::wyoming:sierra-madre:panorama.png[] +---- + +Since there isn't a version coordinate in <<ex-across-components-latest>>, Antora will automatically complete this resource ID at runtime using the latest version -- `1.0` -- of the `wyoming` component. +If you were to release a more recent version of `wyoming`, such as version `1.5`, and add it to your site, the image macro in <<ex-across-components-latest>> will automatically use the [.path]_panorama.png_ image in version `1.5` of `wyoming`. + +WARNING: This behavior of linking to the latest version only applies when the version coordinate is unspecified and the target resource and current page belong to different docs components. +If you don't specify a version and a component in the resource ID, Antora assumes the target resource's version and component are the same as the current page's version and component coordinates. + +[#use-image-in-different-version] +== Use an image from another version + +When the current page and target resource belong to the same component, but the target resource belongs to a different version of that component, you'll specify the target version, module (if it's different), and resource coordinates. + +[#ex-version-module-base] +.current-page.adoc +---- +image::version@module:target-resource-filename.ext[] +---- + +If the target resource and current page belong to the same module, too, then you only need to specify the target version and resource coordinates. + +[#ex-version-base] +.current-page.adoc +---- +image::version@target-resource-filename.ext[] +---- + +For context, let's use the images and pages that belong to the component versions `colorado 5.2` and `colorado 5.0` as the basis for the example in this section. +Their source files are stored in the xref:ROOT:standard-directories.adoc[standard directory trees] listed in <<ex-co-versions>>. + +[#ex-co-versions] +.Standard directories assigned to the component versions colorado 5.2 and colorado 5.0 +---- +📒 repository | branch name v5.2.x + 📄 antora.yml <- Declares files belong to colorado 5.2 + 📂 modules + 📂 la-garita + 📂 images + 📄 wilderness-map.jpg + 📂 pages + 📄 cochetopa-pass.adoc + 📂 ROOT + 📂 pages + 📄 index.adoc + 📄 ranges.adoc + +📒 repository | branch name v5.0.x + 📄 antora.yml <- Declares files belong to colorado 5.0 + 📂 modules + 📂 la-garita + 📂 pages + 📄 cochetopa-pass.adoc + 📂 ROOT + 📂 pages + 📄 index.adoc + 📄 ranges.adoc + 📄 views.adoc +---- + +Notice that the `colorado 5.2` component version has an image [.path]_wilderness-map.jpg_ that belongs to the `la-garita` module. +In `colorado 5.0`, no such image file exists, but we can still use the image that belongs to `5.2` in the version `5.0` pages. +In <<ex-across-versions>> the image [.path]_wilderness-map.jpg_ (target resource) is embedded in the page [.path]_views.adoc_ (current page) that belongs to the `colorado 5.0` component version. + +[#ex-across-versions] +.views.adoc (current page) that belongs to colorado 5.0 +---- +image::5.2@la-garita:wilderness-map.jpg[] +---- + +//// +This needs to either become its own page or be added as section to another page + +== Apply attributes to an image + +The brackets can contain an list of attributes such as alt text, width, or height. +Attributes are optional. +The attributes are entered as key=value pairs separated by commas. +To add alt text to the image, enter the information between the square brackets (`+[]+`). ++ +[subs=+quotes] +---- +image::name-of-file.ext**[This is the alt text for this image]** +---- +//// diff --git a/docs/modules/page/pages/images.adoc b/docs/modules/page/pages/images.adoc new file mode 100644 index 000000000..9f65a8ec3 --- /dev/null +++ b/docs/modules/page/pages/images.adoc @@ -0,0 +1,29 @@ += Images +//:page-aliases: asciidoc:insert-image.adoc +:listing-caption: Example +:xrefstyle: short + +Images are source files, such as photographs, diagrams, and screenshots, that are stored in an xref:ROOT:images-directory.adoc[_images_ family directory]. +An image can be inserted into any page or partial, regardless of the module or component version it belongs to, using an AsciiDoc image macro. +AsciiDoc supports PNG, JPG, SVG, and GIF (static and animated) image file formats. + +== Block and inline image macros + +There are two AsciiDoc image macro types, block and inline. +A xref:block-images.adoc[block image] is displayed as a discrete element on a site page. + +---- +This is a paragraph. + +image::resource-id[optional attribute] <1> +---- +<1> A block image is designated by two colons (`::`) after the macro name. +It's preceded by a blank line, entered on a line by itself, and then followed by blank line. + +An xref:inline-images.adoc[inline image] is displayed in the flow of another element, such as a paragraph or sidebar block. + +---- +This sentence contains an inline image:resource-id[optional attribute] image. <1> +---- +<1> An inline image is entered into the flow of the content. +It's designated by a single colon (`:`) after the macro name. diff --git a/docs/modules/page/pages/inline-images.adoc b/docs/modules/page/pages/inline-images.adoc new file mode 100644 index 000000000..828606d51 --- /dev/null +++ b/docs/modules/page/pages/inline-images.adoc @@ -0,0 +1,60 @@ += Add Inline Images + +On this page, you'll learn: + +* [x] The structure of the AsciiDoc inline image macro. +* [x] How to insert an inline image using its resource ID. + +== AsciiDoc inline image macro + +An inline image is displayed in the flow of another element, such as a paragraph or sidebar block. +The inline image macro is almost identical to the block image macro, except its macro name is followed by a single colon (`:`). + +---- +Here's an inline image:resource-id[optional attribute,optional attribute] image. +---- + +In the flow of an element, enter the image macro name and a single colon (`+image:+`), followed by the resource ID of the xref:page:resource-id.adoc#target-resource[target resource file]. +To complete the macro, type a set of square brackets (`+[]+`) directly after the resource ID. +You can specify a comma-separated list of optional attributes inside the square brackets or leave them empty. + +TIP: When referencing an image, you don't need to include the `image$` family coordinate in its resource ID. +It's applied automatically at runtime when a resource ID is entered into an AsciiDoc image macro. + +[#insert-inline-image] +== Insert an inline image into a page + +The example below assumes that the image and page belong to the same component version and module. +Only the xref:resource-id.adoc#id-resource[resource coordinate] of the xref:resource-id.adoc#target-resource[target resource file] needs to be entered in the resource ID when the xref:resource-id.adoc#current-page[current page] and target resource belong to the same component version and module. + +. At the location in a line where you want to place the image, enter the macro's name followed by one colon (`+image:+`). ++ +[subs=+quotes] +---- +Here's an inline *image:* +---- + +. Enter the resource ID of the image file directly after the colon. ++ +[subs=+quotes] +---- +Here's an inline image:**target-resource-filename.ext** +---- + +. Complete the macro with a set of square brackets (`+[]+`). ++ +[subs=+quotes] +---- +Here's an inline image:target-resource-filename.ext**[]** +---- + +. Press the kbd:[SPACE] bar once after the last square bracket (`]`) to insert a space after the macro, then continue entering your content. ++ +[subs=+quotes] +---- +Here's an inline image:target-resource-filename.ext[] image. +---- + +== Learn more + +To learn how to embed images that belong to other modules, docs components, and versions, see xref:image-resource-id-examples.adoc[Image resource ID examples]. -- GitLab From 11951d95191ba5ad05a53be3021662e6a19ba562 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:35:36 -0600 Subject: [PATCH 34/39] update xrefs and terminology --- docs/modules/asciidoc/nav.adoc | 1 + docs/modules/asciidoc/pages/asciidoc.adoc | 7 ++----- .../asciidoc/pages/include-example.adoc | 18 ++++++++---------- docs/modules/asciidoc/pages/include-page.adoc | 7 +++---- .../asciidoc/pages/include-partial.adoc | 15 +++++---------- .../asciidoc/pages/link-attachment.adoc | 15 +++++++++------ 6 files changed, 28 insertions(+), 35 deletions(-) diff --git a/docs/modules/asciidoc/nav.adoc b/docs/modules/asciidoc/nav.adoc index 3818b0bd8..0fd4c9e7f 100644 --- a/docs/modules/asciidoc/nav.adoc +++ b/docs/modules/asciidoc/nav.adoc @@ -1,4 +1,5 @@ .AsciiDoc +* xref:asciidoc.adoc[AsciiDoc] * xref:page-header.adoc[Page Header] ** xref:page-header.adoc#page-title[Title] ** xref:page-header.adoc#page-meta[Metadata] diff --git a/docs/modules/asciidoc/pages/asciidoc.adoc b/docs/modules/asciidoc/pages/asciidoc.adoc index aab55260f..11ed6870b 100644 --- a/docs/modules/asciidoc/pages/asciidoc.adoc +++ b/docs/modules/asciidoc/pages/asciidoc.adoc @@ -19,12 +19,9 @@ That's because the syntax elements were carefully chosen to look like what they AsciiDoc only requires a text editor to read or write, thereby offering a very low bar to get started. -You can use this section of the documentation to learn more about the AsciiDoc syntax, which starts at the top of the document with the xref:page-header.adoc[page header]. -From there, you can follow the items in the site navigation to learn about most syntax elements, or jump to a specific topic such as xref:page-to-page-xref.adoc[page references]. - == Parser -Asciidoctor is the processor that converts AsciiDoc content to HTML and other formats. +Asciidoctor.js is the processor that converts AsciiDoc content to HTML and other formats. === Speed and security @@ -35,5 +32,5 @@ Asciidoctor also offers several levels of security, further justifying its suita == The advantages of Open Source -The Asciidoctor project, home to the AsciiDoc syntax, the reference processor, and its extensions, is open source and made available under the MIT license. +The Asciidoctor project, home to the AsciiDoc syntax, Asciidoctor.js, and its extensions, is open source and made available under the MIT license. The Antora developers are also the lead Asciidoctor maintainers, which helps ensures a tight integration and keeps both technologies moving forward to address ever-changing documentation requirements and needs. diff --git a/docs/modules/asciidoc/pages/include-example.adoc b/docs/modules/asciidoc/pages/include-example.adoc index 2a9d3dbe9..dc73163ac 100644 --- a/docs/modules/asciidoc/pages/include-example.adoc +++ b/docs/modules/asciidoc/pages/include-example.adoc @@ -4,14 +4,14 @@ :url-tags: {url-adoc-manual}/#by-tagged-regions :url-indent: {url-adoc-manual}/#normalize-block-indentation -Examples are non-AsciiDoc files that contain reusable content, such as source code or data values, that are often inserted into listing blocks. -Examples are saved in the xref:ROOT:modules.adoc#examples-dir[_examples_ directory]. +Examples are non-AsciiDoc files that contain reusable content, such as source code or data values, that are often inserted into source, listing, and literal blocks. +Examples are saved in the xref:ROOT:examples-directory.adoc[_examples_ directory]. Typically, an example and the standard page it's used in are stored in the same module. However, regardless of an example's source module, it can be inserted into any standard page in your documentation site using the include directive and the example file's resource ID. == Include directive structure for examples -Let's break down the AsciiDoc syntax and resource coordinates you need to include an example into a standard page. +Let's break down the AsciiDoc syntax and resource ID coordinates you need to include an example into a page. ---- \include::version@component:module:example$name-of-file.ext[optional attributes] @@ -25,7 +25,6 @@ Let's break down the AsciiDoc syntax and resource coordinates you need to includ ---- . Enter the xref:page:resource-id.adoc[resource ID] of the example file. -An example's resource coordinates are determined just like the xref:page-to-page-xref.adoc#same-module[coordinates in an xref]. + [subs=+quotes] ---- @@ -40,17 +39,17 @@ An example's resource coordinates are determined just like the xref:page-to-page ---- . Close the directive with a set of square brackets (`+[]+`). -The brackets can contain an optional list of attributes such as `indent` and `tags`. -The attributes should be entered as key=value pairs separated by commas. +The brackets can contain an optional list of attributes such as `indent`, `lines`, or `tags`. +The attributes should be entered as key-value pairs separated by commas. + [subs=+quotes] ---- include::version@component:module:example$name-of-file.ext**[optional attributes]** ---- -NOTE: Antora supports filtering the lines of an include file by either line numbers using the `lines` attribute (since Antora 2.2) or tags using the tag or tags attributes. +NOTE: Antora supports filtering the lines of an example file by either line numbers using the `lines` attribute or tags using the `tag` or `tags` attributes. Filtering by line numbers takes precedence. -See https://asciidoctor.org/docs/user-manual/#include-partial[the asciidoctor documentation] for full details of the `lines` and `tag` or `tags` syntax. +See https://asciidoctor.org/docs/user-manual/#include-partial[the Asciidoctor documentation] for full details of the `lines`, `tag`, and `tags` syntax. == Include an example from the same module @@ -98,7 +97,6 @@ include::4.5@tree::example$extension.js[] // <2> * xref:include-page.adoc[Include a standard page] * xref:page:resource-id.adoc[Resource IDs] -== Asciidoctor resources - +.*Asciidoctor resources* * {url-tags}[Select regions of content with tags^] * {url-indent}[Normalize block indentation with indent^] diff --git a/docs/modules/asciidoc/pages/include-page.adoc b/docs/modules/asciidoc/pages/include-page.adoc index 84a0a1691..bab793c70 100644 --- a/docs/modules/asciidoc/pages/include-page.adoc +++ b/docs/modules/asciidoc/pages/include-page.adoc @@ -9,7 +9,7 @@ You can include another page or a portion of another page into the current page == Overview In Antora, the AsciiDoc include directive has been configured to include pages from the content catalog. -You can include a page from anywhere in the site, including pages from a different component, component version, or module. +You can include a page from anywhere in the site, including pages from a different component version or module. In the simplest form, the target can be a path relative to the current page: @@ -95,7 +95,7 @@ include::version@component:module:page$topic/page.adoc**[tag=definition]** All the attributes (e.g., `lines`, `tags`, `leveloffset`, `indent`) on the include directive are supported. -- -Antora supports filtering the lines of an include file by either line numbers using the `lines` attribute (since Antora 2.2) or tags using the `tag` or `tags` attributes. +Antora supports filtering the lines of an include file by either line numbers using the `lines` attribute or tags using the `tag` or `tags` attributes. Filtering by line numbers takes precedence. See https://asciidoctor.org/docs/user-manual/#include-partial[the asciidoctor documentation] for full details of the `lines` and `tag` or `tags` syntax. @@ -153,7 +153,6 @@ Recall that the `page-partial` attribute in the included page instructs Antora t * xref:page:page-id.adoc[Page IDs] * xref:page:resource-id.adoc[Resource IDs] -== Asciidoctor resources - +.*Asciidoctor resources* * {url-tags}[Select regions of content with tags^] * {url-leveloffset}[Offset section headings with leveloffset^] diff --git a/docs/modules/asciidoc/pages/include-partial.adoc b/docs/modules/asciidoc/pages/include-partial.adoc index a8402b1a0..3a8096880 100644 --- a/docs/modules/asciidoc/pages/include-partial.adoc +++ b/docs/modules/asciidoc/pages/include-partial.adoc @@ -4,14 +4,12 @@ :url-tags: {url-adoc-manual}/#by-tagged-regions :url-leveloffset: {url-adoc-manual}/#include-partitioning -Partials are AsciiDoc files that contain reusable snippets of content. -Partials are saved in the xref:ROOT:modules.adoc#partials-dir[_partials_ directory]. -Typically, a partial and the standard page it's used in are stored in the same module. -However, regardless of a partial's source module, it can be inserted into any standard page in your documentation site using the include directive and the partial file's resource ID. +//Typically, a partial and the standard page it's used in are stored in the same module. +A partial can be inserted into any page in your documentation site using the include directive and the partial file's resource ID. == Include directive structure for partials -Let's break down the AsciiDoc syntax and resource coordinates you need to include a partial into a standard page. +Let's break down the AsciiDoc syntax and resource ID coordinates you need to include a partial into a page. ---- \include::version@component:module:partial$name-of-file.adoc[optional attributes] @@ -40,7 +38,7 @@ A partial's resource coordinates are determined just like the xref:page-to-page- ---- . Close the directive with a set of square brackets (`+[]+`). -The brackets can contain an optional list of attributes such as `leveloffset` and `tags`. +The brackets can contain an optional list of attributes such as `leveloffset`, `lines`, and `tags`. The attributes should be entered as key=value pairs separated by commas. + [subs=+quotes] @@ -48,8 +46,6 @@ The attributes should be entered as key=value pairs separated by commas. include::version@component:module:partial$name-of-file.adoc**[optional attributes]** ---- -NOTE: Currently, Antora only supports filtering includes by tags. - == Include a partial from the same module When the partial file and the standard page file belong to the same module, you only need to enter the family name (`partial$`) and the name of the partial file. @@ -97,7 +93,6 @@ In the next example, the page will include the partial specifically from the 2.0 * xref:include-page.adoc[Include a standard page] * xref:page:resource-id.adoc[Resource IDs] -== Asciidoctor resources - +.*Asciidoctor resources* * {url-leveloffset}[Offset section headings with leveloffset^] * {url-tags}[Select regions of content with tags^] diff --git a/docs/modules/asciidoc/pages/link-attachment.adoc b/docs/modules/asciidoc/pages/link-attachment.adoc index 6f41f75ca..b8191ae7f 100644 --- a/docs/modules/asciidoc/pages/link-attachment.adoc +++ b/docs/modules/asciidoc/pages/link-attachment.adoc @@ -2,15 +2,19 @@ On this page, you'll learn: -* [x] How to link to a file stored in a documentation component's [.path]_attachments_ directory. +* [x] How to create a link to an attachment. -== Insert a link to an attachment file +Attachment files are stored in an xref:ROOT:attachments-directory.adoc[_attachments_ family directory]. -An attachment is a resource that you want your user to download, such as a PDF or a sample project ZIP archive. -To insert a link to an attachment for download, use the AsciiDoc link macro (`+link:[]+`). +WARNING: Currently, you can't reference an attachment using an Antora resource ID. + +== Create a link to an attachment + +An attachment is a resource, such as a PDF or a sample project ZIP archive, that a visitor can download from your site. +To insert a link to an attachment in a page, use the AsciiDoc link macro (`+link:[]+`). .Attachment link syntax -[source,asciidoc] +[source] ---- link:{attachmentsdir}/example.raml[Download the RAML example] and run it. ---- @@ -25,5 +29,4 @@ Finally, end with the text of the link (as the reader will see it) between a pai You don't need to set the path to the [.path]_attachments_ directory in the header of your file. This is managed automatically by Antora. -A module's attachment files should be saved in its xref:ROOT:modules.adoc#attachments-dir[attachments folder]. Links to attachments can also be added to the xref:navigation:link-syntax-and-content.adoc[site navigation]. -- GitLab From 3b8caa2eb5cf5aa1ea4cb35cd72f4760e8645d01 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:39:34 -0600 Subject: [PATCH 35/39] update headings and terms; edits for #524 --- docs/modules/ROOT/nav.adoc | 8 ++-- .../ROOT/pages/attachments-directory.adoc | 6 +-- .../pages/component-name-and-version.adoc | 17 +++++---- .../ROOT/pages/component-navigation.adoc | 4 +- .../ROOT/pages/component-start-page.adoc | 6 +-- .../pages/component-version-descriptor.adoc | 38 +++++++++---------- .../modules/ROOT/pages/component-version.adoc | 6 +-- .../ROOT/pages/component-with-no-version.adoc | 9 +++-- .../pages/content-source-repositories.adoc | 22 +++++------ .../environment-and-page-attributes.adoc | 15 ++------ .../ROOT/pages/examples-directory.adoc | 14 +++---- .../ROOT/pages/family-directories.adoc | 6 +-- .../how-component-versions-are-sorted.adoc | 15 ++++---- docs/modules/ROOT/pages/images-directory.adoc | 16 ++++---- .../ROOT/pages/module-directories.adoc | 8 ++-- .../ROOT/pages/module-directory-names.adoc | 14 +++---- .../ROOT/pages/module-url-segment.adoc | 8 ++-- .../ROOT/pages/named-module-directory.adoc | 10 ++--- .../ROOT/pages/organize-content-files.adoc | 2 +- docs/modules/ROOT/pages/pages-directory.adoc | 9 +++-- .../ROOT/pages/partials-directory.adoc | 28 ++++++-------- .../ROOT/pages/root-module-directory.adoc | 4 +- .../ROOT/pages/standard-directories.adoc | 24 +++++++----- docs/modules/page/pages/page-aliases.adoc | 12 +++--- 24 files changed, 144 insertions(+), 157 deletions(-) diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index d3f85e135..25f9d43a8 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -12,14 +12,14 @@ ** xref:install:supported-platforms.adoc[Supported Platforms] * Set Up Content Sources -** xref:organize-content-files.adoc[How to Organize and Classify Your Content] +** xref:organize-content-files.adoc[How to Organize Your Content Files] ** xref:content-source-repositories.adoc[Repositories and Content Source Roots] ** xref:content-source-versioning-methods.adoc[Content Source Versioning Methods] ** xref:standard-directories.adoc[Standard File and Directory Set] ** xref:module-directories.adoc[Module Directories and Modules] *** xref:root-module-directory.adoc[ROOT Module Directory] *** xref:named-module-directory.adoc[Named Module Directory] -**** xref:module-directory-names.adoc[Recommendations for Module Directory Names] +*** xref:module-directory-names.adoc[Recommendations for Module Directory Names] *** xref:module-url-segment.adoc[Module Segment in Page URLs] ** xref:family-directories.adoc[Family Directories and Families] *** xref:pages-directory.adoc[Pages Directory and Page Files] @@ -32,13 +32,13 @@ ** xref:component-version.adoc[What's a Component Version?] ** xref:component-version-descriptor.adoc[What's antora.yml?] ** xref:component-name-and-version.adoc[Define a Component Name and Version] -*** xref:how-component-versions-are-sorted.adoc[How are Component Versions Sorted?] ** xref:component-title.adoc[Customize the Title] ** xref:component-display-version.adoc[Customize the Display Version] ** xref:component-prerelease.adoc[Identify a Prerelease Version] ** xref:component-with-no-version.adoc[Define a Component Version with No Version] ** xref:component-attributes.adoc[Assign Attributes to a Component Version] ** xref:component-start-page.adoc[Select a Start Page] -** xref:component-navigation.adoc[Register a Component Version's Navigation Files] +** xref:component-navigation.adoc[Assign Navigation Files to a Component Version] +** xref:how-component-versions-are-sorted.adoc[How Component Versions are Sorted] ** xref:environment-and-page-attributes.adoc[Built-in Page and Environment Attribute Reference] ** xref:distributed-component-version.adoc[Distributed Component Version] diff --git a/docs/modules/ROOT/pages/attachments-directory.adoc b/docs/modules/ROOT/pages/attachments-directory.adoc index 4b1149edb..9f5b7ab93 100644 --- a/docs/modules/ROOT/pages/attachments-directory.adoc +++ b/docs/modules/ROOT/pages/attachments-directory.adoc @@ -3,7 +3,7 @@ [#attachments-dir] == Attachments family directory -A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_attachments_. +A module directory can contain an xref:family-directories.adoc[optional family directory] named [.path]_attachments_. ---- 📂 modules @@ -23,9 +23,9 @@ Antora applies preset behavior to the source files stored in an [.path]_attachme == Attachments An [.term]*attachment* is a resource, such as the ZIP archive of a sample project, that a site visitor can download via a link. -Attachments are stored in an [.path]_attachments_ directory. +The source files for attachments are stored in an [.path]_attachments_ directory. A link to an attachment is created in a page or partial using the xref:asciidoc:link-attachment.adoc[AsciiDoc link macro]. -(The ability to reference attachments using a resource ID is coming soon.) +Currently, you can't xref:page:resource-id.adoc#reference-syntax-id-requirements[reference an attachment] using an Antora resource ID. === Binaries and other large files diff --git a/docs/modules/ROOT/pages/component-name-and-version.adoc b/docs/modules/ROOT/pages/component-name-and-version.adoc index 52f880355..e1293a42a 100644 --- a/docs/modules/ROOT/pages/component-name-and-version.adoc +++ b/docs/modules/ROOT/pages/component-name-and-version.adoc @@ -39,7 +39,7 @@ name: colorado ---- The value can contain letters, numbers, underscores (`+_+`), hyphens (`-`), and periods (`.`). -The value *cannot* contain spaces or forward slashes (`/`). +The value *cannot* contain blank spaces or forward slashes (`/`). TIP: To minimize the likelihood of portability issues between web servers, letters used in the `name` key's value should be lowercase. @@ -50,7 +50,7 @@ the first breadcrumb position on a component version's pages. [#version-key] == version key -TIP: If you aren't familiar with how Antora sorts component versions, see xref:how-component-versions-are-sorted.adoc[How are component versions sorted?] before committing to a versioning scheme. +TIP: If you aren't familiar with how Antora sorts component versions, see xref:how-component-versions-are-sorted.adoc[How component versions are sorted] before committing to a versioning scheme. A version, such as a named identifier (e.g., `master`, `jesse`, `edge`) or semantic identifier (e.g., `1.5`, `8`), is assigned to the `version` key in [.path]_antora.yml_. @@ -71,11 +71,11 @@ version: '5.6' # <1> <1> Values that start with a number should be enclosed in a set of single quote marks (`'`). The value can contain letters, numbers, periods (`.`), underscores (`+_+`), and hyphens (`-`). -It *cannot* contain spaces. +It *cannot* contain blank spaces or forward slashes (`/`). TIP: To minimize the likelihood of portability issues between web servers, letters used in the `version` value should be lowercase. -If a component version is unstable or a prerelease, you may want to set the xref:component-prerelease.adoc[optional prerelease key] in addition to `version`. +If a component version is a prerelease, you may want to set the xref:component-prerelease.adoc[optional prerelease key] in addition to `version`. xref:component-with-no-version.adoc[Unversioned or version-less component versions] can be defined using the reserved value `master`. [#assign-name-and-version] @@ -105,12 +105,13 @@ name: silver-leaf version: '7.1' ---- -. Save the file as [.path]_antora.yml_ in the parent directory that contains the directories and files you want to assign to this component version. -That is, it should be located adjacent to the [.path]_modules_ directory. +. Save the file as [.path]_antora.yml_ in the xref:content-source-repositories.adoc#content-source-root[content source root]. +//the parent directory that contains the directories and files you want to assign to this component version. +It should be located at the same hierarchy level as the [.path]_modules_ directory to which you want it applied. You've now associated a set of source files with a component version! -When Antora runs, all of the xref:standard-directories.adoc[subsequent subdirectories and source files] will be assigned the component name `silver-leaf` and the version `7.1`. -These values will be used as page and resource ID coordinates and in the URLs of the pages generated from the component version's source files. +When Antora runs, all of the xref:standard-directories.adoc[source files stored in the standard set of directories] will be assigned the component name `silver-leaf` and the version `7.1`. +These values will be used as xref:page:page-id.adoc[page] and xref:page:resource-id.adoc[resource ID] coordinates and in the URLs of the pages generated from the component version's source files. [#optional-keys] == Optional antora.yml keys diff --git a/docs/modules/ROOT/pages/component-navigation.adoc b/docs/modules/ROOT/pages/component-navigation.adoc index ec8a170cd..58fd015dd 100644 --- a/docs/modules/ROOT/pages/component-navigation.adoc +++ b/docs/modules/ROOT/pages/component-navigation.adoc @@ -43,6 +43,6 @@ The order of the values dictates the order the contents of the navigation files Learn more about creating navigation lists and navigation files: -* xref:navigation:filenames-and-locations.adoc[Navigation file names and storage locations] -* xref:navigation:list-structures.adoc[Single and multi-list navigation files] +* xref:navigation:filenames-and-locations.adoc[Navigation filenames and locations] +* xref:navigation:list-structures.adoc[Single and multiple list navigation files] * xref:navigation:link-syntax-and-content.adoc[Navigation link syntax and content formatting] diff --git a/docs/modules/ROOT/pages/component-start-page.adoc b/docs/modules/ROOT/pages/component-start-page.adoc index fa87084fc..24fbcce31 100644 --- a/docs/modules/ROOT/pages/component-start-page.adoc +++ b/docs/modules/ROOT/pages/component-start-page.adoc @@ -4,7 +4,7 @@ == Default start page -By default, Antora looks for a page named [.path]_index.adoc_ in the ROOT module of a component version and uses it as the component version's start page (e.g., _\https://site-url.org/component-name/version/index.html_). +By default, Antora looks for a page named [.path]_index.adoc_ in the xref:root-module-directory.adoc#root-module[ROOT module] of a component version and uses it as the component version's start page (e.g., _\https://site-url.org/component-name/version/index.html_). If Antora doesn't find this page, site visitors are directed to a 404 page every time they click on that component version from the xref:navigation:index.adoc#component-dropdown[component version selector]. Antora won't look for [.path]_index.adoc_ in the ROOT module when the <<start-page-key,start_page key>> is set in a component version's [.path]_antora.yml_. @@ -16,9 +16,9 @@ Instead, the page assigned to `start_page` will be used as the component version The `start_page` key must be set in [.path]_antora.yml_ when: . a component version doesn't have a page named [.path]_index.adoc_ in its ROOT module, or -. when Antora should use a an alternate page (that is, not [.path]_index.adoc_, even if it exists) as the component version's start page. +. when Antora should use an alternate page (that is, not [.path]_index.adoc_, even if it exists) as the component version's start page. -`start_page` accepts a xref:page:page-id.adoc[page ID] that points to a page in the component version. +The `start_page` key accepts a xref:page:page-id.adoc[page ID] that references a page that *belongs to the component version the [.path]_antora.yml_ file describes*. The page ID must specify a module coordinate. [#ex-start] diff --git a/docs/modules/ROOT/pages/component-version-descriptor.adoc b/docs/modules/ROOT/pages/component-version-descriptor.adoc index df32e7757..fe278b655 100644 --- a/docs/modules/ROOT/pages/component-version-descriptor.adoc +++ b/docs/modules/ROOT/pages/component-version-descriptor.adoc @@ -1,34 +1,34 @@ = What's antora.yml? :page-aliases: component-descriptor.adoc -//When Antora receives instructions from a playbook to scan a content source repository, its first objective is to find a component version descriptor file named _antora.yml_ in that repository. -//This file marks the subsequent directories and files as part of a component version and classifies the files according to the component name, component version, and other stable metadata it provides. -== Component version marker and descriptor +[.path]_antora.yml_ is a configuration file that serves two crucial functions. -The component version descriptor is a configuration file named [.path]_antora.yml_. -It has two crucial functions: +. The presence of an [.path]_antora.yml_ file at a content source root signals to Antora that it should find a sibling [.path]_modules_ directory that contains the source files of a component version. +. The [.path]_antora.yml_ file at a content source root provides the required and optional component version metadata that Antora assigns to the source files it collects from the sibling [.path]_modules_ directory. -. [.path]_antora.yml_ marks the location of a set of directories and source files that belong to a component version. -. [.path]_antora.yml_ provides required and optional component version metadata that Antora assigns to the source files it collects from the marked location. +[#validate-content-source-root-with-antora-yml] +== Why is antora.yml stored at a content source root? +//Why does Antora look for antora.yml at a content source root? +//How does Antora use an antora.yml file to find a component version's source files? -[#marker] -== How does Antora use an antora.yml file to find a component version's source files? +//A xref:playbook:index.adoc[playbook] tells Antora what xref:playbook:configure-content-sources.adoc[remote repositories and local content sources] it should fetch. +Starting at each content source root, Antora looks for an [.path]_antora.yml_ file. +When it finds [.path]_antora.yml_, it searches for a xref:module-directories.adoc[sibling _modules_ directory] and considers all of the [.path]_modules_ directory's xref:standard-directories.adoc[subdirectories and files] to be part of a xref:component-version.adoc[component version]. -A xref:playbook:index.adoc[playbook] tells Antora what xref:playbook:configure-content-sources.adoc[remote repositories and local content sources] it should fetch. -Then, starting at each content source root, Antora looks for an [.path]_antora.yml_ file. -If it finds [.path]_antora.yml_, it searches for a xref:module-directories.adoc[sibling _modules_ directory] and considers all of the [.path]_modules_ directory's xref:standard-directories.adoc[subdirectories and files] to be part of a xref:component-version.adoc[component version]. +If Antora doesn't find [.path]_antora.yml_ at a content source root, it doesn't look for a [.path]_modules_ directory or collect any files from that location. +This minimizes the chances of Antora using server resources in an attempt to process source files that aren't part of a documentation site. -This ability to store the source files of a component version anywhere in a directory hierarchy, as long as the parent directory contains an [.path]_antora.yml_ file, allows you to maintain and manage a component version (or part of a component version) in a repository with the software it documents, a sample project, or in its own repository. +The [.path]_antora.yml_ files provide the ability to store your content source files anywhere in a directory hierarchy. +As long as the xref:content-source-repositories.adoc#content-source-root[content source root] contains an [.path]_antora.yml_ file, you can maintain and manage your content source files in a repository that also stores application code, tests, and other materials. -[#metadata-configuration] -== What component version information does antora.yml provide? +[#provide-metadata-with-antora-yml] +== What information does antora.yml provide? -The [.path]_antora.yml_ file is referred to as the [.term]*component version descriptor* because it provides required and optional information that identifies, describes, and configures a xref:component-version.adoc[component version]. +An [.path]_antora.yml_ file is referred to as a [.term]*component version descriptor* because it provides required and optional information that identifies, describes, and configures a xref:component-version.adoc[component version]. In turn, this metadata and configuration is applied to all of the source files that belong to the component version. -This is why Antora can collect files from multiple repositories, directories, branches, and tags and compile them into a component version. -Antora doesn't process files based on their file system or repository location. -Instead, Antora classifies and converts files based on the information assigned to the source files by a component version descriptor file. +This is why Antora can collect files from multiple repositories, directories, branches, and tags, and compile them into a single component version. +Instead of processing files based on their file system or repository location, Antora converts files based on the information assigned to the source files by a component version descriptor file. An [.path]_antora.yml_ file contains the following required keys: diff --git a/docs/modules/ROOT/pages/component-version.adoc b/docs/modules/ROOT/pages/component-version.adoc index cac55fcbb..563312d48 100644 --- a/docs/modules/ROOT/pages/component-version.adoc +++ b/docs/modules/ROOT/pages/component-version.adoc @@ -6,10 +6,10 @@ A [.term]*component version* typically represents a discreet and unique version Antora collates all of a component version's source files, regardless of where the files are stored and collected from, that are associated with the same xref:component-name-and-version.adoc#name-key[component name] and xref:component-name-and-version.adoc#version-key[component version]. A xref:component-version-descriptor.adoc[file named _antora.yml_] is responsible for marking the location of a set of source files that belong to a component version, defining the component version, and applying the specified configuration to the component version's source files. -[#component-version-vs-docs-component] -== What's the difference between a component version and a docs component? +[#docs-component] +== Docs component -The term [.term]*docs component*, also known as a *documentation component* or simply *component*, is used when a concept or action applies to all of the component versions that have the xref:component-name-and-version.adoc#name-key[same component name]. +A [.term]*docs component*, also known as a *documentation component* or *component*, refers to all of the component versions that have the xref:component-name-and-version.adoc#name-key[same component name]. //// move to better location diff --git a/docs/modules/ROOT/pages/component-with-no-version.adoc b/docs/modules/ROOT/pages/component-with-no-version.adoc index 0adc27aa6..68607047b 100644 --- a/docs/modules/ROOT/pages/component-with-no-version.adoc +++ b/docs/modules/ROOT/pages/component-with-no-version.adoc @@ -15,13 +15,14 @@ The value of the `version` key is part of the identity of a xref:component-versi == Assign master as the version value Antora requires the xref:component-name-and-version.adoc#version-key[version key] be assigned a value in [.path]_antora.yml_. -This value becomes the version coordinate in the component version's page and resource IDs and the version segment in the URL of its published pages. -For example, if the `version` value is `2.1`, that value will appear in the URL of the component version's pages (e.g., [.path]_/component-name/2.1/page-name.html_). +This value becomes the xref:page:page-id.adoc#id-coordinates[version coordinate] in the component version's page and xref:page:resource-id.adoc#id-coordinates[resource IDs]. +The value of `version` also becomes the version segment in the URL of its published pages. +For example, if the value is `2.1`, that value will appear in the URL of the component version's pages (e.g., [.path]_/component-name/2.1/page-name.html_). The exception to this rule is if `version` matches the reserved value `master`. Antora *does not* include the version segment in a component version's page URLs in this case. -The component version defined in <<ex-unversioned>> will produce versionless URLs. +For instance, the component version defined in <<ex-unversioned>> will produce versionless URLs. [#ex-unversioned] .antora.yml for an unversioned component version @@ -34,4 +35,4 @@ display_version: Stable ---- A page with the filename [.path]_build-a-restful-web-service.adoc_ in this component version will have the URL [.path]_/tutorials/build-a-restful-web-service.html_. -//When making a qualified reference to this page, you'd still include the version as you normally would (e.g., `master@tutorials::build-a-restful-web-service.adoc`). +Also, you can still reference this docs component from other docs components using a fully qualified xref:page:page-id.adoc[page ID] or xref:page:resource-id.adoc[resource ID] (e.g., `master@tutorials::build-a-restful-web-service.adoc`). diff --git a/docs/modules/ROOT/pages/content-source-repositories.adoc b/docs/modules/ROOT/pages/content-source-repositories.adoc index f35d4a4a9..816e7e463 100644 --- a/docs/modules/ROOT/pages/content-source-repositories.adoc +++ b/docs/modules/ROOT/pages/content-source-repositories.adoc @@ -2,27 +2,23 @@ Antora collects content source files from branches, tags, and directories in git repositories. These source files are only retrieved and processed correctly if Antora can locate them at a specified content source root. -//and then categorize them using a valid component version descriptor file and standard directory set. -== git repositories as content sources +[#git-and-content-sources] +== git repositories and content sources The source files containing a site's content are stored in git repositories. These repositories can be remote, local, or a mix of both. -A [.term]*content source* is the route--a git reference and start path--that leads to a unique <<content-source-root,content source root>>. -Content sources are specified in an Antora playbook file. -But before configuring your site's playbook, you need to set up the required directories and sorted your content source files into them at each content source root. +In a playbook file, you'll enter several query parameters (git references and start paths) that 1. allow Antora to locate and connect to your content source repositories, and 2. provide Antora with the route criteria that leads to one or more unique <<content-source-root,content source roots>> within a git repository. +//A [.term]*content source* is one or more routes--git references and start paths--that lead to unique <<content-source-root,content source roots>>. +//Content sources are specified in an Antora playbook file. +But before configuring a site's playbook, you'll want to determine where to set up the content source roots in your repositories. +// to be located and then set up the directories Antora requires. +//to place your content source roots to beet up the required directories and sorted your content source files into them at each content source root. [#content-source-root] -== What is a content source root? +== What's a content source root? A [.term]*content source root* is a unique location from where Antora begins collecting content source files. Think of the content source root as the starting line for a race. From a content source root, Antora expects to find an [.path]_antora.yml_ file and a collection of source files that are organized into a xref:standard-directories.adoc[standard set of directories]. A repository can host a multitude of content source roots, even within a single branch in certain scenarios. - -//// -A content source root is specified by a git reference and start path that's configured in a playbook file. -The git reference is the URL or file system location of a repository and specified branch or tag. -The start path is where Antora should find a component version descriptor file named [.path]_antora.yml_ and the required directory structure. -Because a git reference (repository + branch/tag) can lead to numerous unique locations when a start path is specified, a single repository branch or tag can contain more than one content source. -//// diff --git a/docs/modules/ROOT/pages/environment-and-page-attributes.adoc b/docs/modules/ROOT/pages/environment-and-page-attributes.adoc index eb709ab97..cfab1bc7f 100644 --- a/docs/modules/ROOT/pages/environment-and-page-attributes.adoc +++ b/docs/modules/ROOT/pages/environment-and-page-attributes.adoc @@ -30,7 +30,7 @@ Antora automatically sets the following attributes for each page when it runs: |7.1 |`page-module` -|The name of the page's module. +|The xref:module-directories.adoc#module[name of the page's module]. |ROOT |`page-origin-branch` @@ -70,22 +70,21 @@ Antora automatically sets the following attributes for each page when it runs: |whats-new-in-spiky.adoc |`page-version` -|Shorthand for `page-component-version`. +|Alias for `page-component-version`. |7.1 |=== The output of these `page-` attributes can be displayed in a page using the AsciiDoc attribute reference syntax (e.g., `+{page-version}+`). .Reference the current page's module name, component title, and version -[source] ---- -This page is part of the *{page-module}* module in the *{page-component-title} {page-component-version}* component version. +This page belongs to the *{page-module}* module in the *{page-component-title} {page-component-version}* component version. ---- The attribute references in the above example output the data (shown below) for the current page, that is, the page you're reading right now. ==== -This page is part of the *{page-module}* module in the *{page-component-title} {page-component-version}* component version. +This page belongs to the *{page-module}* module in the *{page-component-title} {page-component-version}* component version. ==== Attributes that are prefixed with `page-` are also available to the Antora pipeline and xref:antora-ui-default::templates.adoc#template-variables[UI model] during site generation. @@ -100,9 +99,3 @@ Antora sets these attributes for each page. * `env-site` * `site-gen=antora` * `site-gen-antora` - -== Learn more - -* xref:component-name-and-version.adoc[Define a component name and version with antora.yml] -* xref:asciidoc:page-header.adoc#set-attribute[Set and unset AsciiDoc attributes] -//* Create your own page attributes. diff --git a/docs/modules/ROOT/pages/examples-directory.adoc b/docs/modules/ROOT/pages/examples-directory.adoc index 2ebd7f20a..660b6ac30 100644 --- a/docs/modules/ROOT/pages/examples-directory.adoc +++ b/docs/modules/ROOT/pages/examples-directory.adoc @@ -3,7 +3,7 @@ [#examples-dir] == Examples family directory -A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_examples_. +A module directory can contain an xref:family-directories.adoc[optional family directory] named [.path]_examples_. ---- 📂 modules @@ -12,7 +12,7 @@ A module directory can contain an optional xref:family-directories.adoc[family d 📄 a-source-file.js <2> 📂 ROOT 📂 examples <3> - 📄 a-source-file.rb <4> + 📄 a-source-file.csv <4> 📄 a-source-file.json 📂 pages 📄 a-source-file.adoc @@ -28,12 +28,12 @@ Antora applies preset behavior to the source files stored in an [.path]_examples [#examples] == Examples -[.term]*Examples* are source code snippets (e.g., [.path]_runner.js_), terminal output, or sample data sets (e.g., [.path]_choptank-co2.csv_). +[.term]*Examples* are resources, such as source code snippets (e.g., [.path]_runner.js_), terminal output, or sample data sets (e.g., [.path]_choptank-co2.csv_). The source files for examples are stored in an [.path]_examples_ directory. Examples shouldn't be confused with the AsciiDoc example block, though they can be inserted into an example block using an include directive. -If an example isn't referenced in an AsciiDoc include directive, its content won't be published to a site (unlike xref:pages-directory.adoc#pages[pages]). -Examples and tagged regions in an example can be inserted into any page or partial, regardless of the module or component version it belongs to, using the xref:asciidoc:include-partial.adoc[include directive and the example's resource ID]. +If an example isn't referenced in an AsciiDoc include directive, its content won't be published to a site. +Examples and tagged regions in an example can be inserted into any page or partial, regardless of the module or component version it belongs to, using the xref:asciidoc:include-example.adoc[include directive] and the example's xref:page:resource-id.adoc[resource ID]. -When referencing an example, the `example` family name must be included in its resource ID. -The family name, `example`, is required because the include directive is also used to reference xref:partials-directory.adoc[partial source files]. +When referencing an example, the `example$` family coordinate must be included in its resource ID. +This coordinate is required because the include directive is also used to reference xref:partials-directory.adoc[partials] and, occasionally, xref:pages-directory.adoc[pages]. diff --git a/docs/modules/ROOT/pages/family-directories.adoc b/docs/modules/ROOT/pages/family-directories.adoc index c4793dddc..816c31fe7 100644 --- a/docs/modules/ROOT/pages/family-directories.adoc +++ b/docs/modules/ROOT/pages/family-directories.adoc @@ -1,9 +1,9 @@ = Family Directories and Families -Antora assigns preset, format- and content type-specific behavior to the source files stored in the family directories. +Antora assigns preset, content-specific behavior to the source files stored in the family directories. [#family-dir] -== What is a family directory? +== What's a family directory? A [.term]*family directory* stores source files that share the same output role (i.e., standalone page, image inserted into a page) and, in some cases, the same file format (i.e., _.adoc_). Antora recognizes five standard family directories: [.path]_attachments_, [.path]_examples_, [.path]_images_, [.path]_pages_, and [.path]_partials_. @@ -24,7 +24,7 @@ A family directory can only be stored in a xref:module-directories.adoc#module-d At runtime, Antora collects the source files stored in the family directories and assigns them to a <<family,family>> within a xref:module-directories.adoc#module[module] and xref:component-version.adoc[component version]. [#family] -== What is a family? +== What's a family? A [.term]*family* is a classification Antora applies to content collected from a family directory. The family corresponds to the name of the <<family-dir,family directory>>. diff --git a/docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc b/docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc index 09ee59018..df746345c 100644 --- a/docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc +++ b/docs/modules/ROOT/pages/how-component-versions-are-sorted.adoc @@ -1,4 +1,4 @@ -= How are Component Versions Sorted? += How Component Versions are Sorted On this page, you'll learn: @@ -8,9 +8,9 @@ On this page, you'll learn: Understanding how Antora sorts xref:component-version.adoc[component versions] is important when choosing your versioning scheme and its potential presentation and routing results in your site's UI. [#sort-docs-components] -== Documentation component sort order +== Docs component sort order -First, Antora sorts component versions into xref:component-version.adoc#component-version-vs-docs-component[docs components] according to the xref:component-title.adoc[title key] defined in each component version's [.path]_antora.yml_ file. +First, Antora sorts component versions into xref:component-version.adoc#docs-component[docs components] according to the xref:component-title.adoc[title key] defined in each component version's [.path]_antora.yml_ file. If the title key isn't set, it falls back to the xref:component-name-and-version.adoc#name-key[name key]. Docs components are sorted in alphabetical order. @@ -52,7 +52,7 @@ a|[%hardbreaks] NOTE: The version `master` has special meaning when a xref:component-with-no-version.adoc[component version is unversioned or version-less], but it's given no special treatment when sorting. [#version-sorting-rules] -== Antora's component version sorting rules +== Component version sorting rules Antora applies the following rules when sorting component versions: @@ -105,11 +105,10 @@ The latest version for _RoseyDB_ would be `vivid` because it's the first version [#latest-version] == Latest component version -In addition to sorting the component versions, Antora selects the latest component version of each docs component. +In addition to sorting the component versions, Antora identifies the most recent, stable component version of each docs component. The [.term]*latest version* is the first version in the sorted list that's not a xref:component-prerelease.adoc[prerelease]. -If all versions are prereleases, then the first prerelease version in the list is selected. +(If all versions are prereleases, then the first prerelease version in the list is selected.) -Antora uses the latest component version as the default landing URL for a docs component. -It also uses the latest version of a docs component when qualifying an incoming page or resource ID reference from another docs component if it can't otherwise determine the version. +Antora uses the latest version of a component when qualifying an incoming page or resource ID reference from another docs component if the version coordinate wasn't specified or can't otherwise be determined. TIP: The latest version is available as the property `latest` in the xref:antora-ui-default::templates.adoc#site[UI model]. diff --git a/docs/modules/ROOT/pages/images-directory.adoc b/docs/modules/ROOT/pages/images-directory.adoc index e74cda4d7..18b70c8d6 100644 --- a/docs/modules/ROOT/pages/images-directory.adoc +++ b/docs/modules/ROOT/pages/images-directory.adoc @@ -3,14 +3,14 @@ [#images-dir] == Images family directory -A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_images_. +A module directory can contain an xref:family-directories.adoc[optional family directory] named [.path]_images_. ---- 📂 modules 📂 ROOT 📂 images <1> - 📄 a-source-file.jpg <2> - 📄 a-source-file.gif + 📄 a-source-file.gif <2> + 📄 a-source-file.jpg 📂 pages 📄 a-source-file.adoc 📄 nav.adoc @@ -23,13 +23,11 @@ Antora applies preset behavior to the source files stored in an [.path]_images_ [#images] == Images -[.term]*Images* are source files, such as photographs, diagrams, and screenshots, that are saved in an [.path]_images_ family directory. +An [.term]*image* is a resource, such as a photograph, diagram, or screenshot. +The source files for images are stored in an [.path]_images_ family directory. +Antora supports the PNG, JPG, SVG, and GIF (static and animated) image file formats. -Images can be inserted into any page or partial, regardless of the module or component version it belongs to, using the xref:asciidoc:insert-image.adoc[block or inline image macros]. -AsciiDoc supports PNG, JPG, SVG, and GIF (static and animated) image file formats. +An image can be embedded into any page or partial, regardless of the module or component version it belongs to, using its xref:page:resource-id.adoc[resource ID] and an AsciiDoc xref:page:block-images.adoc[block image macro] or xref:page:inline-images.adoc[inline image macro]. If an image isn't referenced in an AsciiDoc image macro, its content won't be published to a site. -NOTE: When referencing an image, you don't need to include the `image` family name in its resource ID. -Antora automatically applies it to a target resource ID in an AsciiDoc image macro. - include::partial$assets-directory.adoc[] diff --git a/docs/modules/ROOT/pages/module-directories.adoc b/docs/modules/ROOT/pages/module-directories.adoc index e4acca9dd..7ed792af1 100644 --- a/docs/modules/ROOT/pages/module-directories.adoc +++ b/docs/modules/ROOT/pages/module-directories.adoc @@ -2,7 +2,7 @@ :page-aliases: modules.adoc [#modules-dir] -== What is the modules directory? +== What's the modules directory? The [.path]_modules_ directory is required wherever a component version descriptor file ([.path]_antora.yml_) is located. @@ -16,7 +16,7 @@ The [.path]_modules_ directory is required wherever a component version descript <1> Content source root <2> Required component version descriptor file <3> Required [.path]_modules_ directory -<4> Antora won't process the files in this directory because it isn't located inside the [.path]_modules_ directory +<4> Antora won't process the files in this directory because it's located outside the [.path]_modules_ directory Except for [.path]_antora.yml_, the standard directories and their files must reside in a valid hierarchy in the [.path]_modules_ directory. A [.path]_modules_ directory can contain as many <<module-dir,module directories>> as you require. @@ -24,7 +24,7 @@ A [.path]_modules_ directory can contain as many <<module-dir,module directories The [.path]_modules_ directory may seem unnecessary, but it keeps documentation source files separate from application code, tests, and other materials if a xref:content-source-repositories.adoc#content-source-root[content source root] is located in a repository that stores non-documentation projects. [#module-dir] -== What is a module directory? +== What's a module directory? Module directories must be stored in a <<modules-dir,_modules_ directory>>. A [.term]*module directory* stores the source files for pages, reusable text and example snippets, images, and other content, in one or more xref:family-directories.adoc[family directories]. @@ -55,7 +55,7 @@ The <<module,module>> corresponds to the name of the module directory. For this reason, it's important to carefully consider what files you store in a [.path]_ROOT_ module directory and xref:module-directory-names.adoc[what you name your named module directories]. [#module] -== What is a module? +== What's a module? Antora classifies, assembles, and publishes the content of a xref:component-version.adoc[component version] into one or more modules. A [.term]*module* is a collection of content that's typically related by concept, stage, feature, or other project-specific criteria. diff --git a/docs/modules/ROOT/pages/module-directory-names.adoc b/docs/modules/ROOT/pages/module-directory-names.adoc index f9c29f9f7..a0804820d 100644 --- a/docs/modules/ROOT/pages/module-directory-names.adoc +++ b/docs/modules/ROOT/pages/module-directory-names.adoc @@ -2,25 +2,25 @@ :xrefstyle: short :listing-caption: Example -When you're creating module directories, you need to consider the team using them and your site's URLs. +When you're creating module directories, you need to consider how your team will use the files stored in them and how their names will affect your site's URLs. == Selecting module directory names Antora calculates the xref:named-module-directory.adoc#named-module[name of a module] from the name of a xref:module-directories.adoc#module-dir[module directory]. -A module name is used in page cross references, image macros, and include directives. +A module name is used in xref:page:page-id.adoc[page IDs] and the xref:page:resource-id.adoc[resource IDs] of images, examples, and partials. It's also used in the xref:module-url-segment.adoc#named-module-urls[URLs of the pages assigned to that module]. When choosing a module directory name, keep the following requirements and recommendations in mind: * Named module directories *can't contain blank spaces or forward slashes (`/`)*. -These characters aren't permitted in AsciiDoc cross references, image macros, or include directives. +These characters aren't permitted in the targets of AsciiDoc cross references, image macros, or include directives. * If possible, *don't use uppercase letters, underscores (`_`), and other characters that aren't recommended in URLs*. Such characters can limit web server portability, downgrade site search results, and cause visitor accessibility problems. -* If your team often references pages, examples, images, or partials across modules, they'll have to type a module's name in page and resource IDs, so *don't make the directory name hard to remember or extremely long*. +* If your team often references pages, examples, images, or partials across modules, they'll have to type a module's name in page and resource IDs, so *don't make the directory name, and therefore, the derived module name, hard to remember or too long*. -<<fig-named>> shows a standard directory structure that contains three named module directories. +<<ex-named>> shows a set of standard directories with three named module directories. -[#fig-named] +[#ex-named] .Three named module directories ---- 📒 repository @@ -49,4 +49,4 @@ Such characters can limit web server portability, downgrade site search results, <3> [.path]_ROOT_ module directory <4> Module directory named [.path]_sdk_ -Antora would calculate the following module names from the named module directories in <<fig-named>>: `gear`, `la-garita`, and `sdk`. +Antora would calculate the following module names from the named module directories in <<ex-named>>: `gear`, `la-garita`, and `sdk`. diff --git a/docs/modules/ROOT/pages/module-url-segment.adoc b/docs/modules/ROOT/pages/module-url-segment.adoc index 0d432f9c9..c1c9a20d0 100644 --- a/docs/modules/ROOT/pages/module-url-segment.adoc +++ b/docs/modules/ROOT/pages/module-url-segment.adoc @@ -9,9 +9,9 @@ When a ROOT module's xref:pages-directory.adoc[pages] are published to a site, t That means the xref:root-module-directory.adoc[module name], _ROOT_, is never displayed in the site's page URLs. To demonstrate this concept, let's compare the URLs of two pages, one assigned to a ROOT module and one assigned to a named module. -The xref:standard-directories.adoc[standard directory structure] illustrated in <<fig-modules>> contains content source files for a project named _Hyper Lemur_. +The xref:standard-directories.adoc[set of standard directories] illustrated in <<ex-modules>> contains content source files for a project named _Hyper Lemur_. -[#fig-modules] +[#ex-modules] .Two module directories containing content that's part of the Hyper Lemur project ---- 📒 repository @@ -30,7 +30,7 @@ The xref:standard-directories.adoc[standard directory structure] illustrated in ---- Notice the file named [.path]_deploy.adoc_ in the [.path]_pages_ directory of the [.path]_ROOT_ module directory. -When Antora generates a documentation site for Hyper Lemur, the URL for the page created from the [.path]_deploy.adoc_ source file will look like this. +When Antora generates a site for Hyper Lemur, the URL for the page created from the [.path]_deploy.adoc_ source file will look like this. image::root-page-url.svg[ROOT module page URL,role=grow-x] @@ -44,7 +44,7 @@ Now, let's see what the URL of a page stored in the named module, _admin_, would [#named-module-urls] == URLs for named module pages -Using the Hyper Lemur source files in <<fig-modules>>, let's see what the URL for the [.path]_user-management.adoc_ file would look like. +Using the Hyper Lemur source files in <<ex-modules>>, let's see what the URL for the [.path]_user-management.adoc_ file would look like. The file is assigned to the _pages_ family of the _admin_ module. //.URL for user-management.adoc page in a-module diff --git a/docs/modules/ROOT/pages/named-module-directory.adoc b/docs/modules/ROOT/pages/named-module-directory.adoc index 126f67749..27f881b27 100644 --- a/docs/modules/ROOT/pages/named-module-directory.adoc +++ b/docs/modules/ROOT/pages/named-module-directory.adoc @@ -7,7 +7,7 @@ Named module directories are xref:module-directories.adoc#module-dir[optional module directories] that are located in a xref:module-directories.adoc#modules-dir[_modules_ directory]. You can create as many named module directories as you need. -[#fig-named] +[#ex-named] .Named module directories ---- 📒 repository @@ -31,7 +31,7 @@ You can create as many named module directories as you need. <7> A navigation file <8> Another module directory, named [.path]_get-started_ -A <<named-module,module's name>> corresponds to the name of the module directory. +Antora uses a module's directory name to create a <<named-module,module's name>>. For this reason, it's important to carefully consider xref:module-directory-names.adoc[what you name your named module directories]. At a minimum, a named module directory must contain at least one xref:family-directories.adoc[family directory] with at least one source file. A named module directory can also contain an optional navigation file. @@ -41,11 +41,11 @@ A named module directory can also contain an optional navigation file. Source files in each named module directory become part of a named module in a xref:component-version.adoc[component version]. The name of a module corresponds to the name of a module directory. -For instance, source files stored in the [.path]_get-started_ module directory shown in <<fig-named>> will be assigned to the module `get-started`. +For instance, source files stored in the [.path]_get-started_ module directory shown in <<ex-named>> will be assigned to the module `get-started`. [#where-name-is-used] -== Where is a module's name used? +== Where's a module's name used? -When you target content that belongs to a named module from another module or component version, you'll specify the module's name in the page IDs of cross references and the resource IDs for images, examples, and partials. +When you target content that belongs to a named module from another module or component version, you'll specify the module's name in the xref:page:page-id.adoc[page IDs] of cross references and the xref:page:resource-id.adoc[resource IDs] for images, examples, and partials. The module's name is also used as a xref:module-url-segment.adoc#named-module-urls[segment in page URLs]. diff --git a/docs/modules/ROOT/pages/organize-content-files.adoc b/docs/modules/ROOT/pages/organize-content-files.adoc index 34a2a6798..484c82633 100644 --- a/docs/modules/ROOT/pages/organize-content-files.adoc +++ b/docs/modules/ROOT/pages/organize-content-files.adoc @@ -19,7 +19,7 @@ In order to fetch source files from multiple and multi-use repositories, Antora Antora decouples the source files from their storage locations after it collects them. //That means the names and URLs of the repositories, branches, tags, and content source roots doesn't have any bearing on a site that's generated from these files. -Except for the family relative path of files stored in a [.path]_pages_ directory, the source files`' storage locations don't impact how they're referenced internally, organized, labeled, and versioned in the published site, or even how their resulting page URLs are constructed when the site is being generated. +Except for the family-relative path and filename of the files stored in the family directories, the source files`' storage locations don't impact how they're referenced internally, organized, labeled, and versioned in the published site, or even how their resulting page URLs are constructed when the site is being generated. Instead, groups of source files are assigned a component name and version (or no version) using a component version descriptor file named _antora.yml_. Antora uses these descriptor files to sort and organize the collected source files into component versions. diff --git a/docs/modules/ROOT/pages/pages-directory.adoc b/docs/modules/ROOT/pages/pages-directory.adoc index 89b5a8980..aaa73715f 100644 --- a/docs/modules/ROOT/pages/pages-directory.adoc +++ b/docs/modules/ROOT/pages/pages-directory.adoc @@ -3,7 +3,7 @@ [#pages-dir] == Pages family directory -A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_pages_. +A module directory can contain an xref:family-directories.adoc[optional family directory] named [.path]_pages_. Only AsciiDoc source files with the file extension (_.adoc_) should be stored in the [.path]_pages_ directory because Antora applies preset behavior to these files when it runs. ---- @@ -25,11 +25,12 @@ A [.path]_pages_ family directory must contain at least one AsciiDoc source file [#pages] == Pages -[.term]*Pages* are AsciiDoc source files (_.adoc_) that are stored in a [.path]_pages_ directory. +[.term]*Pages* are source files stored in a [.path]_pages_ directory. Each page is automatically converted to HTML and published as an individual page in a site. -Antora uses the file name of each page source file as the page segment in its URL. +xref:page:index.adoc[Valid pages] are marked up using AsciiDoc and saved with the _.adoc_ file extension. +Antora uses the xref:page:create-standard-page.adoc[filename of each page file] as the page segment in its URL. -A page can be referenced by any other page, regardless of the component version or module it's assigned to, using the AsciiDoc xref macro and the page's page ID. +A page can be cross referenced by any other page, regardless of the component version or module it's assigned to, using the AsciiDoc xref macro and the page's xref:page:page-id.adoc[page ID]. //// diff --git a/docs/modules/ROOT/pages/partials-directory.adoc b/docs/modules/ROOT/pages/partials-directory.adoc index c799342eb..0235018b6 100644 --- a/docs/modules/ROOT/pages/partials-directory.adoc +++ b/docs/modules/ROOT/pages/partials-directory.adoc @@ -3,36 +3,30 @@ [#partials-dir] == Partials family directory -A module directory can contain an optional xref:family-directories.adoc[family directory] named [.path]_partials_. +A module directory can contain an xref:family-directories.adoc[optional family directory] named [.path]_partials_. ---- 📂 modules - 📂 a-named-module - 📂 partials <1> - 📄 a-source-file.adoc <2> 📂 ROOT 📂 pages 📄 a-source-file.adoc - 📂 partials <3> - 📄 a-source-file.csv <4> + 📂 partials <1> + 📄 a-source-file.csv <2> 📄 nav.adoc ---- -<1> A [.path]_partials_ family directory in a named module directory -<2> A partial AsciiDoc source file -<3> A [.path]_partials_ family directory in a [.path]_ROOT_ module directory -<4> A partial source file +<1> A [.path]_partials_ family directory in a [.path]_ROOT_ module directory +<2> A partial source file Antora applies preset behavior to the source files stored in the [.path]_partials_ directory when it generates a site. [#partials] == Partials -[.term]*Partials* are usually AsciiDoc source files (_.adoc_) that contain content snippets, such as common descriptions, terminology, or reference tables, that you plan to insert in multiple pages. -They may also be reusable UML, STEM, or CSV/TSV content. -The source files for partials are stored in a [.path]_partials_ directory. +[.term]*Partials* are resources that contain content snippets, such as common descriptions, terminology, or reference tables, that you plan to reuse in one or more pages. +Partials are saved as AsciiDoc source files (_.adoc_) and stored in a [.path]_partials_ directory. -If a partial isn't referenced in an AsciiDoc include directive, its content won't be published to a site (unlike xref:pages-directory.adoc#pages[pages], which are always automatically published). -Partials and tagged regions in a partial can be inserted into any page, regardless of the module or component version that page belongs to, using the xref:asciidoc:include-partial.adoc[include directive and the partial's resource ID]. +If a partial isn't referenced in an AsciiDoc include directive, its content won't be published to a site. +Partials and tagged regions in a partial can be inserted into any page, regardless of the module or component version that page belongs to, using the xref:asciidoc:include-partial.adoc[include directive] and the partial's xref:page:resource-id.adoc[resource ID]. -When referencing a partial, the `partial` family name must be included in its resource ID. -The family name, `partial`, is required because the include directive is also used to reference xref:examples-directory.adoc[example source files]. +When referencing a partial, the `partial$` family coordinate must be included in its resource ID. +This coordinate is required because the include directive is also used to reference xref:examples-directory.adoc[examples] and, occasionally, xref:pages-directory.adoc[pages]. diff --git a/docs/modules/ROOT/pages/root-module-directory.adoc b/docs/modules/ROOT/pages/root-module-directory.adoc index 2dbd0d4a1..844e567fa 100644 --- a/docs/modules/ROOT/pages/root-module-directory.adoc +++ b/docs/modules/ROOT/pages/root-module-directory.adoc @@ -42,9 +42,9 @@ Source files that are stored in a [.path]_ROOT_ directory become part of a modul A ROOT module's pages become the top-level pages of a component version. [#where-root-name-is-used] -== Where is the ROOT module name used? +== Where's the ROOT module name used? -When you target content that belongs to a ROOT module from another module or component version, you'll specify the module name `ROOT` in the page IDs of cross references and the resource IDs for images, examples, and partials. +When you target content that belongs to a ROOT module from another module or component version, you'll specify the module name `ROOT` in the xref:page:page-id.adoc[page IDs] of cross references and the xref:page:resource-id.adoc[resource IDs] for images, examples, and partials. `ROOT` is always written in uppercase letters when it's specified. Since Antora considers the pages in a ROOT module to be top-level component version pages, the module name `ROOT` isn't displayed in the xref:module-url-segment.adoc#root-module-urls[module segment of its page URLs]. diff --git a/docs/modules/ROOT/pages/standard-directories.adoc b/docs/modules/ROOT/pages/standard-directories.adoc index 38f5547ea..8aeda4ef4 100644 --- a/docs/modules/ROOT/pages/standard-directories.adoc +++ b/docs/modules/ROOT/pages/standard-directories.adoc @@ -9,13 +9,13 @@ Antora collects and processes content source files that are stored in a required These directories, as well as the required [.path]_antora.yml_ file and optional navigation files, are recognized by their locations in the hierarchy and because they use reserved names. Antora uses this [.term]*standard file and directory set* to assign custom metadata and preset behavior to the files stored in each directory. -== Standard names and hierarchy +== Hierarchy and reserved names -<<fig-all>> shows the hierarchy of the standard file and directory set if all of the possible standard directories are used. -The content source root in <<fig-all>> is a repository. -However, a content source root can also be a directory in a repository, which you can see in <<fig-image>>. +<<ex-standard-dirs>> shows the hierarchy of the standard file and directory set if all of the possible standard directories are used. +The content source root in <<ex-standard-dirs>> is a repository. +However, a content source root can also be a directory in a repository, which you can see in <<ex-image>>. -[#fig-all] +[#ex-standard-dirs] .All required and optional standard files and directories ---- 📒 repository <1> @@ -50,7 +50,7 @@ For instance, if you aren't inserting any images into the content stored in a mo You can see two examples of simple standard file and directory sets in the <<minimum-requirements,next section>>. [#minimum-requirements] -== Minimum standard file and directory set requirements +== Minimum requirements From a xref:content-source-repositories.adoc#content-source-root[content source root], Antora must find: @@ -62,9 +62,11 @@ From a xref:content-source-repositories.adoc#content-source-root[content source The [.path]_antora.yml_ file and directories must also be organized in the standard hierarchy from the content source root. Let's look at two examples of standard file and directory sets that meet the minimum requirements. -The directory and file set in <<fig-root>> is valid because it contains one module directory, in this case the special _ROOT_, the _ROOT_ module directory contains a family directory, and the required [.path]_antora.yml_ and [.path]_modules_ directory are at the content source root. +The directory and file set in <<ex-root>> is valid because it contains the required [.path]_antora.yml_ and [.path]_modules_ directory at the content source root. +The [.path]_modules_ directory contains one module directory, in this case the special _ROOT_ module directory. +In turn, the _ROOT_ module directory contains a family directory that contains one source file. -[#fig-root] +[#ex-root] .Valid standard file and directory set containing a ROOT module directory ---- 📒 repository <1> @@ -81,9 +83,9 @@ The directory and file set in <<fig-root>> is valid because it contains one modu <5> [.path]_pages_ family directory <6> Source file for a page -The standard directory and file set in <<fig-image>> is also valid. +In <<ex-image>>, the content source root is located at the directory [.path]_ops-training_. -[#fig-image] +[#ex-image] .Valid standard file and directory set containing a named module directory ---- 📒 repository @@ -101,3 +103,5 @@ The standard directory and file set in <<fig-image>> is also valid. <4> A module directory named [.path]_rz-interface_ <5> [.path]_images_ family directory <6> Source file for an image + +The standard directory and file set in <<ex-image>> is also valid. diff --git a/docs/modules/page/pages/page-aliases.adoc b/docs/modules/page/pages/page-aliases.adoc index 6d8e7d898..c2a75f04c 100644 --- a/docs/modules/page/pages/page-aliases.adoc +++ b/docs/modules/page/pages/page-aliases.adoc @@ -10,7 +10,7 @@ This document attribute is useful when you delete a page, rename a page's file, The `page-aliases` attribute should not be used to create bulk redirects. We strongly recommended that you use the router provided by your web server or service when a module, component, or version is deleted, renamed, or moved. -== The page-aliases attribute +== page-aliases attribute The `page-aliases` attribute is set in the xref:asciidoc:page-header.adoc[header] of a target page. [[target-page]]The [.term]*target page* refers to the page you're redirecting a source page to. @@ -26,13 +26,13 @@ Multiple page IDs can be assigned to the attribute in a comma-separated list. ---- Antora calculates the URL for a source page's page ID and generates redirect information so that the source page URL redirects to the target page URL. -Any coordinates, such as xref:page-id.adoc#id-version[version] or xref:page-id.adoc#id-component[component], that are missing from a source page's page ID are interpolated from the target page's coordinates. +Any coordinates, such as xref:page-id.adoc#id-version[version] or xref:page-id.adoc#id-component[component], that aren't specified in a page ID assigned to `page-aliases` are interpolated from the target page's coordinates. The generated output format of the redirect information is determined by your chosen xref:playbook:configure-redirect-facility.adoc[redirect facility]. //The site start_page, if specified in the playbook, is implemented through the redirect facility. [CAUTION] -.Page Alias Limitations +.Page Alias Restrictions ==== * A page ID assigned to a `page-aliases` attribute can't be used in an xref. Therefore, if you delete, rename, or move a page, you need to update any references to it in your source to the page ID of the target page. @@ -43,7 +43,7 @@ Partials, examples, images, and attachments can't be aliased. == Create a redirect for a renamed page -If you change a source page's file name from [.path]_old-name.adoc_ to [.path]_new-name.adoc_, assign the file's former page ID to `page-aliases` in the header of the target page's file. +If you change a source page's filename from [.path]_old-name.adoc_ to [.path]_new-name.adoc_, assign the file's former page ID to `page-aliases` in its header. .new-name.adoc [source] @@ -53,7 +53,7 @@ If you change a source page's file name from [.path]_old-name.adoc_ to [.path]_n ---- This will result in [.path]_\https://base-url.com/component/version/module/old-name.html_ being redirected to [.path]_\https://base-url.com/component/version/module/new-name.html_. -The missing page ID coordinates (version, component, module) for the source page `old-name.adoc` are interpolated from the target page's coordinates. +The version, component, and module coordinates that weren't specified in the `old-name.adoc` page ID are interpolated from the target page's coordinates. //Alternatively, if you've specified `indexify` in your playbook, [.path]_\https://base-url.com/component/version/module/old-name_ will redirect to [.path]_\https://base-url.com/component/version/module/new-name_ . == Create a redirect for a moved page @@ -71,7 +71,7 @@ Both `module-1` and `module-z` are modules in version `5.0` of `component-1`. Now, Antora will redirect the URL [.path]_\https://base-url.com/component-1/5.0/module-1/source-1.html_ to the URL [.path]_\https://base-url.com/component-1/5.0/module-z/source-1.html_. -When a page is moved from one component to another component, assign the source page's fully-qualified former page ID to `page-aliases`. +When a page is moved from one docs component to another docs component, assign the source page's fully qualified former page ID to `page-aliases`. In <<ex-component>>, the page `source-w.adoc` has moved from version `1.4` of `component-8`, `module-u` to version `3.0` of `component-delta`, `ROOT`. [#ex-component] -- GitLab From b7a69250d7e54af6115e3b4324f7243994ec1a94 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:40:43 -0600 Subject: [PATCH 36/39] update terminology, xrefs, and restructure headings and navtitles --- docs/modules/navigation/nav.adoc | 17 ++++---- .../pages/filenames-and-locations.adoc | 22 +++++----- docs/modules/navigation/pages/index.adoc | 3 ++ .../pages/link-syntax-and-content.adoc | 43 ++++++++----------- .../navigation/pages/list-structures.adoc | 16 ++++--- .../pages/register-navigation-files.adoc | 6 ++- 6 files changed, 53 insertions(+), 54 deletions(-) diff --git a/docs/modules/navigation/nav.adoc b/docs/modules/navigation/nav.adoc index 46b4028c5..2045a8f12 100644 --- a/docs/modules/navigation/nav.adoc +++ b/docs/modules/navigation/nav.adoc @@ -1,11 +1,10 @@ -.xref:index.adoc[Navigation] -* xref:filenames-and-locations.adoc[Navigation File Names & Storage Locations] -* xref:register-navigation-files.adoc[Navigation File Registration] -* xref:list-structures.adoc[Single & Multi-list Navigation Files] -* xref:link-syntax-and-content.adoc[Link Types & Syntax] +.Navigation +* xref:index.adoc[Navigation Assembly] +* xref:filenames-and-locations.adoc[Navigation Filenames and Locations] +* xref:register-navigation-files.adoc[Register Navigation Files] +* xref:list-structures.adoc[Single and Multiple Navigation List Files] +* xref:link-syntax-and-content.adoc[Link Syntax, Content, and Styles] ** xref:link-syntax-and-content.adoc#page[Page Links] ** xref:link-syntax-and-content.adoc#resource[Attachment Links] -** xref:link-syntax-and-content.adoc#urls[Other URI Links] -** xref:link-syntax-and-content.adoc#content[Navigation Content & Link Formatting] -//* xref:create-a-navigation-file.adoc[Create and Register a Navigation File] -//* xref:organize-navigation-files.adoc[Organize and Register Navigation Files] +** xref:link-syntax-and-content.adoc#urls[External URL Links] +** xref:link-syntax-and-content.adoc#content[Content Formatting] diff --git a/docs/modules/navigation/pages/filenames-and-locations.adoc b/docs/modules/navigation/pages/filenames-and-locations.adoc index 74287075f..da88a6912 100644 --- a/docs/modules/navigation/pages/filenames-and-locations.adoc +++ b/docs/modules/navigation/pages/filenames-and-locations.adoc @@ -1,4 +1,4 @@ -= Navigation File Names and Storage Locations += Navigation Filenames and Locations :description: An overview of the purpose of an Antora navigation source file, its file format, its naming parameters, and storage location patterns. :keywords: AsciiDoc navigation file, nav.adoc, repository organization, save navigation in a repository, navigation file best practices // Filters @@ -18,28 +18,28 @@ All of the AsciiDoc files in a [.path]_pages_ directory are automatically publis That means visitors can find a page using search tools, links on other site pages, and in some scenarios, through dropdown menus such as the page version selector. When you want visitors to be able to locate and go to a page using a component version page menu, then you must add a cross reference (`xref`) to that page in the appropriate navigation source file. -== What is a navigation source file? +== What's a navigation source file? -A navigation source file is a list of page cross references, external URLs, and other content that is marked up in AsciiDoc and stored at the base of a module. +A navigation source file is a list of page cross references, external URLs, and other content that is marked up in AsciiDoc and stored at the base of a xref:ROOT:module-directories.adoc[module directory]. If registered in a component version descriptor ([.path]_antora.yml_), the contents of the navigation file will be incorporated into a component version page menu and published to a site. -== Navigation file format and naming +== Filename and format Navigation files must end with the AsciiDoc file extension (`.adoc`). They're typically named [.path]_nav.adoc_; however, you can use any name that is meaningful to you. Name your navigation files [.path]_kaboom.adoc_ if that's what makes your team happy. [#storage] -== Navigation file storage locations +== File location A common pattern is for each module to contain its own navigation file. -xref:ROOT:modules.adoc[Modules already represent logical groups of concepts or objectives], so it's likely that you'd arrange the xrefs to that module's pages into a continuous, hierarchical flow of navigation menu entries. +xref:ROOT:module-directories.adoc#module[Modules already represent logical groups of concepts or objectives], so it's likely that you'd arrange the xrefs to that module's pages into a continuous, hierarchical flow of navigation menu entries. This also reduces the number of coordinates the page IDs in the xrefs require when you add a page to the navigation file. -Navigation files should be stored at the base of a module, i.e., at the same level as the module's [.path]_pages_ directory. +Navigation files should be stored at the base of a module directory, i.e., at the same level as a [.path]_pages_ family directory. *Don't* save navigation files inside [.path]_pages_, otherwise the navigation files will be converted to individual pages and published as pages. -=== Multiple navigation files per module +=== Multiple files per module A module can contain more than one navigation file. This functionality helps you finely tune the navigation list order when you xref:register-navigation-files.adoc[register the navigation files] in an [.path]_antora.yml_ file. @@ -49,9 +49,9 @@ This functionality helps you finely tune the navigation list order when you xref Storing a navigation file in the module it references simplifies the page cross references entered into it. It also helps writers locate the navigation that's affected when they add pages to or remove pages from a module. However, xrefs to other modules' pages (and even other component versions' pages) can be entered into any module's navigation file. -You just need to xref:asciidoc:page-to-page-xref.adoc#different-module[add the module coordinate] (or xref:asciidoc:page-to-page-xref.adoc#different-component[component name and version coordinates]) to the cross references you create in the navigation file. +You just need to xref:page:module-and-page-xrefs.adoc#xref-page-across-modules[add the module coordinate] (or xref:page:version-and-component-xrefs.adoc[component name and version coordinates]) to the cross references you create in the navigation file. For example, you could store a single navigation file in a component version's ROOT module, and, instead of having navigation files in each module in the component version, you could just add the cross references to pages in those other modules directly to the ROOT module's navigation file. - +//// == What's next? Learn how to register navigation files so they get included in a component version page menu: @@ -62,7 +62,7 @@ Learn all about creating navigation lists and navigation items: * xref:list-structures.adoc[Navigation lists: list title and item hierarchy, single list file, multi-list file] * xref:link-syntax-and-content.adoc[Navigation link syntax and content formatting: xrefs, URLs, text styles, images, and more] - +//// //A component menu is created when, at runtime, Antora combines one or more navigation files as instructed by a component descriptor file, converts the assembled navigation lists into HTML, wraps the HTML with a UI template, and publishes the resulting component navigation menus to your site. //A component navigation menu allows site visitors to discover and navigate between a component's pages. //Antora allows for a variety of use cases so that you can create, store, and assemble the navigation source files to suit your documentation requirements. diff --git a/docs/modules/navigation/pages/index.adoc b/docs/modules/navigation/pages/index.adoc index e470d6f46..7af7909be 100644 --- a/docs/modules/navigation/pages/index.adoc +++ b/docs/modules/navigation/pages/index.adoc @@ -81,6 +81,7 @@ Antora automatically populates this selector when multiple versions of a page ar image::page-version-selector.png[Screenshot of the page version selector dropdown menu in an Antora documentation site,660] +//// == What's next? *Summit Stats*: All the details about each concept. @@ -89,6 +90,8 @@ image::page-version-selector.png[Screenshot of the page version selector dropdow * xref:register-navigation-files.adoc[The nav key and registering navigation files] * xref:list-structures.adoc[Navigation list structures: list item and title nesting, single list file, multi-list file] * xref:link-syntax-and-content.adoc[Navigation list item syntax: xrefs, URLs, text styles, images, icons, and more] +//// + //* Navigation files and the AsciiDoc include directive //* Component navigation menu, home icon, and the index / start page //* Breadcrumbs diff --git a/docs/modules/navigation/pages/link-syntax-and-content.adoc b/docs/modules/navigation/pages/link-syntax-and-content.adoc index 8450a59b7..e2ae7e454 100644 --- a/docs/modules/navigation/pages/link-syntax-and-content.adoc +++ b/docs/modules/navigation/pages/link-syntax-and-content.adoc @@ -13,10 +13,10 @@ When content is linked, then a website visitor can click on the visible content The syntax used to link the content depends on what the destination page or resource is and where it is located. Site pages:: -When the link destination is a page in your site, the link is created using the Antora cross referencing system (`\xref:page-id.adoc[link content]`). +When the link destination is a page in your site, the link is created using the Antora cross referencing system (`\xref:page-id[link content]`). Site attachments:: -When the link destination is an attachment in your site (i.e., stored in [.path]_assets/attachments_), such as a PDF or downloadable ZIP, the link is created using the link macro (`+link:{attachmentsdir}/filename.ext[link content]+`). +When the link destination is an attachment resource, the link is created using the link macro (`+link:{attachmentsdir}/filename.ext[link content]+`). Other websites and resources:: When the link destination is a website or resource that isn't part of your site, i.e., it isn't stored in a documentation component, the link is created using a valid URI scheme and address (`+https://website.com[link content]+`). @@ -27,23 +27,19 @@ When the link destination is a website or resource that isn't part of your site, [#page] == Site page links -Cross references in a navigation list use the xref:asciidoc:page-to-page-xref.adoc[same syntax and page ID construction as cross references in the page content]. -Just set up the `xref` macro, insert the destination page ID, and add the link content. +Cross references in a navigation list are constructed using the xref:page:page-id.adoc#whats-a-cross-reference[AsciiDoc xref macro] and a xref:page:page-id.adoc[valid page ID] +Set up the `xref` macro, insert the destination page ID, and add the link content. The link content can be text, images, and/or icons. The link content is visible to the visitor in the component version's page menu. It is also displayed in the breadcrumbs at the top of the destination page. When a visitor clicks on the link content, they are routed to the destination page specified by the page ID in the xref. -*Whether in the body of a site page (i.e., AsciiDoc document stored in [.path]_<module>/pages_), or in a navigation file, always create page-to-page or navigation-to-page links using the page cross reference syntax.* -*Antora's page IDs are what allows your site to be portable across environments, domains, and versions.* - === In-module page links The most common items in a navigation list are xrefs to pages in xref:filenames-and-locations.adoc#storage[the same module where the navigation file is stored]. In this case, the page ID doesn't require the component or module coordinates. -.xrefs to in-module pages -[source,asciidoc] +[source] ---- .xref:index.adoc[In-module page] * xref:a-page-in-this-module.adoc[Another in-module page] @@ -53,26 +49,24 @@ In this case, the page ID doesn't require the component or module coordinates. === Links to pages in other modules and component versions -Using the appropriate page ID pattern, you can link to any document in the site from a navigation list, whether it's stored in a xref:asciidoc:page-to-page-xref.adoc#different-module[different module] or xref:asciidoc:page-to-page-xref.adoc#different-component[component]. +Using the appropriate page ID pattern, you can link to any page in the site from a navigation list, whether it belongs to a xref:page:module-and-page-xrefs.adoc#xref-page-across-modules[different module] or xref:page:version-and-component-xrefs.adoc[docs component]. -.xrefs to pages in other modules and component versions -[source,asciidoc] +[source] ---- * xref:index.adoc[In-module page] * xref:other-module:page.adoc[Page in the same component version, but a different module] ** xref:topic/page.adoc[In-module page in a topic folder] *** xref:other-module:page.adoc#fragment[A deep link to a page in the same component version, but a different module] -*** xref:other-component:module:page.adoc[Page in another component] +*** xref:other-component:module:page.adoc[Page in another docs component] ---- [#resource] == Site resource links -An attachment is a resource stored in a xref:ROOT:modules.adoc#attachments-dir[module's attachments directory] ([.path]_assets/attachments_), such as a PDF or a sample project ZIP archive, that you want your user to visit or download. +An attachment is a resource stored in an xref:ROOT:attachments-directory.adoc[_attachments_ directory] that you want your user to visit or download. To xref:asciidoc:link-attachment.adoc[insert a link to an attachment], use the AsciiDoc link macro (`+link:[]+`). -.Attachment link syntax -[source,asciidoc] +[source] ---- * link:{attachmentsdir}/filename.ext[Link to resource in attachments directory] ---- @@ -81,21 +75,20 @@ To xref:asciidoc:link-attachment.adoc[insert a link to an attachment], use the A == Other website and resource links A navigation list can contain links to websites and resources that are not part of your site. -These links are created using the xref:asciidoc:external-urls.adoc#url-syntax[AsciiDoc URI syntax], which requires a valid URI scheme and address. +These links are created using the xref:asciidoc:external-urls.adoc#url-syntax[AsciiDoc URL syntax], which requires a valid URI scheme and address. //In a few unique cases, the link is created with a link macro. -.Link to an external website -[source,asciidoc] +[source] ---- -* https://other-website.com/url[Link to another website] +* https://external-website.com[Link to another website] ---- [#content] == Unlinked content -When you want to include content in a navigation list, but you don't want it to be a link, simply don't mark it up with any link syntax. +When you want to display content in a navigation list, but you don't want it to be a link, simply don't mark it up with any link syntax. -[source,asciidoc] +[source] ---- * Unlinked Content ** xref:a-page.adoc[Linked Content] @@ -105,7 +98,7 @@ When you want to include content in a navigation list, but you don't want it to Whether linked or unlinked, the text you want displayed in your component version page menu can be formatted using inline AsciiDoc markup. -[source,asciidoc] +[source] ---- * xref:index.adoc[*Bold linked text*] * `Monospaced` text @@ -118,7 +111,7 @@ A navigation item can be an image. To include an image, use the inline image macro (`+image:filename.ext[]+`). The inline image macro has only one colon (`:`). -[source,asciidoc] +[source] ---- .image:status.png[] // <1> * xref:index.adoc[image:star.svg[] What's New] // <2> @@ -126,6 +119,7 @@ The inline image macro has only one colon (`:`). <1> Unlinked image <2> Linked image +//// == What's next? Learn how to register navigation files so they get included in a component version page menu: @@ -136,7 +130,6 @@ Learn all about structuring navigation lists: * xref:list-structures.adoc[Navigation lists: list title and item hierarchy, single list file, multi-list file] -//// .List title and item content [source,asciidoc] diff --git a/docs/modules/navigation/pages/list-structures.adoc b/docs/modules/navigation/pages/list-structures.adoc index 16f8fc269..b79536487 100644 --- a/docs/modules/navigation/pages/list-structures.adoc +++ b/docs/modules/navigation/pages/list-structures.adoc @@ -1,4 +1,4 @@ -= Single List and Multi-list Navigation Files += Single and Multiple Navigation List Files :description: How to structure a single list or multi-list Antora navigation source file, nest items in a list, and use list titles to create component version page menus. :keywords: nav.adoc, nested sidebar menu, nested navigation with AsciiDoc, Antora menu items, UI, theme // Filters @@ -27,7 +27,7 @@ Each top-level item can have as many nested items as you need. The greatest nesting depth allowed is level five (`+*****+`). .Item level syntax -[source,asciidoc] +[source] ---- * Level 1 (top) ** Level 2 @@ -43,7 +43,7 @@ A title is preceded by a period (`.`). Unlike list items, there must be *no spaces* between the `.` and the content of the title. .List title syntax -[source,asciidoc] +[source] ---- .List title * List item @@ -61,7 +61,7 @@ If a navigation file contains <<multi,multiple lists>>, each list in that file m When a navigation file only contains one list, a list title is optional. .Single list structure and syntax -[source,asciidoc] +[source] ---- * List item ** Nested item @@ -77,12 +77,12 @@ You can separate list items with blank lines or comment lines. The blank lines are removed from the HTML when the list is published as a navigation menu, and the comments aren't visible to site visitors. [#multi] -== Multi-list file +== Multiple list file When a navigation file contains multiple lists, each list must have a title and be separated by at least one blank line. -.Multi-list structure and syntax -[source,asciidoc] +.Multiple list structure and syntax +[source] ---- .List title // <1> * List item @@ -99,6 +99,7 @@ When a navigation file contains multiple lists, each list must have a title and When converted to HTML, the list titles become top level items and all of their list items are nested under them in cascading order. The blank line between the lists is not present in the published menu. +//// == What's next? Learn all about creating and formatting navigation list items: @@ -108,3 +109,4 @@ Learn all about creating and formatting navigation list items: Learn how to register navigation files so they get included in a component version page menu: * xref:register-navigation-files.adoc[Register navigation files in _antora.yml_ for display in a component version page menu] +//// diff --git a/docs/modules/navigation/pages/register-navigation-files.adoc b/docs/modules/navigation/pages/register-navigation-files.adoc index e73c2d6ac..5ecd51413 100644 --- a/docs/modules/navigation/pages/register-navigation-files.adoc +++ b/docs/modules/navigation/pages/register-navigation-files.adoc @@ -10,14 +10,14 @@ On this page, you'll learn: * [x] How to register navigation files in a component version descriptor. * [x] How registration order affects the component version page menu. -== The component version nav key +== nav key The `nav` key is set in the xref:ROOT:component-version-descriptor.adoc[component descriptor file] ([.path]_antora.yml_) of a xref:ROOT:component-version.adoc[component version]. It accepts a list of xref:filenames-and-locations.adoc[navigation files] as values. Each value specifies the path to an individual navigation file. If you aren't familiar with how to set the `nav` key and assign it values, review xref:ROOT:component-navigation.adoc[Assign navigation files to a component version] first. -== Register a component version's navigation files +== Register navigation files When a navigation file is assigned to the `nav` key, this file is [.term]*registered*. Only the contents of registered navigation files are assembled into, and published as, a component version page menu. @@ -46,9 +46,11 @@ The navigation lists in the two registered files will be published into a single The order of the `nav` key's values dictates the order the contents of the registered navigation files are assembled in the published component version page menu. In <<ex-register>>, the contents of the ROOT module's navigation file will be at the top of the component version page menu and the contents of Module One's navigation file will be appended to the end of the ROOT navigation list. +//// == What's next? Learn all about creating navigation lists and navigation items: * xref:list-structures.adoc[Navigation lists: list title and item hierarchy, single list file, multi-list file] * xref:link-syntax-and-content.adoc[Navigation link syntax and content formatting: xrefs, URLs, text styles, images, and more] +//// -- GitLab From d2c60d097971cfea6ef80e78a1936029314e4fc9 Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 18:42:01 -0600 Subject: [PATCH 37/39] create resource category and add new pages --- docs/modules/page/nav.adoc | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/docs/modules/page/nav.adoc b/docs/modules/page/nav.adoc index 4631a9192..12585530f 100644 --- a/docs/modules/page/nav.adoc +++ b/docs/modules/page/nav.adoc @@ -1,12 +1,22 @@ -.Pages & Resources -* xref:index.adoc[Pages] -* xref:create-standard-page.adoc[Create a Standard Page] -* xref:page-id.adoc[Antora Page ID] -* xref:asciidoc:page-to-page-xref.adoc[Page to Page Xrefs] +.Create & Manage Pages +* xref:index.adoc[Add Pages to a Component Version] +** xref:create-standard-page.adoc[Name and Set Up a Page] +** xref:start-page.adoc[Create a Start Page] +* xref:page-id.adoc[Page IDs and Cross References] +** xref:module-and-page-xrefs.adoc[Xref Pages in a Component Version] +** xref:version-and-component-xrefs.adoc[Xref Pages in Other Components and Versions] +//Rename, Move, and Delete Pages * xref:page-aliases.adoc[Set Up URL Redirects with Page Aliases] -* xref:resource-id.adoc[Antora Resource ID] -* xref:asciidoc:include-partial.adoc[Include a Partial] + +.Create & Manage Resources +* xref:resource-id.adoc[Resources and Resource IDs] +* xref:partials-and-content-snippets.adoc[Content Snippets and Partials] +** xref:asciidoc:include-partial.adoc[Include a Partial] +//* xref:examples-and-source-snippets.adoc[Source Code and Example Snippets] * xref:asciidoc:include-example.adoc[Include an Example] * xref:asciidoc:include-page.adoc[Include a Page] -* xref:asciidoc:insert-image.adoc[Insert an Image] +* xref:images.adoc[Images] +** xref:block-images.adoc[Add Block Images] +** xref:inline-images.adoc[Add Inline Images] +** xref:image-resource-id-examples.adoc[Image Resource ID Examples] * xref:asciidoc:link-attachment.adoc[Link to an Attachment] -- GitLab From cba1704506f54c1138f84b7c4a5aa8aa1971d07d Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sat, 4 Apr 2020 19:01:44 -0600 Subject: [PATCH 38/39] fix stray rebase comment lines and file that won't stay dead --- .../ROOT/pages/component-descriptor.adoc | 175 ------------------ docs/modules/navigation/pages/index.adoc | 15 -- 2 files changed, 190 deletions(-) delete mode 100644 docs/modules/ROOT/pages/component-descriptor.adoc diff --git a/docs/modules/ROOT/pages/component-descriptor.adoc b/docs/modules/ROOT/pages/component-descriptor.adoc deleted file mode 100644 index 65a0376b7..000000000 --- a/docs/modules/ROOT/pages/component-descriptor.adoc +++ /dev/null @@ -1,175 +0,0 @@ -= Component Descriptor: antora.yml -:listing-caption: Example -:xrefstyle: short -//When Antora receives instructions from a playbook to scan a repository, its first objective is to find a component descriptor file in that repository. -//This file provides stable metadata that Antora and other tools use when they retrieve information about the component and version. - -When an [.path]_antora.yml_ file is present in a repository or directory, Antora assumes that all of the subsequent files and subdirectories are part of a xref:component-structure.adoc[documentation component]. -Often referred to as the [.term]*component descriptor*, [.path]_antora.yml_ has two crucial purposes: - -. *Component marker*: When Antora finds [.path]_antora.yml_ in a repository or directory, it knows that it has located a documentation component. -This ability to store a documentation component anywhere in a directory hierarchy allows you to maintain and manage a component (or part of a component) in a repository with the software it documents, a demo or sample project, or in its own repository. - -. *Component information*: [.path]_antora.yml_ is referred to as the component descriptor because it describes the documentation component. -It associates the files in the standard directory structure with the specified component name and version (explicitly referred to as the _component version_, if you want to get technical). -This assignment of component information decouples the source files from the repository and branches in which they're stored. -It's also used for constructing Antora's resource IDs so you can reference pages, partials, examples, and images within a component and across components. -Finally, the component descriptor identifies and orders the files Antora uses to build the documentation's navigation. - -== Component descriptor requirements - -The component descriptor file must: - -* be named [.path]_antora.yml_, -* be written in valid YAML, -* contain the required keys and their values, and -* be located xref:component-structure.adoc#overview[at the same directory level as the _modules_ directory] of a documentation component. - -<<ex-1>> shows the structure of a component descriptor file. - -.antora.yml -[#ex-1] -[source,yaml] ----- -name: name-of-component -title: The title of the component used for display in the UI -version: name-of-version -start_page: name-of-a-module:filename.adoc -nav: -- modules/name-of-a-module/nav.adoc -- modules/ROOT/nav.adoc ----- - -The <<name-key>> and <<version-key>> keys are always required. -The <<title>>, <<display-version>>, <<start-page-key>>, and <<nav-key>> keys may be optional depending on the version name, structure, and file names associated with a documentation component. - -[#name-key] -=== `name` - -The `name` key is the component coordinate that's used when the component is referenced in a xref:asciidoc:page-to-page-xref.adoc#page-id-cname-def[page cross reference], xref:asciidoc:insert-image.adoc[image macro], xref:asciidoc:include-example.adoc[included example], or xref:asciidoc:include-partial.adoc[included partial]. - -```yaml -name: leaf -``` - -The value can contain letters, numbers, underscores (`+_+`), hyphens (`-`), and periods (`.`). -The value isn't related to the name of the repository or directory the component it's describing is stored in, though they may be the same or similar. -For instance, a documentation component might be stored in a GitLab repository named _Coco B's Massive Quantum App_ but this doesn't impact how Antora handles the component when it publishes a documentation site that uses it. -Antora only uses the value assigned to the component's name key when converting resource IDs and generating the URLs for the component's pages. - -[TIP] -To minimize the likelihood of portability issues between web servers, letters used in the component `name` and component `version` should be lowercase. - -=== `title` - -The `title` key is the display name for the component. - -```yaml -title: Silver Leaf -``` - -The UI uses it where ever the component is identified, including the: - -* xref:navigation:index.adoc#component-menu[component navigation menu] -* xref:navigation:index.adoc#component-dropdown[component version selector] -* first breadcrumb position - -This key is important because a component's name may have characters that don't work well in URLs or spaces that don't work in Antora's resource IDs. -Also, if the name of your project ever changes, you can change the value of the title key, but not have to change any resource IDs or URLs. -Let's imagine the Coco B company decides to change their application's name from _Massive Quantum_ to _Ultra Massive Quantum_. -All they have to do is change the value of the title key from `Massive Quantum` to `Ultra Massive Quantum` and the new application name will be displayed in their documentation site's UI. - -[#version-key] -=== `version` - -The `version` key is the version coordinate in the resource ID, version segment in the page URL, and, when `<<display-version>>` isn't set, the version name displayed in the UI. -It's also used to xref:component-versions.adoc[sort multiple versions of the same component]. - -```yaml -version: '5.6' -``` - -The value can contain letters, numbers, periods (`.`), underscores (`+_+`), and hyphens (`-`). -If the value starts with a number, enclose it within a set of single quote marks (`'`). - -.*Version value examples* -* 1 -* v2.0-beta -* rawhide - -If `display_version` isn't set, `version` is also used in the: - -* xref:navigation:index.adoc#component-menu[component navigation menu] -* xref:navigation:index.adoc#component-dropdown[component version selector] -* xref:navigation:index.adoc#page-dropdown[page version selector] - -Like with the name key, the version key isn't related, though it may be similar, to the xref:component-versions.adoc[name of the repository branch] where the component's source files are stored. -See xref:component-versions.adoc#setting-the-version-for-a-branch[Setting the version for a branch] for more examples and xref:component-versions.adoc#versionless-urls[Versionless components] to learn how to create a versionless component. - -[#prerelease-key] -=== `prerelease` - -The `prerelease` key is a marker that this version is considered prerelease. -xref:component-versions.adoc#prerelease-versions[Prerelease versions] are skipped when selecting the xref:component-versions.adoc#latest-version[latest version of a component] (unless all versions are prereleases, in which case the normal rules apply). - -```yaml -prerelease: true -``` - -The `prerelease` key is not set by default. - -[#display-version] -=== `display_version` - -To display a version in the UI that is different from the value specified in `<<version-key>>`, set the `display_version` key. - -```yaml -display_version: The Big One Dot 0 -``` - -This key is useful when you want the version displayed in your site's UI to contain a blank (empty) space. -(The <<version-key,version key>> can't contain spaces because it's used as a resource ID coordinate.) -The display version key is optional and strictly used for presentation in the UI. -It does not affect resource IDs, the version segment in the page URL, or how versions are sorted. - -.*Display version value examples* -* v2.0 Beta -* Rawhide -* '3.8 (EOL)' - -If the value starts with a number, enclose it within a set of single quote marks (`'`). - -[#start-page-key] -=== `start_page` - -By default, Antora looks for a file named [.path]_index.adoc_ in the ROOT module of a component. -It uses this page as the component's start page (e.g., _\https://example.org/component-name/2.5/index.html_). -If there isn't an [.path]_index.adoc_ file in the ROOT module, you must specify a file as the start page in the component descriptor. - -```yaml -start_page: getting-started:overview.adoc -``` - -The `start_page` key accepts a xref:page:page-id.adoc[resource ID] that points to an existing page in the component. - -.*Start page value examples* -* security:get-started.adoc -* ROOT:welcome.adoc -* org-governance:help.adoc - -If Antora can't find [.path]_index.adoc_ in a component's ROOT module and a start page isn't specified in the component descriptor, site visitors will be directed to a 404 page when navigating to that component from the xref:navigation:index.adoc#component-dropdown[component version selector] on any page. - -[#nav-key] -=== `nav` - -The `nav` key accepts a list of xref:navigation:filenames-and-locations.adoc[navigation files]. - -```yaml -nav: -- modules/ROOT/nav.adoc -- modules/module-three/nav.adoc -- modules/module-one/install-nav.adoc -``` - -Each xref:navigation:register-navigation-files.adoc[value specifies the path to a navigation file] (e.g., [.path]_modules/name-of-module/name-of-nav-file.adoc_). -The order the values are listed in dictates the order the contents of the navigation files are assembled in the site's xref:navigation:index.adoc#component-menu[component menu]. diff --git a/docs/modules/navigation/pages/index.adoc b/docs/modules/navigation/pages/index.adoc index 7af7909be..e1bdfece5 100644 --- a/docs/modules/navigation/pages/index.adoc +++ b/docs/modules/navigation/pages/index.adoc @@ -19,12 +19,7 @@ image::navigation-assembly.svg[Antora navigation assembly diagram showing the re Let's take a brief look at each of the numbered items in this diagram. -<<<<<<< HEAD === image:one.svg[,18,role=conum is-hidden-toc] Navigation files (Source) -======= -[#nav-file-source] -=== image:one.svg[One,30] Source: Navigation files ->>>>>>> 902fad7... align navigation pages with component version terms The navigation for a component version is described by xref:filenames-and-locations.adoc[at least one AsciiDoc file]. However, as seen in the diagram, you can have as many navigation files as you need. @@ -36,23 +31,14 @@ Documentation page links are created using the same cross referencing syntax use When you want the list contents of a navigation file to be published to a component version's page menu, you need to register the file in the appropriate component version descriptor file. -<<<<<<< HEAD === image:two.svg[,18,role=conum is-hidden-toc] Navigation registration (Source) -======= -[#register-source] -=== image:two.svg[Two,30] Source: Navigation enlistment ->>>>>>> 902fad7... align navigation pages with component version terms Navigation files are xref:register-navigation-files.adoc[registered in a component version descriptor file] under the `nav` key. List the navigation files in the order you want them to be displayed in when they're published to the component version page menu on your site. When you run Antora, it will only use the registered navigation files to create the component version page menu. [#component-menu] -<<<<<<< HEAD === image:three.svg[,18,role=conum is-hidden-toc] Component navigation menu (Site) -======= -=== image:three.svg[Three,30] Site: Component version page menu ->>>>>>> 902fad7... align navigation pages with component version terms Antora collects the contents of each registered navigation file, puts the contents in the order the files are listed under the `nav` key, and publishes a fully assembled menu of pages for the component version. The behavior and style of the component version page menu is dictated by the UI bundle specified in your playbook. @@ -91,7 +77,6 @@ image::page-version-selector.png[Screenshot of the page version selector dropdow * xref:list-structures.adoc[Navigation list structures: list item and title nesting, single list file, multi-list file] * xref:link-syntax-and-content.adoc[Navigation list item syntax: xrefs, URLs, text styles, images, icons, and more] //// - //* Navigation files and the AsciiDoc include directive //* Component navigation menu, home icon, and the index / start page //* Breadcrumbs -- GitLab From f0a96d55dc7593421ffd17861fcdc4a45ed8f14a Mon Sep 17 00:00:00 2001 From: Sarah White <sarah@opendevise.com> Date: Sun, 5 Apr 2020 17:58:52 -0600 Subject: [PATCH 39/39] minor copyedits and xref fixes --- docs/modules/ROOT/nav.adoc | 2 +- .../ROOT/pages/component-navigation.adoc | 2 - .../pages/component-version-descriptor.adoc | 4 +- .../pages/content-source-repositories.adoc | 3 +- .../content-source-versioning-methods.adoc | 23 ++-- .../pages/distributed-component-version.adoc | 31 ++++-- docs/modules/asciidoc/pages/embed-video.adoc | 2 +- .../asciidoc/pages/include-example.adoc | 2 +- docs/modules/asciidoc/pages/include-page.adoc | 100 ++++++++++-------- .../asciidoc/pages/include-partial.adoc | 5 +- docs/modules/page/nav.adoc | 4 +- docs/modules/page/pages/block-images.adoc | 4 +- docs/modules/page/pages/index.adoc | 11 +- docs/modules/page/pages/inline-images.adoc | 4 +- docs/modules/page/pages/page-id.adoc | 4 +- docs/modules/page/pages/resource-id.adoc | 4 +- .../playbook/pages/configure-asciidoc.adoc | 10 +- .../playbook/pages/playbook-schema.adoc | 4 +- 18 files changed, 116 insertions(+), 103 deletions(-) diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index 25f9d43a8..3a73a9b10 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -40,5 +40,5 @@ ** xref:component-start-page.adoc[Select a Start Page] ** xref:component-navigation.adoc[Assign Navigation Files to a Component Version] ** xref:how-component-versions-are-sorted.adoc[How Component Versions are Sorted] -** xref:environment-and-page-attributes.adoc[Built-in Page and Environment Attribute Reference] ** xref:distributed-component-version.adoc[Distributed Component Version] +** xref:environment-and-page-attributes.adoc[Built-in Page and Environment Attribute Reference] diff --git a/docs/modules/ROOT/pages/component-navigation.adoc b/docs/modules/ROOT/pages/component-navigation.adoc index 58fd015dd..be8a297b0 100644 --- a/docs/modules/ROOT/pages/component-navigation.adoc +++ b/docs/modules/ROOT/pages/component-navigation.adoc @@ -41,8 +41,6 @@ The order of the values dictates the order the contents of the navigation files == Learn more -Learn more about creating navigation lists and navigation files: - * xref:navigation:filenames-and-locations.adoc[Navigation filenames and locations] * xref:navigation:list-structures.adoc[Single and multiple list navigation files] * xref:navigation:link-syntax-and-content.adoc[Navigation link syntax and content formatting] diff --git a/docs/modules/ROOT/pages/component-version-descriptor.adoc b/docs/modules/ROOT/pages/component-version-descriptor.adoc index fe278b655..76eb35db3 100644 --- a/docs/modules/ROOT/pages/component-version-descriptor.adoc +++ b/docs/modules/ROOT/pages/component-version-descriptor.adoc @@ -6,14 +6,14 @@ . The presence of an [.path]_antora.yml_ file at a content source root signals to Antora that it should find a sibling [.path]_modules_ directory that contains the source files of a component version. . The [.path]_antora.yml_ file at a content source root provides the required and optional component version metadata that Antora assigns to the source files it collects from the sibling [.path]_modules_ directory. -[#validate-content-source-root-with-antora-yml] +[#locate-content-source-root-with-antora-yml] == Why is antora.yml stored at a content source root? //Why does Antora look for antora.yml at a content source root? //How does Antora use an antora.yml file to find a component version's source files? //A xref:playbook:index.adoc[playbook] tells Antora what xref:playbook:configure-content-sources.adoc[remote repositories and local content sources] it should fetch. Starting at each content source root, Antora looks for an [.path]_antora.yml_ file. -When it finds [.path]_antora.yml_, it searches for a xref:module-directories.adoc[sibling _modules_ directory] and considers all of the [.path]_modules_ directory's xref:standard-directories.adoc[subdirectories and files] to be part of a xref:component-version.adoc[component version]. +When it finds [.path]_antora.yml_, it searches for a xref:module-directories.adoc[sibling _modules_ directory] and considers all of its xref:standard-directories.adoc[subdirectories and files] to be part of a xref:component-version.adoc[component version]. If Antora doesn't find [.path]_antora.yml_ at a content source root, it doesn't look for a [.path]_modules_ directory or collect any files from that location. This minimizes the chances of Antora using server resources in an attempt to process source files that aren't part of a documentation site. diff --git a/docs/modules/ROOT/pages/content-source-repositories.adoc b/docs/modules/ROOT/pages/content-source-repositories.adoc index 816e7e463..e9a0bbd50 100644 --- a/docs/modules/ROOT/pages/content-source-repositories.adoc +++ b/docs/modules/ROOT/pages/content-source-repositories.adoc @@ -6,11 +6,12 @@ These source files are only retrieved and processed correctly if Antora can loca [#git-and-content-sources] == git repositories and content sources -The source files containing a site's content are stored in git repositories. +The source files containing a site's content are stored in one or more git repositories. These repositories can be remote, local, or a mix of both. In a playbook file, you'll enter several query parameters (git references and start paths) that 1. allow Antora to locate and connect to your content source repositories, and 2. provide Antora with the route criteria that leads to one or more unique <<content-source-root,content source roots>> within a git repository. //A [.term]*content source* is one or more routes--git references and start paths--that lead to unique <<content-source-root,content source roots>>. //Content sources are specified in an Antora playbook file. + But before configuring a site's playbook, you'll want to determine where to set up the content source roots in your repositories. // to be located and then set up the directories Antora requires. //to place your content source roots to beet up the required directories and sorted your content source files into them at each content source root. diff --git a/docs/modules/ROOT/pages/content-source-versioning-methods.adoc b/docs/modules/ROOT/pages/content-source-versioning-methods.adoc index 603fb7c9b..a5a8dd6c0 100644 --- a/docs/modules/ROOT/pages/content-source-versioning-methods.adoc +++ b/docs/modules/ROOT/pages/content-source-versioning-methods.adoc @@ -1,36 +1,35 @@ = Content Source Versioning Methods :page-aliases: component-versions.adoc -== Component versions and branches - -Although there isn't necessarily a relationship between version control repository branches or tags, as specified in the playbook, and component versions, relating these results in a simple, convenient, flexible, and easy to understand organization. +== Version content using branches -In this scheme, versions of a documentation component are stored in branches in a version control repository such as git. +In this scheme, each branch in a git repository stores a xref:component-version.adoc[version of a docs component] just like we use branches to store versions of a software project. The name of the branch itself doesn't matter. It's the xref:component-name-and-version.adoc#version-key[version key] in the xref:component-version-descriptor.adoc[component version descriptor] that determines the version. -== Version content using branches - -As with software, in this scheme we use branches to store different versions of the documentation. Branches are ideally suited for managing multiple versions of the same content. - -If we didn't use branches to specify versions, but instead used, for example, folders with trailing version numbers in a single branch, then we'd have to explicitly duplicate all the files in a documentation component for each version. +If we didn't use branches to specify versions, but instead used, for example, folders with trailing version numbers in a single branch, then we'd have to explicitly duplicate all the files in a docs component for each version. And we'd have no easy way to compare, manage, and merge different instances of a document. Branches handle this for us. -Creating a new branch is extremely cheap. You simply create a new branch from an existing reference in the repository, and the repository only stores what's changed since that branch point. == Version content using tags -== Version content using directories +Tags provide many of the same benefits of branches. +You can compare different instances of a file and the repository only stores what's changed since the previous tag point. + +The downside of tags is that, once released, you can't update them (unlike branches). +So if you find a typo, or need to add an example, you can't edit the content in a released tag. +You'll need to release a new tag, or use another versioning method in combination with tags, in order to publish your updates. +//== Version content using directories == Learn more // The list items IDs exist because they're the previous section IDs for sections that were originally in the aliased page, but have now become their own pages. * xref:component-name-and-version.adoc[Define a component name and version with antora.yml] -* [[version-sorting]]xref:how-component-versions-are-sorted.adoc[How are component versions sorted?] +* [[version-sorting]]xref:how-component-versions-are-sorted.adoc[How Antora sorts component versions] * [[versionless-urls]]xref:component-with-no-version.adoc[Define a component version with no version] diff --git a/docs/modules/ROOT/pages/distributed-component-version.adoc b/docs/modules/ROOT/pages/distributed-component-version.adoc index 34373a50a..335024d9d 100644 --- a/docs/modules/ROOT/pages/distributed-component-version.adoc +++ b/docs/modules/ROOT/pages/distributed-component-version.adoc @@ -1,20 +1,29 @@ -= Distributed Component Version += Distributed Component Versions -[#distributed] -== Distributed component version +While all of a component version's source files are often stored in a single repository, it isn't a requirement. +Antora can collect source files that belong to the same component version from multiple repositories. -While all of a docs component and its component versions`' source files can be stored in a single repository, it isn't a requirement. -Antora can collect a component version's source files from two, five, and even more repositories. -That means a few of a component version's modules can be stored in one repository, while the [.path]_examples_ family directory of another module is stored in a tutorial repository that's maintained by a training team, and then that same module's pages can be stored in [.path]_pages_ family directories across three different repositories. -When a docs component's source files are stored in multiple repositories, it's referred to as a [.term]*distributed component*. +== What's a distributed component version? + +When a component version's source files are stored in multiple repositories, it's referred to as a [.term]*distributed component version*. +// or, simply, a *distributed component*. + +A common use case of a distributed component version is when most of its source files are stored in one repository, but a number of examples ([.path]_examples_ family directory) and tutorials ([.path]_pages_ family directory) are stored in another repository managed by a training team. +Antora has no problem combining the source files from both storage locations into a single component version. This capability is provided by the simple, but-oh-so-powerful component version descriptor file, [.path]_antora.yml_. +== Managing antora.yml files and keys + Recall that an [.path]_antora.yml_ file specifies the component name and version of a component version. -If Antora discovers several [.path]_antora.yml_ files that specify an identical component name and version, that component version is said to be [.term]*distributed*. -All of the source files associated with these [.path]_antora.yml_ files are added to Antora's content catalog and included in a single component version. +If Antora discovers two or more [.path]_antora.yml_ files that specify an identical component name and version, it considers all of the files in the subsequent standard directory sets to belong to the same component version, even though the source files were collected from multiple locations. -When a component version is distributed, only one of its [.path]_antora.yml_ files should specify the optional configuration keys, such as `title` and `nav`, in addition to the required component `name` and `version`. +When the source files of a component version are distributed, only one of the [.path]_antora.yml_ files should specify the optional configuration keys, such as `title` and `nav`, in addition to the required component `name` and `version`. All of the other [.path]_antora.yml_ files that mark the locations of the component version's source files must only specify the component `name` and `version`. Conflicting or duplicate optional configuration keys may produce unpredictable results. -Antora will fail with an error if there is a content or navigation source file with an identical file name and stored in the same module in a distributed component. +== Managing modules and files + +Antora will fail with an error if it finds two or more source files with identical filenames that belong to the same family and module in the distributed component version. +This also occurs if Antora discovers a module has two or more navigation files with identical filenames. + +//== Playbook content source order diff --git a/docs/modules/asciidoc/pages/embed-video.adoc b/docs/modules/asciidoc/pages/embed-video.adoc index fa9af38f2..87938f1af 100644 --- a/docs/modules/asciidoc/pages/embed-video.adoc +++ b/docs/modules/asciidoc/pages/embed-video.adoc @@ -40,7 +40,7 @@ To embed a video hosted on YouTube or Vimeo, put the video's ID in the macro tar video::rPQoq7ThGAU[youtube] ---- -TIP: Insert animated GIFs with the xref:insert-image.adoc[image macro]. +TIP: Insert animated GIFs with the xref:page:images.adoc[image macro]. [discrete] ==== Asciidoctor resources diff --git a/docs/modules/asciidoc/pages/include-example.adoc b/docs/modules/asciidoc/pages/include-example.adoc index dc73163ac..c3f622237 100644 --- a/docs/modules/asciidoc/pages/include-example.adoc +++ b/docs/modules/asciidoc/pages/include-example.adoc @@ -9,7 +9,7 @@ Examples are saved in the xref:ROOT:examples-directory.adoc[_examples_ directory Typically, an example and the standard page it's used in are stored in the same module. However, regardless of an example's source module, it can be inserted into any standard page in your documentation site using the include directive and the example file's resource ID. -== Include directive structure for examples +== AsciiDoc include directive Let's break down the AsciiDoc syntax and resource ID coordinates you need to include an example into a page. diff --git a/docs/modules/asciidoc/pages/include-page.adoc b/docs/modules/asciidoc/pages/include-page.adoc index bab793c70..bcd6f4685 100644 --- a/docs/modules/asciidoc/pages/include-page.adoc +++ b/docs/modules/asciidoc/pages/include-page.adoc @@ -4,35 +4,33 @@ :url-tags: {url-adoc-manual}/#by-tagged-regions :url-leveloffset: {url-adoc-manual}/#include-partitioning -You can include another page or a portion of another page into the current page using the AsciiDoc include directive. - -== Overview - -In Antora, the AsciiDoc include directive has been configured to include pages from the content catalog. +In Antora, the AsciiDoc include directive has been configured to include another page or portion of a page into the current page. You can include a page from anywhere in the site, including pages from a different component version or module. +== AsciiDoc include directive + In the simplest form, the target can be a path relative to the current page: ---- -\include::./relative-page.adoc[<attrlist>] +\include::./relative-page-filename.adoc[<attrlist>] ---- -The target can also be a page ID. -The page ID ranges in scope from a page in the current module (starting from the root of the pages family): +The target can also be a the resource ID of a page. +The resource ID ranges in scope from a page in the current module: ---- -\include::page$page.adoc[<attrlist>] +\include::page$page-filename.adoc[<attrlist>] ---- -to a page in a topic in a module of different component version: +To a page in a different component version: ---- -\include::version@component:module:page$topic/page.adoc[<attrlist>] +\include::version@component:module:page-filename.adoc[<attrlist>] ---- Let's explore the syntax of the include directive in detail. -== Syntax Walkthrough +== Include a page using its resource ID . On a new line, enter the name of the directive followed by two colons. + @@ -41,66 +39,80 @@ Let's explore the syntax of the include directive in detail. *include::* ---- -. Next, enter the relative path or xref:page:page-id.adoc[resource ID] of the target page (i.e., page ID) in the target slot. - -Target as relative path:: +. Next, enter the xref:page:resource-id.adoc[resource ID] of the target page in the target slot. +The resource ID must include the `page$` family coordinate since the include directive can also be used to include files from other families. + --- -A relative path include is resolved from the current page (not the root of the pages family). -The relative path must be prefixed with `./`. +[subs=+quotes] +---- +\include::**version@component:module:page$page-filename.adoc**[] +---- +. Close the directive using a set of square brackets (`[]`). ++ [subs=+quotes] ---- -\include::**./relative-page.adoc**[] +\include::version@component:module:page$page-filename.adoc**[]** ---- -CAUTION: You may find that the relative path works without this prefix, but that could change in the future. +. The brackets may contain an optional list of attributes. +Include attributes are entered as key-value pairs separated by commas. ++ -- +[subs=+quotes] +---- +\include::version@component:module:page$page-filename.adoc[**tag=definition**] +---- -Target as resource ID:: -+ +All the attributes (e.g., `lines`, `tags`, `leveloffset`, `indent`) on the include directive are supported. -- -A resource ID include is resolved much like the xref:page-to-page-xref.adoc#same-module[target of an xref]. -There are two key differences: -. A relative path (normally the shortest form of a resource ID) is not, in fact, treated as a resource ID. -Instead, it's resolved from the directory of the current page. -. A resource ID must include the `page$` family segment since the include directive can also be used to include files from other families. -The presence of the family segment forces the target to be treated as a resource ID, specifically a page ID (e.g., `page$name-of-page.adoc`). +Antora supports filtering the lines of an include file by either line numbers using the `lines` attribute or tags using the `tag` or `tags` attributes. +Filtering by line numbers takes precedence. +See https://asciidoctor.org/docs/user-manual/#include-partial[the Asciidoctor documentation] for full details of the `lines` and `tag` or `tags` syntax. -Like in the xref macro, all other segments (component, version, and module) are optional and will assume the context of the current page. +== Include a page using a relative path +. On a new line, enter the name of the directive followed by two colons. ++ [subs=+quotes] ---- -\include::**version@component:module:page$topic/page.adoc**[] +*include::* ---- --- -. Close the directive using a set of square brackets (`[]`). +. Next, enter the relative path of the target page in the target slot. +A relative path include is resolved from the current page (not the root of the pages family). +The relative path must be prefixed with `./`. + -- [subs=+quotes] ---- -include::version@component:module:page$topic/page.adoc**[]** +\include::**./relative-page-filename.adoc**[] ---- -The brackets may contain an optional list of attributes (represented in the previous examples by `<attrlist>`). -Include attributes should be entered as key=value pairs separated by commas. +CAUTION: You may find that the relative path works without this prefix, but that could change in the future. +-- + +. Close the directive using a set of square brackets (`[]`). ++ +[subs=+quotes] +---- +\include::./relative-page-filename.adoc**[]** +---- +. The brackets may contain an optional list of attributes. +Include attributes are entered as key-value pairs separated by commas. ++ +-- [subs=+quotes] ---- -include::version@component:module:page$topic/page.adoc**[tag=definition]** +\include::./relative-page-filename.adoc[**tag=definition**] ---- All the attributes (e.g., `lines`, `tags`, `leveloffset`, `indent`) on the include directive are supported. -- -Antora supports filtering the lines of an include file by either line numbers using the `lines` attribute or tags using the `tag` or `tags` attributes. -Filtering by line numbers takes precedence. -See https://asciidoctor.org/docs/user-manual/#include-partial[the asciidoctor documentation] for full details of the `lines` and `tag` or `tags` syntax. - [#page-partial] -== The page-partial attribute +== page-partial attribute As Antora processes each page, it converts the contents of the file from AsciiDoc to HTML. (Within a component version, pages are typically processed in order by module and relative filename). @@ -126,10 +138,10 @@ asciidoc: ---- The `page-partial` attribute will no longer be set globally. -Now you *must* set the `page-partial` atttribute on any page you want to use in an include directive. +Now you *must* set the `page-partial` attribute on any page you want to use in an include directive. For example: -[source,asciidoc] +[source] ---- = Shared Page :page-partial: @@ -139,7 +151,7 @@ Page contents. With the `page-partial` attribute set, you can safely refer to that page using the include directive: -[source,asciidoc] +[source] ---- \include:shared-page.adoc[] ---- diff --git a/docs/modules/asciidoc/pages/include-partial.adoc b/docs/modules/asciidoc/pages/include-partial.adoc index 3a8096880..0b617b26d 100644 --- a/docs/modules/asciidoc/pages/include-partial.adoc +++ b/docs/modules/asciidoc/pages/include-partial.adoc @@ -7,7 +7,7 @@ //Typically, a partial and the standard page it's used in are stored in the same module. A partial can be inserted into any page in your documentation site using the include directive and the partial file's resource ID. -== Include directive structure for partials +== AsciiDoc include directive Let's break down the AsciiDoc syntax and resource ID coordinates you need to include a partial into a page. @@ -23,7 +23,6 @@ Let's break down the AsciiDoc syntax and resource ID coordinates you need to inc ---- . Enter the xref:page:resource-id.adoc[resource ID] of the partial file. -A partial's resource coordinates are determined just like the xref:page-to-page-xref.adoc#same-module[coordinates in an xref]. + [subs=+quotes] ---- @@ -39,7 +38,7 @@ A partial's resource coordinates are determined just like the xref:page-to-page- . Close the directive with a set of square brackets (`+[]+`). The brackets can contain an optional list of attributes such as `leveloffset`, `lines`, and `tags`. -The attributes should be entered as key=value pairs separated by commas. +The attributes should be entered as key-value pairs separated by commas. + [subs=+quotes] ---- diff --git a/docs/modules/page/nav.adoc b/docs/modules/page/nav.adoc index 12585530f..8a8eb2b20 100644 --- a/docs/modules/page/nav.adoc +++ b/docs/modules/page/nav.adoc @@ -1,5 +1,5 @@ .Create & Manage Pages -* xref:index.adoc[Add Pages to a Component Version] +* xref:index.adoc[Pages] ** xref:create-standard-page.adoc[Name and Set Up a Page] ** xref:start-page.adoc[Create a Start Page] * xref:page-id.adoc[Page IDs and Cross References] @@ -14,9 +14,9 @@ ** xref:asciidoc:include-partial.adoc[Include a Partial] //* xref:examples-and-source-snippets.adoc[Source Code and Example Snippets] * xref:asciidoc:include-example.adoc[Include an Example] -* xref:asciidoc:include-page.adoc[Include a Page] * xref:images.adoc[Images] ** xref:block-images.adoc[Add Block Images] ** xref:inline-images.adoc[Add Inline Images] ** xref:image-resource-id-examples.adoc[Image Resource ID Examples] * xref:asciidoc:link-attachment.adoc[Link to an Attachment] +* xref:asciidoc:include-page.adoc[Include a Page] diff --git a/docs/modules/page/pages/block-images.adoc b/docs/modules/page/pages/block-images.adoc index afd548fb6..154befced 100644 --- a/docs/modules/page/pages/block-images.adoc +++ b/docs/modules/page/pages/block-images.adoc @@ -25,7 +25,7 @@ TIP: When referencing an image, you don't need to include the `image$` family co It's applied automatically at runtime when a resource ID is entered into an AsciiDoc image macro. [#insert-block-image] -== Insert a block image +== Embed a block image The example below assumes that the image and page belong to the same component version and module. Only the xref:resource-id.adoc#id-resource[resource coordinate] of the xref:resource-id.adoc#target-resource[target resource file] needs to be entered in the resource ID when the xref:resource-id.adoc#current-page[current page] and target file belong to the same component version and module. @@ -40,7 +40,7 @@ This is a paragraph. **image::** ---- -. Enter the resource ID of the image file directly after the two colons. +. Enter the resource ID of the target image file directly after the two colons. + [subs=+quotes] ---- diff --git a/docs/modules/page/pages/index.adoc b/docs/modules/page/pages/index.adoc index 6fa153f41..8d2620599 100644 --- a/docs/modules/page/pages/index.adoc +++ b/docs/modules/page/pages/index.adoc @@ -1,12 +1,12 @@ -= Add Pages to a Component Version += Pages == Source page to site page -Antora automatically generates one HTML site page for each AsciiDoc source file assigned to the pages family. +Antora automatically generates one HTML site page for each source file assigned to the pages family. Another way to think about this: one AsciiDoc page file in equals one HTML page out. [#standard-asciidoc-page] -== Standard AsciiDoc source pages +== Standard source pages Page source files are plain text files marked up with the xref:asciidoc:asciidoc.adoc[AsciiDoc syntax] and saved with the file extension `.adoc`. They're stored in a xref:ROOT:pages-directory.adoc[_pages_ family directory]. @@ -19,8 +19,3 @@ You can use just a little AsciiDoc syntax to mark up your pages, or you can expl Antora automatically publishes all of the standard source pages to your site, but if you want to create page-to-page links in the content, you'll need to learn about xref:page-id.adoc[Antora's page IDs] and how to create xref:page-id.adoc#whats-a-cross-reference[cross references]. You'll also use cross references and page IDs to build and organize your site's xref:navigation:index.adoc[component version page menus]. //If you don't want to include a page in a component menu, visitors will still be able to find it using search tools and through links to it on other pages, and in some scenarios, through dropdown menus such as the page version selector. - -== Learn more - -* xref:page-id.adoc[Page IDs and cross references] -* xref:create-standard-page.adoc[Name and set up a page] diff --git a/docs/modules/page/pages/inline-images.adoc b/docs/modules/page/pages/inline-images.adoc index 828606d51..c14a74d46 100644 --- a/docs/modules/page/pages/inline-images.adoc +++ b/docs/modules/page/pages/inline-images.adoc @@ -22,7 +22,7 @@ TIP: When referencing an image, you don't need to include the `image$` family co It's applied automatically at runtime when a resource ID is entered into an AsciiDoc image macro. [#insert-inline-image] -== Insert an inline image into a page +== Embed an inline image The example below assumes that the image and page belong to the same component version and module. Only the xref:resource-id.adoc#id-resource[resource coordinate] of the xref:resource-id.adoc#target-resource[target resource file] needs to be entered in the resource ID when the xref:resource-id.adoc#current-page[current page] and target resource belong to the same component version and module. @@ -34,7 +34,7 @@ Only the xref:resource-id.adoc#id-resource[resource coordinate] of the xref:reso Here's an inline *image:* ---- -. Enter the resource ID of the image file directly after the colon. +. Enter the resource ID of the target image file directly after the colon. + [subs=+quotes] ---- diff --git a/docs/modules/page/pages/page-id.adoc b/docs/modules/page/pages/page-id.adoc index acbe4f7a9..57081b1b2 100644 --- a/docs/modules/page/pages/page-id.adoc +++ b/docs/modules/page/pages/page-id.adoc @@ -16,12 +16,12 @@ A page ID is most often used as a target in an AsciiDoc xref macro, but it can a Antora constructs a page ID for a page source file from the key-value pairs specified in a xref:ROOT:component-version-descriptor.adoc[component version descriptor] and the xref:ROOT:standard-directories.adoc[standard directory set]. Using this information, each page can be cross referenced using a sequence of page ID coordinates. -include::partial$antora-id.adoc[tags=*;!resource] - The coordinates are organized into the standard sequence shown below. image::page-id-anatomy-diagram.svg[Page ID anatomy,600] +include::partial$antora-id.adoc[tags=*;!resource] + A page ID is used in an <<xref-macro,AsciiDoc xref macro>> to create a link from one page to another page. They're also used to create the links in a xref:navigation:link-syntax-and-content.adoc[component version's navigation files]. diff --git a/docs/modules/page/pages/resource-id.adoc b/docs/modules/page/pages/resource-id.adoc index 5d5496f41..f321776b9 100644 --- a/docs/modules/page/pages/resource-id.adoc +++ b/docs/modules/page/pages/resource-id.adoc @@ -23,12 +23,12 @@ In Antora, a resource is referenced using an AsciiDoc include directive, link ma Antora constructs a resource ID for a source file from the key-value pairs specified in a xref:ROOT:component-version-descriptor.adoc[component version descriptor] and the xref:ROOT:standard-directories.adoc[standard directory set]. Using this information, a resource can be referenced from any page, partial, or example in your site using a unique and reliable set of resource ID coordinates. -include::partial$antora-id.adoc[tags=*;!page] - A fully qualified resource ID with its coordinates organized in the standard sequence is shown below. version@component:module:family$resource.ext +include::partial$antora-id.adoc[tags=*;!page] + How many resource ID coordinates you need to specify when referencing a resource depends on the component version and module of the <<current-page,current page>> in relation to the <<target-resource,target resource>>. [#requires-family-coordinate] diff --git a/docs/modules/playbook/pages/configure-asciidoc.adoc b/docs/modules/playbook/pages/configure-asciidoc.adoc index 50672ceff..2d64bfafd 100644 --- a/docs/modules/playbook/pages/configure-asciidoc.adoc +++ b/docs/modules/playbook/pages/configure-asciidoc.adoc @@ -13,10 +13,10 @@ On this page, you'll learn: [#attrs] == AsciiDoc attributes -Built-in AsciiDoc attributes, user-defined AsciiDoc attributes, and `page-` attributes can be declared in a site's playbook file and are referred to as [.term]*site-scoped attributes*. +Built-in AsciiDoc attributes, user-defined AsciiDoc attributes, and `page-` attributes can be declared in a site's playbook file and are referred to as [.term]*site attributes*. These attributes are nested under the `asciidoc` and `attributes` category keys in the playbook. -.Declaring site-scoped AsciiDoc attributes +.Declaring site attributes [source,yaml] ---- asciidoc: @@ -26,9 +26,9 @@ asciidoc: table-caption: ~ ---- -Site-scoped attributes are applied and available to all of a site's pages according to the xref:page:site-scoped-attributes.adoc#assign-precedence[attribute precedence rules]. -See xref:page:site-scoped-attributes.adoc[Site-scoped attributes] to learn how to set, assign, and unset attributes in the playbook in more detail. -Also, attributes can be xref:page:component-scoped-attributes.adoc[declared by component version] and may override site-scoped attributes depending on the the attribute's assigned precedence. +Site attributes are applied and available to all of a site's pages according to the xref:site-attributes.adoc#assign-precedence[attribute precedence rules]. +See xref:site-attributes.adoc[Site attributes] to learn how to set, assign, and unset attributes in the playbook in more detail. +Also, attributes can be xref:ROOT:component-attributes.adoc[declared by component version] and may override site attributes depending on the the attribute's assigned precedence. [#extensions] == Asciidoctor extensions diff --git a/docs/modules/playbook/pages/playbook-schema.adoc b/docs/modules/playbook/pages/playbook-schema.adoc index ec06bd5da..ef8ac853c 100644 --- a/docs/modules/playbook/pages/playbook-schema.adoc +++ b/docs/modules/playbook/pages/playbook-schema.adoc @@ -199,8 +199,8 @@ These document attributes are applied and made available to all of a site's page Learn more: -* xref:configure-asciidoc.adoc#attrs[Declare site-scoped AsciiDoc attributes] -* xref:page:site-scoped-attributes.adoc#assign-precedence[Allow component-scoped and page attributes to override site-scoped attributes] +* xref:configure-asciidoc.adoc#attrs[Declare AsciiDoc site attributes] +* xref:site-attributes.adoc#assign-precedence[Allow component version and page attributes to override site attributes] [#asciidoc-extensions-key] === extensions -- GitLab