diff --git a/eleventy.config.js b/eleventy.config.js
index 1528871..f844ff5 100644
--- a/eleventy.config.js
+++ b/eleventy.config.js
@@ -2,7 +2,7 @@ import pluginWebmentions from "@chrisburnell/eleventy-cache-webmentions";
import pluginRss from "@11ty/eleventy-plugin-rss";
import embedEverything from "eleventy-plugin-embed-everything";
import { eleventyImageTransformPlugin } from "@11ty/eleventy-img";
-import sitemap from "@quasibit/eleventy-plugin-sitemap";
+
import markdownIt from "markdown-it";
import markdownItAnchor from "markdown-it-anchor";
import syntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight";
@@ -352,12 +352,6 @@ export default function (eleventyConfig) {
return eleventyConfig.htmlTransformer.transformContent(this.outputPath, content, this);
});
- // Sitemap generation
- eleventyConfig.addPlugin(sitemap, {
- sitemap: {
- hostname: siteUrl,
- },
- });
// Wrap
elements in for responsive tables
eleventyConfig.addTransform("table-saw-wrap", function (content, outputPath) {
@@ -674,29 +668,6 @@ export default function (eleventyConfig) {
});
});
- // Exclude pages from sitemap by URL pattern
- // Usage: collections.all | excludeFromSitemap
- eleventyConfig.addFilter("excludeFromSitemap", (items) => {
- const excludePatterns = [
- /^\/replies\//,
- /^\/feed\.(xml|json)$/,
- /\/feed\.(xml|json)$/,
- /^\/categories\//,
- /^\/digest/,
- /^\/webmention-debug\//,
- /^\/404\.html$/,
- /^\/sitemap\.xml$/,
- /^\/dashboard/,
- /^\/homepage/,
- /^\/search\//,
- /^\/graph\//,
- ];
- return items.filter((item) => {
- const url = item.url || "";
- return !excludePatterns.some((pattern) => pattern.test(url));
- });
- });
-
// Slugify filter
eleventyConfig.addFilter("slugify", (str) => {
if (!str) return "";
@@ -1426,6 +1397,54 @@ export default function (eleventyConfig) {
}
}
+ // Sitemap generation — scan output HTML files, exclude URL patterns
+ if (!incremental) {
+ const sitemapOutputDir = directories?.output || dir.output;
+ const excludePatterns = [
+ /^\/replies\//,
+ /\/feed\.(xml|json)$/,
+ /^\/categories\//,
+ /^\/digest/,
+ /^\/webmention-debug\//,
+ /^\/404\.html$/,
+ /^\/dashboard/,
+ /^\/homepage/,
+ /^\/search\//,
+ /^\/graph\//,
+ /^\/sitemap\.xml$/,
+ ];
+ try {
+ const walkHtml = (base, prefix = "") => {
+ const entries = [];
+ for (const entry of readdirSync(resolve(base, prefix), { withFileTypes: true })) {
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
+ if (entry.isDirectory()) {
+ entries.push(...walkHtml(base, rel));
+ } else if (entry.name === "index.html") {
+ const urlPath = prefix ? `/${prefix}/` : "/";
+ entries.push(urlPath);
+ }
+ }
+ return entries;
+ };
+ const allUrls = walkHtml(sitemapOutputDir)
+ .filter((url) => !excludePatterns.some((p) => p.test(url)))
+ .sort();
+ const xmlLines = [
+ '',
+ '',
+ ];
+ for (const url of allUrls) {
+ xmlLines.push(` ${siteUrl}${url}`);
+ }
+ xmlLines.push("");
+ writeFileSync(resolve(sitemapOutputDir, "sitemap.xml"), xmlLines.join("\n"));
+ console.log(`[sitemap] Generated sitemap.xml with ${allUrls.length} URLs`);
+ } catch (err) {
+ console.error("[sitemap] Generation failed:", err.message);
+ }
+ }
+
// Pagefind indexing — run exactly once per process lifetime
if (!pagefindDone) {
pagefindDone = true;
diff --git a/sitemap.njk b/sitemap.njk
deleted file mode 100644
index 4436965..0000000
--- a/sitemap.njk
+++ /dev/null
@@ -1,7 +0,0 @@
----
-permalink: /sitemap.xml
-layout: null
-eleventyExcludeFromCollections: true
----
-{% set sitemapItems = collections.all | excludeFromSitemap %}
-{% sitemap sitemapItems %}