diff --git a/cloudflare-worker.js b/cloudflare-worker.js index 3a28cf2..e0d367e 100644 --- a/cloudflare-worker.js +++ b/cloudflare-worker.js @@ -40,7 +40,7 @@ async function generateOGTags(url, SITE_URL, DOCS_URL) { console.log(metadataMatch); const thumbnailMatch = metadataStr.match(/thumbnail:\s*(.*)/); if (thumbnailMatch) { - thumbnail = thumbnailMatch[1].trim(); + thumbnail = "docs/" + thumbnailMatch[1].trim(); } const descriptionMatch = metadataStr.match(/description:\s*(.*)/); if (descriptionMatch) { @@ -118,10 +118,64 @@ async function handleRequest(request, SITE_URL, DOCS_URL) { return new Response(response.body, response); } +async function generateSitemap(DOCS_URL, SITE_URL) { + const indexResponse = await fetch(`${DOCS_URL}/index.json`); + const indexData = await indexResponse.json(); + + function collectUrls(documents) { + let urls = []; + for (const doc of documents) { + if (doc.slug) { + const url = new URL(SITE_URL); + // Fix: Directly append the slug to search without using searchParams + url.search = `?${doc.slug}`; // This creates clean URLs without = + urls.push({ + loc: url.href, + lastmod: doc.lastModified || new Date().toISOString().split('T')[0], + priority: doc.type === 'folder' ? '0.8' : '0.6' + }); + } + if (doc.type === 'folder' && doc.items) { + urls = urls.concat(collectUrls(doc.items)); + } + } + return urls; + } + + const urls = collectUrls(indexData.documents); + + const sitemap = ` + + ${urls.map(url => ` + + ${url.loc} + ${url.lastmod} + ${url.priority} + `).join('')} + `; + + return new Response(sitemap.trim(), { + headers: { + 'Content-Type': 'application/xml', + 'Cache-Control': 'public, max-age=3600' + } + }); +} + export default { async fetch(request, env, ctx) { const SITE_URL = env.SITE_URL; const DOCS_URL = env.DOCS_URL; + const url = new URL(request.url); + + // Fix: Check if path ends with sitemap.xml regardless of base path + if (url.pathname === '/sitemap.xml' || url.pathname.endsWith('/sitemap.xml')) { + return generateSitemap(DOCS_URL, SITE_URL); + } + return handleRequest(request, SITE_URL, DOCS_URL); } };