diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 665556f01..ecd581485 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -44,6 +44,8 @@ jobs: run: npm ci - name: Build + env: + DOCS_SITE_BASE_PATH: /docs run: npm run docs:build - name: Smoke generated site diff --git a/scripts/docs-site/assets.mjs b/scripts/docs-site/assets.mjs index fe38c5f0c..5bd981901 100644 --- a/scripts/docs-site/assets.mjs +++ b/scripts/docs-site/assets.mjs @@ -17,8 +17,9 @@ const root=document.documentElement;const saved=localStorage.getItem("theme");if const sidebar=document.querySelector(".sidebar");document.querySelector("[data-nav-toggle]")?.addEventListener("click",()=>sidebar?.classList.toggle("open"));document.querySelectorAll(".sidebar a").forEach(a=>a.addEventListener("click",()=>sidebar?.classList.remove("open"))); document.querySelector("[data-locale]")?.addEventListener("change",e=>{const url=e.target.selectedOptions[0]?.dataset.url;if(url)location.href=url}); const modal=document.querySelector(".search-modal");const input=document.querySelector("[data-search-input]");const results=document.querySelector("[data-search-results]");let pagefindReady; -function openSearch(){modal?.classList.add("open");setTimeout(()=>input?.focus(),0);pagefindReady ||= import("/pagefind/pagefind.js").then(m=>m.init?.().then?.(()=>m)??m)} +function withBase(url){const base=window.OPENCLAW_DOCS_BASE||"";return url.startsWith("/")?base+url:url} +function openSearch(){modal?.classList.add("open");setTimeout(()=>input?.focus(),0);pagefindReady ||= import(withBase("/pagefind/pagefind.js")).then(m=>m.init?.().then?.(()=>m)??m)} document.querySelectorAll("[data-search-open]").forEach(b=>b.addEventListener("click",openSearch));document.querySelector("[data-search-close]")?.addEventListener("click",()=>modal?.classList.remove("open"));modal?.addEventListener("click",e=>{if(e.target===modal)modal.classList.remove("open")});addEventListener("keydown",e=>{if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k"){e.preventDefault();openSearch()}if(e.key==="Escape")modal?.classList.remove("open")}); -let seq=0;input?.addEventListener("input",async e=>{const q=e.target.value.trim();const id=++seq;if(!q){results.innerHTML="";return}results.innerHTML="
Searching...
";const pf=await pagefindReady;if(id!==seq)return;const search=await pf.search(q);const items=await Promise.all(search.results.slice(0,12).map(r=>r.data()));if(id!==seq)return;results.innerHTML=items.length?items.map(item=>''+item.meta.title+''+item.excerpt+'
').join(""):"No results.
"}); +let seq=0;input?.addEventListener("input",async e=>{const q=e.target.value.trim();const id=++seq;if(!q){results.innerHTML="";return}results.innerHTML="Searching...
";const pf=await pagefindReady;if(id!==seq)return;const search=await pf.search(q);const items=await Promise.all(search.results.slice(0,12).map(r=>r.data()));if(id!==seq)return;results.innerHTML=items.length?items.map(item=>''+item.meta.title+''+item.excerpt+'
').join(""):"No results.
"}); `; } diff --git a/scripts/docs-site/build.mjs b/scripts/docs-site/build.mjs index e6a6ca329..ab7da76f0 100644 --- a/scripts/docs-site/build.mjs +++ b/scripts/docs-site/build.mjs @@ -12,6 +12,7 @@ const docsDir = path.join(root, "docs"); const outDir = path.join(root, "dist", "docs-site"); const config = JSON.parse(fs.readFileSync(path.join(docsDir, "docs.json"), "utf8")); const md = createMarkdownRenderer(); +const basePath = normalizeBasePath(process.env.DOCS_SITE_BASE_PATH ?? ""); fs.rmSync(outDir, { recursive: true, force: true }); fs.mkdirSync(outDir, { recursive: true }); @@ -114,9 +115,9 @@ function writePage(page) { const activeTab = activeTabTitle(nav, page.slug); const prev = activeIndex > 0 ? flat[activeIndex - 1] : null; const next = activeIndex >= 0 && activeIndex < flat.length - 1 ? flat[activeIndex + 1] : null; - const html = localizeLinks(renderMdxish(page.body, md), page.locale); + const html = rewriteInternalUrls(renderMdxish(page.body, md), page.locale); const toc = tableOfContents(html); - const outPath = path.join(outDir, pageUrl(page).replace(/^\//, ""), "index.html"); + const outPath = path.join(outDir, pageRoute(page).replace(/^\//, ""), "index.html"); fs.mkdirSync(path.dirname(outPath), { recursive: true }); fs.writeFileSync(outPath, layout({ page, nav, activeTab, html, toc, prev, next }), "utf8"); } @@ -132,9 +133,9 @@ function layout({ page, nav, activeTab, html, toc, prev, next }) {