Skip to main content

サイトマップを生成する

docusaurus だと自動で生成してくれるが、
VuePress で適切な方法で見つからなかったので、スクリプトで生成することにしてみたもの

#!/usr/bin/env python3
#coding: utf-8

from pathlib import Path
from urllib.parse import quote
import xml.etree.ElementTree as ET

SITE_ROOT = "https://sugoi-domain.com"
DIST_DIR = Path("docs/.vuepress/dist")
SITEMAP_PATH = DIST_DIR / "sitemap.xml"
EXCLUDE_PATHS = {"/ad-test.html", "/404.html"}

def get_url_priority(filepath: Path) -> tuple[str, float]:
relative_path = filepath.relative_to(DIST_DIR)
parts = relative_path.parts

# スラッシュ始まりのURLパス
if relative_path.name == "index.html":
if len(parts) == 1:
return "/", 1.0
elif len(parts) == 2:
return f"/{quote(parts[0])}/", 0.8
elif len(parts) == 3:
return f"/{quote(parts[0])}/{quote(parts[1])}/", 0.6
else:
if len(parts) == 1:
return f"/{quote(relative_path.name)}", 0.8
elif len(parts) >= 2:
url = "/" + "/".join(quote(p) for p in parts)
return url, 0.4
return "", 0.5 # fallback

def generate_sitemap():
urlset = ET.Element("urlset", {
"xmlns": "http://www.sitemaps.org/schemas/sitemap/0.9"
})

for filepath in DIST_DIR.rglob("*.html"):
url_path, priority = get_url_priority(filepath)
if url_path in EXCLUDE_PATHS:
continue

url_elem = ET.SubElement(urlset, "url")
ET.SubElement(url_elem, "loc").text = SITE_ROOT + url_path
ET.SubElement(url_elem, "priority").text = f"{priority:.1f}"

tree = ET.ElementTree(urlset)
ET.indent(tree, space=" ", level=0)
tree.write(SITEMAP_PATH, encoding="utf-8", xml_declaration=True)
print(f"✅ sitemap.xml written to {SITEMAP_PATH}")

if __name__ == "__main__":
generate_sitemap()