diff --git a/src/components/navigation/sidebars/nav/RootNav.astro b/src/components/navigation/sidebars/nav/RootNav.astro index f623d85..b10a087 100644 --- a/src/components/navigation/sidebars/nav/RootNav.astro +++ b/src/components/navigation/sidebars/nav/RootNav.astro @@ -6,10 +6,10 @@ export interface Props { } import { getVersionsData } from "@config/io/generateTypeData"; +import { getGuideCollection } from "@config/io/guides"; import type { TreeEntry } from "./Tree.astro"; import Tree from "./Tree.astro"; import Link from "./Link.astro"; -import { getCollection } from "astro:content"; const versions = await getVersionsData(); const versionName = Astro.params.version; @@ -17,7 +17,7 @@ const modules = versions.versions.find(version => version.name === versionName)? const currentPath = Astro.url.pathname.split('/').filter(s => s !== ""); -const guidePages = await getCollection("guide"); +const guidePages = await getGuideCollection(versionName ?? ""); interface NavTree { title: string, diff --git a/src/config/io/guides.ts b/src/config/io/guides.ts new file mode 100644 index 0000000..c6f6458 --- /dev/null +++ b/src/config/io/guides.ts @@ -0,0 +1,35 @@ +import { type CollectionEntry, getCollection } from "astro:content"; +import { getVersionsData } from "@config/io/generateTypeData"; + +// load latest version of each page for version +async function buildGuideCollection(version: string): Promise[]> { + const { versions } = await getVersionsData(); + const guidePages = await getCollection("guide"); + + const pages: { [key: string]: CollectionEntry<'guide'> } = {}; + + for (const currentVersion of versions.toReversed()) { + for (const page of guidePages) { + let [guideVersion, id] = page.id.split('/'); + guideVersion = guideVersion.replaceAll('_', '.'); + id = id ?? "index"; + if (guideVersion !== currentVersion.name) continue; + + pages[id] = { ...page, id }; + } + + if (currentVersion.name === version) break; + } + + return Object.values(pages); +} + +let guideCollections: { [key: string]: Promise[]> } = {}; + +export async function getGuideCollection(version: string): Promise[]> { + if (!(version in guideCollections)) { + guideCollections[version] = buildGuideCollection(version); + } + + return guideCollections[version]; +} diff --git a/src/content.config.ts b/src/content.config.ts index 6747c66..dbf0931 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -2,7 +2,7 @@ import { defineCollection, z } from "astro:content"; import { glob } from "astro/loaders"; const guide = defineCollection({ - loader: glob({ pattern: "**/*", base: "src/guide" }), + loader: glob({ pattern: "**/*.md", base: "src/guide" }), schema: z.object({ title: z.string(), index: z.number(), diff --git a/src/guide/distribution.mdx b/src/guide/v0_1_0/distribution.mdx similarity index 100% rename from src/guide/distribution.mdx rename to src/guide/v0_1_0/distribution.mdx diff --git a/src/guide/faq.md b/src/guide/v0_1_0/faq.md similarity index 100% rename from src/guide/faq.md rename to src/guide/v0_1_0/faq.md diff --git a/src/guide/index.mdx b/src/guide/v0_1_0/index.md similarity index 100% rename from src/guide/index.mdx rename to src/guide/v0_1_0/index.md diff --git a/src/guide/install-setup.md b/src/guide/v0_1_0/install-setup.md similarity index 100% rename from src/guide/install-setup.md rename to src/guide/v0_1_0/install-setup.md diff --git a/src/guide/introduction.md b/src/guide/v0_1_0/introduction.md similarity index 100% rename from src/guide/introduction.md rename to src/guide/v0_1_0/introduction.md diff --git a/src/guide/v0_1_0/lists-models.mdx b/src/guide/v0_1_0/lists-models.mdx new file mode 100644 index 0000000..79dfc84 --- /dev/null +++ b/src/guide/v0_1_0/lists-models.mdx @@ -0,0 +1,4 @@ +--- +title: "Lists and Models" +index: 2 +--- diff --git a/src/guide/qml-language.md b/src/guide/v0_1_0/qml-language.md similarity index 100% rename from src/guide/qml-language.md rename to src/guide/v0_1_0/qml-language.md diff --git a/src/guide/size-position.md b/src/guide/v0_1_0/size-position.md similarity index 100% rename from src/guide/size-position.md rename to src/guide/v0_1_0/size-position.md diff --git a/src/pages/docs/[version]/guide/[...id].astro b/src/pages/docs/[version]/guide/[...id].astro index 2e9239f..2d195ed 100644 --- a/src/pages/docs/[version]/guide/[...id].astro +++ b/src/pages/docs/[version]/guide/[...id].astro @@ -1,19 +1,24 @@ --- import GuideLayout from "@layouts/GuideLayout.astro"; import { getVersionsData } from "@config/io/generateTypeData"; +import { getGuideCollection } from "@config/io/guides"; import { processMarkdown } from "@config/io/markdown"; -import { getCollection, render } from "astro:content"; +import { render } from "astro:content"; export async function getStaticPaths() { const { versions } = await getVersionsData(); - const guidePages = await getCollection("guide"); - // versioned guides unhandled for now - return versions.flatMap(version => guidePages.map(page => ({ - params: { version: version.name, id: page.id == "index" ? "/" : page.id }, - props: { version, page }, - }))); + let pages = await Promise.all(versions.map(async version => { + const pages = await getGuideCollection(version.name); + + return pages.map(page => ({ + params: { version: version.name, id: page.id === "index" ? "/" : page.id }, + props: { version, page }, + })); + })); + + return pages.flat(); } const { version, page } = Astro.props;