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