diff --git a/src/Elastic.Markdown/IO/Navigation/FileNavigationItem.cs b/src/Elastic.Markdown/IO/Navigation/FileNavigationItem.cs index a37900b2e..67df3d7a9 100644 --- a/src/Elastic.Markdown/IO/Navigation/FileNavigationItem.cs +++ b/src/Elastic.Markdown/IO/Navigation/FileNavigationItem.cs @@ -8,7 +8,8 @@ namespace Elastic.Markdown.IO.Navigation; [DebuggerDisplay("Current: {Model.RelativePath}")] -public record FileNavigationItem(MarkdownFile Model, DocumentationGroup Group, bool Hidden = false) : ILeafNavigationItem +public record FileNavigationItem(MarkdownFile Model, DocumentationGroup Group, bool Hidden = false) + : ILeafNavigationItem { public INodeNavigationItem? Parent { get; set; } = Group; public IRootNavigationItem NavigationRoot { get; } = Group.NavigationRoot; diff --git a/src/tooling/docs-assembler/Building/SitemapBuilder.cs b/src/tooling/docs-assembler/Building/SitemapBuilder.cs index d422234a5..fe51ba057 100644 --- a/src/tooling/docs-assembler/Building/SitemapBuilder.cs +++ b/src/tooling/docs-assembler/Building/SitemapBuilder.cs @@ -5,6 +5,7 @@ using System.IO.Abstractions; using System.Xml.Linq; using Elastic.Documentation.Site.Navigation; +using Elastic.Markdown.Extensions.DetectionRules; using Elastic.Markdown.IO.Navigation; namespace Documentation.Assembler.Building; @@ -21,25 +22,32 @@ public void Generate() { var flattenedNavigationItems = GetNavigationItems(navigationItems); - var doc = new XDocument() + var doc = new XDocument { - Declaration = new XDeclaration("1.0", "utf-8", "yes"), + Declaration = new XDeclaration("1.0", "utf-8", "yes") }; + XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; + var currentDate = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:sszzz"); var root = new XElement( - "urlset", - new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"), - flattenedNavigationItems - .OfType() - .Select(n => n.Model.Url) - .Distinct() - .Select(u => new Uri(BaseUri, u)) - .Select(u => new XElement("url", [ - new XElement("loc", u), - new XElement("lastmod", currentDate) - ])) - ); + ns + "urlset", + new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"), + flattenedNavigationItems + .Select(n => n switch + { + DocumentationGroup group => (group.Index.Url, NavigationItem: group), + FileNavigationItem file => (file.Model.Url, NavigationItem: file as INavigationItem), + _ => throw new Exception($"Unhandled navigation item type: {n.GetType()}") + }) + .Select(n => n.Url) + .Distinct() + .Select(u => new Uri(BaseUri, u)) + .Select(u => new XElement(ns + "url", [ + new XElement(ns + "loc", u), + new XElement(ns + "lastmod", currentDate) + ])) + ); doc.Add(root); @@ -55,13 +63,24 @@ private static IReadOnlyCollection GetNavigationItems(IReadOnly switch (item) { case FileNavigationItem file: + // these are hidden from the navigation programatically. + // TODO find a cleaner way to model this. + if (item.Hidden && file.Model is not DetectionRuleFile) + continue; result.Add(file); break; case DocumentationGroup group: + if (item.Hidden) + continue; + result.AddRange(GetNavigationItems(group.NavigationItems)); + result.Add(group); break; + default: + throw new Exception($"Unhandled navigation item type: {item.GetType()}"); } } + return result; } }