diff --git a/scripts/docs-site/assets.mjs b/scripts/docs-site/assets.mjs index 9fff5ad41..6de0c7b83 100644 --- a/scripts/docs-site/assets.mjs +++ b/scripts/docs-site/assets.mjs @@ -48,7 +48,9 @@ async function initMermaid(force=false){const blocks=[...document.querySelectorA function showCopyFeedback(control,ok){if(!control)return;if(control.matches("[data-code-copy]")||control.matches("[data-chat-copy]")||control.matches("[data-heading-anchor]")){control.dataset.copyState=ok?"copied":"failed";const label=control.dataset.copyLabel||control.getAttribute("aria-label")||"Copy";control.dataset.copyLabel=label;control.setAttribute("aria-label",ok?"Copied":"Copy failed");clearTimeout(control._copyStateTimer);control._copyStateTimer=setTimeout(()=>{delete control.dataset.copyState;control.setAttribute("aria-label",label)},1300);return}const old=control.textContent;control.textContent=ok?"Copied":"Copy failed";setTimeout(()=>control.textContent=old||"Copy",1300)} async function copyText(text,control){try{if(!String(text||"").trim())throw new Error("Nothing to copy");if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(text);else{const area=document.createElement("textarea");area.value=text;area.setAttribute("readonly","");area.style.position="fixed";area.style.opacity="0";document.body.appendChild(area);area.select();document.execCommand("copy");area.remove()}showCopyFeedback(control,true);return true}catch{showCopyFeedback(control,false);return false}} function codeTextForCopy(block){const lines=[...block?.querySelectorAll(".code-line")||[]];if(lines.length)return lines.map(line=>line.textContent).join("\\n");return block?.querySelector("code")?.textContent||""} -function handleDocsControlClick(e){const copyCode=e.target.closest("[data-code-copy]");if(copyCode){copyText(codeTextForCopy(copyCode.closest(".oc-code")),copyCode);return true}const copyPrompt=e.target.closest("[data-prompt-copy]");if(copyPrompt){const prompt=copyPrompt.closest(".oc-prompt")?.textContent?.replace(/Copy\\s*$/,"").trim()||"";copyText(prompt,copyPrompt);return true}const copyPage=e.target.closest("[data-copy-page]");if(copyPage){const url=copyPage.closest("[data-page-tools]")?.dataset.pageUrl||location.href;copyText(url,copyPage);return true}const headingAnchor=e.target.closest("[data-heading-anchor]");if(headingAnchor){const url=new URL(location.href);url.hash=headingAnchor.dataset.headingAnchor||"";copyText(url.href,headingAnchor);return true}const feedback=e.target.closest("[data-feedback-value]");if(feedback){const result=feedback.closest(".page-feedback")?.querySelector("[data-feedback-result]");if(result)result.value=feedback.dataset.feedbackValue==="yes"?"Thanks.":"Noted.";return true}return false} +function pageMarkdownForCopy(control){const source=control.closest(".article")?.querySelector("[data-page-markdown]");if(!source)return"";try{return JSON.parse(source.textContent||"\"\"")}catch{return source.textContent||""}} +function copyPageMarkdown(control){return copyText(pageMarkdownForCopy(control),control)} +function handleDocsControlClick(e){const copyCode=e.target.closest("[data-code-copy]");if(copyCode){copyText(codeTextForCopy(copyCode.closest(".oc-code")),copyCode);return true}const copyPrompt=e.target.closest("[data-prompt-copy]");if(copyPrompt){const prompt=copyPrompt.closest(".oc-prompt")?.textContent?.replace(/Copy\\s*$/,"").trim()||"";copyText(prompt,copyPrompt);return true}const copyPage=e.target.closest("[data-copy-page]");if(copyPage){copyPageMarkdown(copyPage);return true}const headingAnchor=e.target.closest("[data-heading-anchor]");if(headingAnchor){const url=new URL(location.href);url.hash=headingAnchor.dataset.headingAnchor||"";copyText(url.href,headingAnchor);return true}const feedback=e.target.closest("[data-feedback-value]");if(feedback){const result=feedback.closest(".page-feedback")?.querySelector("[data-feedback-result]");if(result)result.value=feedback.dataset.feedbackValue==="yes"?"Thanks.":"Noted.";return true}return false} function scrollTarget(hash){if(hash){document.getElementById(decodeURIComponent(hash.slice(1)))?.scrollIntoView()}else{scrollTo(0,0)}} async function navigateTo(url,replace=false){if(navigating)return false;navigating=true;closeLanguage();try{const res=await fetch(url.href,{credentials:"same-origin"});if(!res.ok||!res.headers.get("content-type")?.includes("text/html"))return false;const nextDoc=new DOMParser().parseFromString(await res.text(),"text/html");if(!nextDoc.querySelector(".main"))return false;syncSidebar(nextDoc);swap(".header-left",nextDoc);swapTabs(nextDoc);swap(".main",nextDoc);initCodeGroups();initMermaid();document.title=nextDoc.title;history[replace?"replaceState":"pushState"]({docs:true},"",url.href);setNavOpen(false);scrollTarget(url.hash);return true}catch{return false}finally{navigating=false}} function openSearch(){modal?.classList.add("open");setTimeout(()=>input?.focus(),0);pagefindReady ||= import(withBase("/pagefind/pagefind.js")).then(m=>m.init?.().then?.(()=>m)??m)} diff --git a/scripts/docs-site/build.mjs b/scripts/docs-site/build.mjs index 077eff1e5..f5d989861 100644 --- a/scripts/docs-site/build.mjs +++ b/scripts/docs-site/build.mjs @@ -323,7 +323,7 @@ ${breadcrumbs(page, nav)}

${escapeHtml(groupForPage(nav, page.slug) ?? activeTab)}

${escapeHtml(page.title)}

${pageStatus(page)} -${page.hidden ? "" : pageTools(page)} +${page.hidden ? "" : `${pageTools(page)}${pageMarkdownScript(page)}`}
${html}
${page.hidden ? "" : pageFeedback()} @@ -419,9 +419,21 @@ function breadcrumbs(page, nav) { function pageTools(page) { const canonicalUrl = `${docsOrigin()}${pageRoute(page)}`; + const markdownUrl = publicPath(pageMarkdownRoute(page)); const editUrl = editSourceUrlForPage(page, sourceMetadata); const editLink = editUrl ? `Edit source` : ""; - return `
${editLink}
`; + return `
${editLink}
`; +} + +function pageMarkdownScript(page) { + return ``; +} + +function markdownBodyForCopy(markdown) { + const text = String(markdown || ""); + const frontmatter = /^\uFEFF?---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(text); + if (!frontmatter || !/(^|\n)[A-Za-z0-9_-]+:\s*/.test(frontmatter[1])) return text; + return text.slice(frontmatter[0].length).replace(/^\s*\n/, ""); } function pageStatus(page) { @@ -597,12 +609,23 @@ function docsOrigin() { return (canonicalOrigin || "https://docs.openclaw.ai").replace(/\/$/, ""); } +function chatAvatarAssets() { + const staticPath = fs.existsSync(path.join(docsDir, "assets", "molty-avatar.png")) + ? "/assets/molty-avatar.png" + : "/assets/pixel-lobster.svg"; + const hoverPath = fs.existsSync(path.join(docsDir, "assets", "molty-avatar-hover.gif")) + ? "/assets/molty-avatar-hover.gif" + : staticPath; + return { staticPath: publicPath(staticPath), hoverPath: publicPath(hoverPath) }; +} + function chatWidget() { if (!chatApiUrl) return ""; + const avatar = chatAvatarAssets(); return `
- +