import {escapeHtml} from './head'; export interface SiteEntry { /** 사이트 홈 주소. 사이트가 한 장이라 이게 그 사이트의 유일한 URL 이다. */ loc: string; /** 마지막 발행 시각(ISO). */ lastmod?: string; } /** * 오리진 루트의 사이트맵 — 이 호스트의 **모든 사이트**를 한 파일에 담는다. * * ★ 예전에는 사이트마다 `sitemap.xml` 을 굽고 루트에 사이트맵 인덱스를 뒀다. * 사이트가 한 장이 되면서 그 구조가 낭비가 됐다 — URL 한 줄짜리 파일이 사이트 수만큼 * 생기고, 인덱스는 그걸 다시 1,000줄로 가리킨다. 크롤러 왕복만 두 배가 된다. * * ★ 규격 상한은 파일당 URL 50,000개 · 압축 전 50MB 다. 그 선을 넘으면 그때 * 사이트맵을 여러 개로 쪼개고 인덱스를 되살린다(지금 구조에서 어렵지 않다). */ export function renderSiteUrlset(entries: SiteEntry[]): string { const urls = entries .map((entry) => [ ' ', ` ${escapeHtml(entry.loc)}`, entry.lastmod ? ` ${entry.lastmod}` : '', ' weekly', ' ', ] .filter(Boolean) .join('\n'), ) .join('\n'); return [ '', '', urls, '', '', ].join('\n'); }