Skip to content

Commit 8866188

Browse files
committed
Add "directory" versioning scheme, which permits versioned docs in one build.
Usage: * Set `extra.version.provider: directory` in `mkdocs.yml`. * Place versioned docs in subdirectories named after the version, e.g. `/v1.1/`, `/v1.2/`. * Create a `.meta.yml` file in each version directory with version metadata, e.g.: ```yaml version: v1.2 ``` * At the top level, create a `versions.json` file listing available versions, e.g.: ```json [ {"version": "v1.2", title: "v1.2", "alias": "latest"}, {"version": "v1.1", title: "v1.1"} ] ``` Signed-off-by: Evan Anderson <[email protected]>
1 parent 97e275c commit 8866188

File tree

4 files changed

+49
-15
lines changed

4 files changed

+49
-15
lines changed

src/templates/assets/javascripts/_/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ export type Translations =
8181
* Versioning
8282
*/
8383
export interface Versioning {
84-
provider: "mike" /* Version provider */
84+
provider: "mike" | "directory" /* Version provider */
8585
default?: string | string[] /* Default version */
8686
alias?: boolean /* Show alias */
87+
declared_version: string /* Version info from multi-version builds */
8788
}
8889

8990
/**

src/templates/assets/javascripts/bundle.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ if (feature("navigation.instant"))
154154
.subscribe(document$)
155155

156156
/* Set up version selector */
157-
if (config.version?.provider === "mike")
157+
if (config.version?.provider != undefined)
158158
setupVersionSelector({ document$ })
159159

160160
/* Always close drawer and search on navigation */

src/templates/assets/javascripts/integrations/version/index.ts

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,13 @@ export function setupVersionSelector(
8282
)
8383

8484
/* Determine current version */
85+
let [, current] = config.base.match(/([^/]+)\/?$/)!
86+
if (config.version?.provider === "directory") {
87+
current = config.version?.declared_version
88+
}
8589
const current$ = versions$
8690
.pipe(
8791
map(versions => {
88-
const [, current] = config.base.match(/([^/]+)\/?$/)!
8992
return versions.find(({ version, aliases }) => (
9093
version === current || aliases.includes(current)
9194
)) || versions[0]
@@ -95,10 +98,15 @@ export function setupVersionSelector(
9598
/* Intercept inter-version navigation */
9699
versions$
97100
.pipe(
98-
map(versions => new Map(versions.map(version => [
99-
`${new URL(`../${version.version}/`, config.base)}`,
100-
version
101-
]))),
101+
map(versions => new Map(versions.map(version => {
102+
let versionPath = `../${version.version}/`
103+
if (config.version?.provider === "directory") {
104+
versionPath = `./${version.version}/`
105+
}
106+
return [
107+
`${new URL(versionPath, config.base)}`,
108+
version
109+
]}))),
102110
switchMap(urls => fromEvent<MouseEvent>(document.body, "click")
103111
.pipe(
104112
filter(ev => !ev.metaKey && !ev.ctrlKey),
@@ -129,16 +137,35 @@ export function setupVersionSelector(
129137
}
130138
return EMPTY
131139
}),
132-
switchMap(selectedVersionBaseURL => {
133-
return fetchSitemap(selectedVersionBaseURL).pipe(
140+
withLatestFrom(current$),
141+
switchMap(([selectedVersionBaseURL, current]) => {
142+
let sitemapBase = selectedVersionBaseURL
143+
let currentBase = config.base
144+
if (config.version?.provider === "directory") {
145+
sitemapBase = new URL(config.base)
146+
currentBase = `${new URL(current.version, config.base)}/`
147+
}
148+
return fetchSitemap(sitemapBase).pipe(
134149
map(
135-
sitemap =>
136-
selectedVersionCorrespondingURL({
150+
sitemap => {
151+
if (config.version?.provider === "directory") {
152+
// "directory" provider will have all the versions in the same sitemap;
153+
// filter the sitemap to only URLs that are in the selected version.
154+
const filteredSitemap: typeof sitemap = new Map()
155+
for (const [url, links] of sitemap) {
156+
if (new URL(url).pathname.startsWith(selectedVersionBaseURL.pathname)) {
157+
filteredSitemap.set(url, links)
158+
}
159+
}
160+
sitemap = filteredSitemap
161+
}
162+
return selectedVersionCorrespondingURL({
137163
selectedVersionSitemap: sitemap,
138164
selectedVersionBaseURL,
139165
currentLocation: getLocation(),
140-
currentBaseURL: config.base
141-
}) ?? selectedVersionBaseURL,
166+
currentBaseURL: currentBase
167+
}) ?? selectedVersionBaseURL
168+
},
142169
),
143170
)
144171
})

src/templates/base.html

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,15 @@
394394

395395
<!-- Versioning -->
396396
{%- if config.extra.version -%}
397+
{%- if config.extra.version.provider == "mike" -%}
397398
{%- set mike = config.plugins.mike -%}
398-
{%- if not mike or mike.config.version_selector -%}
399-
{%- set _.version = config.extra.version -%}
399+
{%- if not mike or mike.config.version_selector -%}
400+
{%- set _.version = config.extra.version -%}
401+
{%- endif -%}
402+
{%- elif config.extra.version.provider == "directory" -%}
403+
{%- if page and (page.meta.version) -%}
404+
{%- set _.version = {"provider":"directory", "declared_version": page.meta.version | string} -%}
405+
{%- endif -%}
400406
{%- endif -%}
401407
{%- endif -%}
402408

0 commit comments

Comments
 (0)