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');
}