Organize document URLs by category and collection with compact navigation
Verify and deploy Tabularium / verify-and-deploy (pull_request) Has been cancelled
Verify and deploy Tabularium / verify-and-deploy (pull_request) Has been cancelled
This commit is contained in:
@@ -24,14 +24,16 @@ import { headingsFor } from "@/lib/navigation";
|
||||
|
||||
type Props = { doc: Doc; docs: DocLink[] };
|
||||
export const getStaticPaths: GetStaticPaths = async () => ({
|
||||
paths: (await listDocs()).map(({ slug }) => ({ params: { slug: slug.split("/") } })),
|
||||
paths: (await listDocs()).flatMap(({ slug, sourceSlug }) => [...new Set([slug, sourceSlug])].map((value) => ({ params: { slug: value.split("/") } }))),
|
||||
fallback: false,
|
||||
});
|
||||
export const getStaticProps: GetStaticProps<Props> = async ({ params }) => {
|
||||
const slug = Array.isArray(params?.slug) ? params.slug.join("/") : params?.slug;
|
||||
if (typeof slug !== "string") return { notFound: true };
|
||||
const docs = await listDocs();
|
||||
if (!docs.some((d) => d.slug === slug)) return { notFound: true };
|
||||
const match = docs.find((d) => d.slug === slug || d.sourceSlug === slug);
|
||||
if (!match) return { notFound: true };
|
||||
if (slug !== match.slug) return { redirect: { destination: `/docs/${match.slug}`, permanent: true } };
|
||||
return { props: { doc: await readDoc(slug), docs } };
|
||||
};
|
||||
function textOf(value: ReactNode): string {
|
||||
@@ -102,6 +104,17 @@ export default function DocPage({
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm]}
|
||||
components={{
|
||||
a: ({ href, children }) => {
|
||||
if (!href) return <a>{children}</a>;
|
||||
let target = href;
|
||||
if (!/^(?:[a-z]+:|\/\/|#)/i.test(href)) {
|
||||
const resolved = new URL(href, `https://docs.local/docs/${doc.sourceSlug}`);
|
||||
const source = decodeURIComponent(resolved.pathname).replace(/^\/docs\//, "").replace(/\.md$/, "");
|
||||
const linked = docs.find((d) => d.sourceSlug === source || d.slug === source);
|
||||
if (linked) target = `/docs/${linked.slug}${resolved.search}${resolved.hash}`;
|
||||
}
|
||||
return <a href={target}>{children}</a>;
|
||||
},
|
||||
p: ({ children, node }) =>
|
||||
node?.children.some(
|
||||
(child) =>
|
||||
@@ -201,7 +214,7 @@ export default function DocPage({
|
||||
<div className="article-end">
|
||||
|
||||
<a
|
||||
href={`https://gitea.entroia.com/Zayden-Jung/endorphin-tabularium-docs/src/branch/main/content/docs/${doc.slug}.md`}
|
||||
href={`https://gitea.entroia.com/Zayden-Jung/endorphin-tabularium-docs/src/branch/main/content/docs/${doc.sourceSlug}.md`}
|
||||
>
|
||||
查看文档源码 ↗
|
||||
</a>
|
||||
@@ -213,10 +226,7 @@ export default function DocPage({
|
||||
<strong>{siblings[index - 1].title}</strong>
|
||||
</Link>
|
||||
) : (
|
||||
<Link href="/">
|
||||
<small>← 返回</small>
|
||||
<strong>文档概览</strong>
|
||||
</Link>
|
||||
<span />
|
||||
)}
|
||||
{index < siblings.length - 1 && (
|
||||
<Link
|
||||
|
||||
Reference in New Issue
Block a user