public class SitemapBuilder()

in src/tooling/docs-assembler/Building/SitemapBuilder.cs [11:69]


public class SitemapBuilder(
	IReadOnlyCollection<INavigationItem> navigationItems,
	IFileSystem fileSystem,
	IDirectoryInfo outputFolder
)
{
	private static readonly Uri BaseUri = new("https://www.elastic.co");

	public void Generate()
	{
		var flattenedNavigationItems = GetNavigationItems(navigationItems);

		var doc = new XDocument()
		{
			Declaration = new XDeclaration("1.0", "utf-8", "yes"),
		};

		var currentDate = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:sszzz");
		var root = new XElement(
				"urlset",
				new XAttribute("xlmns", "http://www.sitemaps.org/schemas/sitemap/0.9"),
				flattenedNavigationItems
					.OfType<FileNavigationItem>()
					.Select(n => n.File.Url)
					.Distinct()
					.Select(u => new Uri(BaseUri, u))
					.Select(u => new XElement("url", [
						new XElement("loc", u),
						new XElement("lastmod", currentDate)
					]))
			);

		doc.Add(root);

		using var fileStream = fileSystem.File.Create(Path.Combine(outputFolder.ToString() ?? string.Empty, "docs", "sitemap.xml"));
		doc.Save(fileStream);
	}

	private static IReadOnlyCollection<INavigationItem> GetNavigationItems(IReadOnlyCollection<INavigationItem> items)
	{
		var result = new List<INavigationItem>();
		foreach (var item in items)
		{
			switch (item)
			{
				case FileNavigationItem file:
					result.Add(file);
					break;
				case GroupNavigationItem group:
					result.AddRange(GetNavigationItems(group.Group.NavigationItems));
					break;
				case DocumentationGroup group:
					result.AddRange(GetNavigationItems(group.NavigationItems));
					break;
			}
		}
		return result;
	}
}