UNPKG

nuxt-simple-sitemap

Version:

Powerfully flexible XML Sitemaps that integrate seamlessly, for Nuxt.

84 lines (83 loc) 3.14 kB
function resolveKey(k) { switch (k) { case "images": return "image"; case "videos": return "video"; case "news": return "news"; default: return k; } } function handleObject(key, obj) { return [ ` <${key}:${key}>`, ...Object.entries(obj).map(([sk, sv]) => { if (key === "video" && Array.isArray(sv)) { return sv.map((v) => { if (typeof v === "string") { return [ ` `, `<${key}:${sk}>`, escapeValueForXml(v), `</${key}:${sk}>` ].join(""); } const attributes = Object.entries(v).filter(([ssk]) => ssk !== sk).map(([ssk, ssv]) => `${ssk}="${escapeValueForXml(ssv)}"`).join(" "); return [ ` <${key}:${sk} ${attributes}>`, // value is the same sk v[sk], `</${key}:${sk}>` ].join(""); }).join("\n"); } if (typeof sv === "object") { if (key === "video") { const attributes = Object.entries(sv).filter(([ssk]) => ssk !== sk).map(([ssk, ssv]) => `${ssk}="${escapeValueForXml(ssv)}"`).join(" "); return [ ` <${key}:${sk} ${attributes}>`, // value is the same sk sv[sk], `</${key}:${sk}>` ].join(""); } return [ ` <${key}:${sk}>`, ...Object.entries(sv).map(([ssk, ssv]) => ` <${key}:${ssk}>${escapeValueForXml(ssv)}</${key}:${ssk}>`), ` </${key}:${sk}>` ].join("\n"); } return ` <${key}:${sk}>${escapeValueForXml(sv)}</${key}:${sk}>`; }), ` </${key}:${key}>` ].join("\n"); } function handleArray(key, arr) { if (arr.length === 0) return false; key = resolveKey(key); if (key === "alternatives") { return arr.map((obj) => [ ` <xhtml:link rel="alternate" ${Object.entries(obj).map(([sk, sv]) => `${sk}="${escapeValueForXml(sv)}"`).join(" ")} />` ].join("\n")).join("\n"); } return arr.map((obj) => handleObject(key, obj)).join("\n"); } export function handleEntry(k, e) { return Array.isArray(e[k]) ? handleArray(k, e[k]) : typeof e[k] === "object" ? handleObject(k, e[k]) : ` <${k}>${escapeValueForXml(e[k])}</${k}>`; } export function wrapSitemapXml(input, resolvers, wrapSitemapXmlOptions) { const xsl = wrapSitemapXmlOptions.xsl ? resolvers.relativeBaseUrlResolver(wrapSitemapXmlOptions.xsl) : false; const credits = wrapSitemapXmlOptions.credits; input.unshift(`<?xml version="1.0" encoding="UTF-8"?>${xsl ? `<?xml-stylesheet type="text/xsl" href="${xsl}"?>` : ""}`); if (credits) input.push(`<!-- XML Sitemap generated by Nuxt Simple Sitemap v${wrapSitemapXmlOptions.version} -->`); return input.join("\n"); } export function escapeValueForXml(value) { if (value === true || value === false) return value ? "yes" : "no"; return String(value).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"); }