58 lines
1.6 KiB
TypeScript

import type { XMLBuilder } from 'xmlbuilder2/lib/interfaces';
import { create as create_xml } from 'xmlbuilder2';
import { BuildState } from './state';
import { write_text } from '../fs';
import { resolve as path_resolve } from 'path';
export async function write_sitemap_if_needed(state: BuildState) {
if (! state.conf.sitemap) {
return;
}
const doc = create_xml({ version: '1.0', encoding: 'UTF-8' });
const urlset = doc.ele('urlset', {
'xmlns': 'http://www.sitemaps.org/schemas/sitemap/0.9',
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'xsi:schemaLocation': 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'
});
for (const entry of state.sitemap) {
url_elem(urlset, entry.url, entry.lastmod, entry.change_freq, entry.priority);
}
const out_file = state.conf.sitemap.out_file || path_resolve(state.conf.output.root, 'sitemap.xml');
const xml = doc.toString({
indent: ' ',
prettyPrint: true,
});
await write_text(out_file, xml);
}
export interface SitemapEntry {
url: string;
lastmod: string;
change_freq?: ChangeFreq;
priority?: number;
}
export type ChangeFreq = 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';
function url_elem(urlset: XMLBuilder, loc: string, lastmod: string, change_freq?: ChangeFreq, priority?: number) {
const url = urlset.ele('url');
url.ele('loc').txt(loc);
url.ele('lastmod').txt(lastmod);
if (change_freq) {
url.ele('changefreq').txt(change_freq);
}
if (priority != null) {
url.ele('priority').txt(priority.toFixed(1));
}
return url;
}