Files
bentopdf/scripts/generate-sitemap.mjs
2026-03-09 17:02:30 +01:00

118 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const DIST_DIR = path.resolve(__dirname, '../dist');
const LOCALES_DIR = path.resolve(__dirname, '../public/locales');
const SITE_URL = process.env.SITE_URL || 'https://www.bentopdf.com';
const languages = fs.readdirSync(LOCALES_DIR).filter((file) => {
return fs.statSync(path.join(LOCALES_DIR, file)).isDirectory();
});
const PRIORITY_MAP = {
index: 1.0,
tools: 0.9,
'pdf-converter': 0.9,
'pdf-editor': 0.9,
'pdf-security': 0.9,
'pdf-merge-split': 0.9,
'merge-pdf': 0.9,
'split-pdf': 0.9,
'compress-pdf': 0.9,
'edit-pdf': 0.9,
'word-to-pdf': 0.9,
'excel-to-pdf': 0.9,
'powerpoint-to-pdf': 0.9,
'jpg-to-pdf': 0.9,
'pdf-to-docx': 0.9,
'pdf-to-excel': 0.9,
'pdf-to-jpg': 0.9,
about: 0.8,
faq: 0.8,
contact: 0.7,
privacy: 0.5,
terms: 0.5,
licensing: 0.5,
404: 0.1,
};
function getPriority(pageName) {
return PRIORITY_MAP[pageName] || 0.7;
}
function buildUrl(lang, pageName) {
const pagePath = pageName === 'index' ? '' : pageName;
if (lang === 'en') {
return pagePath ? `${SITE_URL}/${pagePath}` : SITE_URL;
}
return pagePath ? `${SITE_URL}/${lang}/${pagePath}` : `${SITE_URL}/${lang}`;
}
function generateSitemap() {
console.log('🗺️ Generating multilingual sitemap...');
console.log(` SITE_URL: ${SITE_URL}`);
console.log(` Languages: ${languages.join(', ')}`);
// Get all HTML files from dist root (English pages)
const htmlFiles = fs
.readdirSync(DIST_DIR)
.filter((file) => file.endsWith('.html'))
.map((file) => file.replace('.html', ''));
const today = new Date().toISOString().split('T')[0];
let sitemap = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
`;
for (const pageName of htmlFiles) {
const priority = getPriority(pageName);
// Generate entry for each language
for (const lang of languages) {
const url = buildUrl(lang, pageName);
sitemap += ` <url>
<loc>${url}</loc>
<lastmod>${today}</lastmod>
<changefreq>weekly</changefreq>
<priority>${priority}</priority>
`;
// Add hreflang alternates for all languages
for (const altLang of languages) {
const altUrl = buildUrl(altLang, pageName);
sitemap += ` <xhtml:link rel="alternate" hreflang="${altLang}" href="${altUrl}"/>
`;
}
// Add x-default pointing to English
const defaultUrl = buildUrl('en', pageName);
sitemap += ` <xhtml:link rel="alternate" hreflang="x-default" href="${defaultUrl}"/>
</url>
`;
}
}
sitemap += `</urlset>
`;
const sitemapPath = path.join(DIST_DIR, 'sitemap.xml');
fs.writeFileSync(sitemapPath, sitemap);
const publicSitemapPath = path.resolve(__dirname, '../public/sitemap.xml');
fs.writeFileSync(publicSitemapPath, sitemap);
const urlCount = htmlFiles.length * languages.length;
console.log(
`✅ Sitemap generated with ${urlCount} URLs (${htmlFiles.length} pages × ${languages.length} languages)`
);
}
generateSitemap();