nuxt-simple-sitemap
Version:
Powerfully flexible XML Sitemaps that integrate seamlessly, for Nuxt.
84 lines (83 loc) • 3.14 kB
JavaScript
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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}