From e6a9f3ee47649b8be700562bf46c4a98bac47c55 Mon Sep 17 00:00:00 2001
From: Martijn Laarman
Date: Mon, 13 Jan 2025 17:48:06 +0100
Subject: [PATCH 1/2] Refactor navigation and model hierarchy.
Replaces `DocumentationFolder` with `DocumentationGroup` and introduces new abstractions for navigation management. Updates hierarchy structure, adds `NavigationItems` for improved flexibility, and adjusts related components to align with the new design.
This now orders files and groups as a whole. Before we were listing files before folders always
---
src/Elastic.Markdown/BuildContext.cs | 4 +-
.../DocumentationGenerator.cs | 19 -----
.../{ => Configuration}/ConfigurationFile.cs | 0
.../IO/{ => Configuration}/ITocItem.cs | 2 -
.../GitCheckoutInformation.cs} | 10 +--
src/Elastic.Markdown/IO/DocumentationSet.cs | 4 +-
src/Elastic.Markdown/IO/MarkdownFile.cs | 5 +-
.../DocumentationGroup.cs} | 69 ++++++++++++-------
.../IO/State/GenerationState.cs | 20 ++++++
.../IO/{ => State}/LinkReference.cs | 2 +-
.../Slices/Layout/_TocTree.cshtml | 2 +-
.../Slices/Layout/_TocTreeNav.cshtml | 40 ++++++-----
src/Elastic.Markdown/Slices/_ViewModels.cs | 8 +--
.../SourceGenerationContext.cs | 16 +++++
.../DocSet/LinkReferenceTests.cs | 4 +-
15 files changed, 124 insertions(+), 81 deletions(-)
rename src/Elastic.Markdown/IO/{ => Configuration}/ConfigurationFile.cs (100%)
rename src/Elastic.Markdown/IO/{ => Configuration}/ITocItem.cs (82%)
rename src/Elastic.Markdown/IO/{GitConfiguration.cs => Discovery/GitCheckoutInformation.cs} (86%)
rename src/Elastic.Markdown/IO/{DocumentationFolder.cs => Navigation/DocumentationGroup.cs} (56%)
create mode 100644 src/Elastic.Markdown/IO/State/GenerationState.cs
rename src/Elastic.Markdown/IO/{ => State}/LinkReference.cs (94%)
create mode 100644 src/Elastic.Markdown/SourceGenerationContext.cs
diff --git a/src/Elastic.Markdown/BuildContext.cs b/src/Elastic.Markdown/BuildContext.cs
index aee78b79..95c6cb13 100644
--- a/src/Elastic.Markdown/BuildContext.cs
+++ b/src/Elastic.Markdown/BuildContext.cs
@@ -17,7 +17,7 @@ public record BuildContext
public IFileInfo ConfigurationPath { get; }
- public GitConfiguration Git { get; }
+ public GitCheckoutInformation Git { get; }
public required DiagnosticsCollector Collector { get; init; }
@@ -57,7 +57,7 @@ public BuildContext(IFileSystem readFileSystem, IFileSystem writeFileSystem, str
if (ConfigurationPath.FullName != SourcePath.FullName)
SourcePath = ConfigurationPath.Directory!;
- Git = GitConfiguration.Create(ReadFileSystem);
+ Git = GitCheckoutInformation.Create(ReadFileSystem);
}
private IDirectoryInfo FindDocsFolderFromRoot(IDirectoryInfo rootPath)
diff --git a/src/Elastic.Markdown/DocumentationGenerator.cs b/src/Elastic.Markdown/DocumentationGenerator.cs
index 8086e56d..adb50fae 100644
--- a/src/Elastic.Markdown/DocumentationGenerator.cs
+++ b/src/Elastic.Markdown/DocumentationGenerator.cs
@@ -4,31 +4,12 @@
using System.IO.Abstractions;
using System.Reflection;
using System.Text.Json;
-using System.Text.Json.Serialization;
using Elastic.Markdown.IO;
using Elastic.Markdown.Slices;
using Microsoft.Extensions.Logging;
namespace Elastic.Markdown;
-[JsonSourceGenerationOptions(WriteIndented = true)]
-[JsonSerializable(typeof(GenerationState))]
-[JsonSerializable(typeof(LinkReference))]
-[JsonSerializable(typeof(GitConfiguration))]
-internal partial class SourceGenerationContext : JsonSerializerContext;
-
-public record GenerationState
-{
- [JsonPropertyName("last_seen_changes")]
- public required DateTimeOffset LastSeenChanges { get; init; }
-
- [JsonPropertyName("invalid_files")]
- public required string[] InvalidFiles { get; init; } = [];
-
- [JsonPropertyName("git")]
- public required GitConfiguration Git { get; init; }
-}
-
public class DocumentationGenerator
{
private readonly IFileSystem _readFileSystem;
diff --git a/src/Elastic.Markdown/IO/ConfigurationFile.cs b/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs
similarity index 100%
rename from src/Elastic.Markdown/IO/ConfigurationFile.cs
rename to src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs
diff --git a/src/Elastic.Markdown/IO/ITocItem.cs b/src/Elastic.Markdown/IO/Configuration/ITocItem.cs
similarity index 82%
rename from src/Elastic.Markdown/IO/ITocItem.cs
rename to src/Elastic.Markdown/IO/Configuration/ITocItem.cs
index 803ffedf..85c25c24 100644
--- a/src/Elastic.Markdown/IO/ITocItem.cs
+++ b/src/Elastic.Markdown/IO/Configuration/ITocItem.cs
@@ -9,5 +9,3 @@ public interface ITocItem;
public record FileReference(string Path, bool Found, IReadOnlyCollection Children) : ITocItem;
public record FolderReference(string Path, bool Found, IReadOnlyCollection Children) : ITocItem;
-
-public record TocReference(string Path, bool Found, IReadOnlyCollection Children) : ITocItem;
diff --git a/src/Elastic.Markdown/IO/GitConfiguration.cs b/src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs
similarity index 86%
rename from src/Elastic.Markdown/IO/GitConfiguration.cs
rename to src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs
index ea451bc3..abcb7d39 100644
--- a/src/Elastic.Markdown/IO/GitConfiguration.cs
+++ b/src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs
@@ -8,9 +8,9 @@
namespace Elastic.Markdown.IO;
-public record GitConfiguration
+public record GitCheckoutInformation
{
- private static GitConfiguration Unavailable { get; } = new()
+ private static GitCheckoutInformation Unavailable { get; } = new()
{
Branch = "unavailable",
Remote = "unavailable",
@@ -27,13 +27,13 @@ public record GitConfiguration
public required string Ref { get; init; }
// manual read because libgit2sharp is not yet AOT ready
- public static GitConfiguration Create(IFileSystem fileSystem)
+ public static GitCheckoutInformation Create(IFileSystem fileSystem)
{
// filesystem is not real so return a dummy
if (fileSystem is not FileSystem)
{
var fakeRef = Guid.NewGuid().ToString().Substring(0, 16);
- return new GitConfiguration { Branch = $"test-{fakeRef}", Remote = "elastic/docs-builder", Ref = fakeRef, };
+ return new GitCheckoutInformation { Branch = $"test-{fakeRef}", Remote = "elastic/docs-builder", Ref = fakeRef, };
}
var gitConfig = Git(".git/config");
@@ -66,7 +66,7 @@ public static GitConfiguration Create(IFileSystem fileSystem)
if (string.IsNullOrEmpty(remote))
remote = Environment.GetEnvironmentVariable("GITHUB_REPOSITORY") ?? "elastic/docs-builder-unknown";
- return new GitConfiguration { Ref = gitRef, Branch = branch, Remote = remote };
+ return new GitCheckoutInformation { Ref = gitRef, Branch = branch, Remote = remote };
IFileInfo Git(string path) => fileSystem.FileInfo.New(Path.Combine(Paths.Root.FullName, path));
diff --git a/src/Elastic.Markdown/IO/DocumentationSet.cs b/src/Elastic.Markdown/IO/DocumentationSet.cs
index 0d109dbc..c0d652ab 100644
--- a/src/Elastic.Markdown/IO/DocumentationSet.cs
+++ b/src/Elastic.Markdown/IO/DocumentationSet.cs
@@ -56,7 +56,7 @@ public DocumentationSet(BuildContext context)
.GroupBy(file => file.RelativeFolder)
.ToDictionary(g => g.Key, g => g.ToArray());
- Tree = new DocumentationFolder(Configuration.TableOfContents, FlatMappedFiles, folderFiles)
+ Tree = new DocumentationGroup(Configuration.TableOfContents, FlatMappedFiles, folderFiles)
{
Parent = null
};
@@ -92,7 +92,7 @@ private DocumentationFile CreateMarkDownFile(IFileInfo file, BuildContext contex
return new ExcludedFile(file, SourcePath);
}
- public DocumentationFolder Tree { get; }
+ public DocumentationGroup Tree { get; }
public List Files { get; }
diff --git a/src/Elastic.Markdown/IO/MarkdownFile.cs b/src/Elastic.Markdown/IO/MarkdownFile.cs
index aaff75ef..f9593049 100644
--- a/src/Elastic.Markdown/IO/MarkdownFile.cs
+++ b/src/Elastic.Markdown/IO/MarkdownFile.cs
@@ -14,6 +14,7 @@
namespace Elastic.Markdown.IO;
+
public record MarkdownFile : DocumentationFile
{
private readonly SlugHelper _slugHelper = new();
@@ -31,7 +32,7 @@ public MarkdownFile(IFileInfo sourceFile, IDirectoryInfo rootPath, MarkdownParse
private DiagnosticsCollector Collector { get; }
- public DocumentationFolder? Parent
+ public DocumentationGroup? Parent
{
get => FileName == "index.md" ? _parent?.Parent : _parent;
set => _parent = value;
@@ -59,7 +60,7 @@ public string? NavigationTitle
public string Url => $"{UrlPathPrefix}/{RelativePath.Replace(".md", ".html")}";
private bool _instructionsParsed;
- private DocumentationFolder? _parent;
+ private DocumentationGroup? _parent;
public MarkdownFile[] YieldParents()
{
diff --git a/src/Elastic.Markdown/IO/DocumentationFolder.cs b/src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs
similarity index 56%
rename from src/Elastic.Markdown/IO/DocumentationFolder.cs
rename to src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs
index 9207d7b7..492e959f 100644
--- a/src/Elastic.Markdown/IO/DocumentationFolder.cs
+++ b/src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs
@@ -4,32 +4,46 @@
namespace Elastic.Markdown.IO;
-public class DocumentationFolder
+public interface INavigationItem
+{
+ int Order { get; }
+ int Depth { get; }
+}
+
+public record GroupNavigation(int Order, int Depth, DocumentationGroup Group) : INavigationItem;
+public record FileNavigation(int Order, int Depth, MarkdownFile File) : INavigationItem;
+
+
+public class DocumentationGroup
{
public MarkdownFile? Index { get; set; }
- public List FilesInOrder { get; }
- public List GroupsInOrder { get; }
+ private IReadOnlyCollection FilesInOrder { get; }
+
+ private IReadOnlyCollection GroupsInOrder { get; }
+
+ public IReadOnlyCollection NavigationItems { get; }
- public required DocumentationFolder? Parent { get; init; }
+ public required DocumentationGroup? Parent { get; init; }
private HashSet OwnFiles { get; }
- public int Level { get; }
+ public int Depth { get; }
- public DocumentationFolder(
+ public DocumentationGroup(
IReadOnlyCollection toc,
IDictionary lookup,
IDictionary folderLookup,
- int level = 0,
+ int depth = 0,
MarkdownFile? index = null
)
{
- Level = level;
- var foundIndex = ProcessTocItems(toc, lookup, folderLookup, level, out var groupsInOrder, out var filesInOrder);
+ Depth = depth;
+ var foundIndex = ProcessTocItems(toc, lookup, folderLookup, depth, out var groups, out var files, out var navigationItems);
- GroupsInOrder = groupsInOrder;
- FilesInOrder = filesInOrder;
+ GroupsInOrder = groups;
+ FilesInOrder = files;
+ NavigationItems = navigationItems;
Index = index ?? foundIndex;
if (Index is not null)
@@ -42,15 +56,17 @@ public DocumentationFolder(
IReadOnlyCollection toc,
IDictionary lookup,
IDictionary folderLookup,
- int level,
- out List groupsInOrder,
- out List filesInOrder
+ int depth,
+ out List groups,
+ out List files,
+ out List navigationItems
)
{
- groupsInOrder = [];
- filesInOrder = [];
- MarkdownFile? index = null;
- foreach (var tocItem in toc)
+ groups = [];
+ navigationItems = [];
+ files = [];
+ MarkdownFile? indexFile = null;
+ foreach (var (tocItem, index) in toc.Select((t, i) => (t, i)))
{
if (tocItem is FileReference file)
{
@@ -61,17 +77,19 @@ out List filesInOrder
if (file.Children.Count > 0 && d is MarkdownFile virtualIndex)
{
- var group = new DocumentationFolder(file.Children, lookup, folderLookup, level + 1, virtualIndex)
+ var group = new DocumentationGroup(file.Children, lookup, folderLookup, depth + 1, virtualIndex)
{
Parent = this
};
- groupsInOrder.Add(group);
+ groups.Add(group);
+ navigationItems.Add(new GroupNavigation(index, depth, group));
continue;
}
- filesInOrder.Add(md);
+ files.Add(md);
+ navigationItems.Add(new FileNavigation(index, depth, md));
if (file.Path.EndsWith("index.md") && d is MarkdownFile i)
- index ??= i;
+ indexFile ??= i;
}
else if (tocItem is FolderReference folder)
{
@@ -84,15 +102,16 @@ out List filesInOrder
.ToArray();
}
- var group = new DocumentationFolder(children, lookup, folderLookup, level + 1)
+ var group = new DocumentationGroup(children, lookup, folderLookup, depth + 1)
{
Parent = this
};
- groupsInOrder.Add(group);
+ groups.Add(group);
+ navigationItems.Add(new GroupNavigation(index, depth, group));
}
}
- return index ?? filesInOrder.FirstOrDefault();
+ return indexFile ?? files.FirstOrDefault();
}
public bool HoldsCurrent(MarkdownFile current) =>
diff --git a/src/Elastic.Markdown/IO/State/GenerationState.cs b/src/Elastic.Markdown/IO/State/GenerationState.cs
new file mode 100644
index 00000000..c592cc20
--- /dev/null
+++ b/src/Elastic.Markdown/IO/State/GenerationState.cs
@@ -0,0 +1,20 @@
+// Licensed to Elasticsearch B.V under one or more agreements.
+// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
+// See the LICENSE file in the project root for more information
+
+using System.Text.Json.Serialization;
+using Elastic.Markdown.IO;
+
+namespace Elastic.Markdown;
+
+public record GenerationState
+{
+ [JsonPropertyName("last_seen_changes")]
+ public required DateTimeOffset LastSeenChanges { get; init; }
+
+ [JsonPropertyName("invalid_files")]
+ public required string[] InvalidFiles { get; init; } = [];
+
+ [JsonPropertyName("git")]
+ public required GitCheckoutInformation Git { get; init; }
+}
diff --git a/src/Elastic.Markdown/IO/LinkReference.cs b/src/Elastic.Markdown/IO/State/LinkReference.cs
similarity index 94%
rename from src/Elastic.Markdown/IO/LinkReference.cs
rename to src/Elastic.Markdown/IO/State/LinkReference.cs
index 43bafd40..f04a448a 100644
--- a/src/Elastic.Markdown/IO/LinkReference.cs
+++ b/src/Elastic.Markdown/IO/State/LinkReference.cs
@@ -9,7 +9,7 @@ namespace Elastic.Markdown.IO;
public record LinkReference
{
[JsonPropertyName("origin")]
- public required GitConfiguration Origin { get; init; }
+ public required GitCheckoutInformation Origin { get; init; }
[JsonPropertyName("url_path_prefix")]
public required string? UrlPathPrefix { get; init; }
diff --git a/src/Elastic.Markdown/Slices/Layout/_TocTree.cshtml b/src/Elastic.Markdown/Slices/Layout/_TocTree.cshtml
index c4664ab4..b4e0c336 100644
--- a/src/Elastic.Markdown/Slices/Layout/_TocTree.cshtml
+++ b/src/Elastic.Markdown/Slices/Layout/_TocTree.cshtml
@@ -8,7 +8,7 @@
@await RenderPartialAsync(Elastic.Markdown.Slices.Layout._TocTreeNav.Create(new NavigationTreeItem
{
- Level = Model.Tree.Level,
+ Level = Model.Tree.Depth,
SubTree = Model.Tree,
CurrentDocument = Model.CurrentDocument
}))
diff --git a/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml b/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml
index cfa4a2a6..2dc4665d 100644
--- a/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml
+++ b/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml
@@ -1,19 +1,27 @@
+@using Elastic.Markdown.IO
@inherits RazorSlice
-@foreach (var file in Model.SubTree.FilesInOrder)
+@foreach (var item in Model.SubTree.NavigationItems)
{
- var current = file == Model.CurrentDocument ? " current" : string.Empty;
-- @file.NavigationTitle
-}
-@foreach (var g in Model.SubTree.GroupsInOrder)
-{
- var current = g.HoldsCurrent(Model.CurrentDocument) ? " current" : string.Empty;
- var currentFile = g.Index == Model.CurrentDocument ? " current" : string.Empty;
-- @g.Index?.NavigationTitle@if (@g.FilesInOrder.Count > 0 || g.GroupsInOrder.Count > 0) {
@await RenderPartialAsync(Elastic.Markdown.Slices.Layout._TocTreeNav.Create(new NavigationTreeItem
- {
- Level = g.Level,
- CurrentDocument = Model.CurrentDocument,
- SubTree = g
- }))
-}
-
+ if (item is FileNavigation file)
+ {
+ var f = file.File;
+ var current = f == Model.CurrentDocument ? " current" : string.Empty;
+ - @f.NavigationTitle
+ }
+ else if (item is GroupNavigation folder)
+ {
+ var g = folder.Group;
+ var current = g.HoldsCurrent(Model.CurrentDocument) ? " current" : string.Empty;
+ var currentFile = g.Index == Model.CurrentDocument ? " current" : string.Empty;
+ - @g.Index?.NavigationTitle@if (@g.NavigationItems.Count > 0) {
+ @await RenderPartialAsync(_TocTreeNav.Create(new NavigationTreeItem
+ {
+ Level = g.Depth,
+ CurrentDocument = Model.CurrentDocument,
+ SubTree = g
+ }))
+
+ }
+
+ }
}
diff --git a/src/Elastic.Markdown/Slices/_ViewModels.cs b/src/Elastic.Markdown/Slices/_ViewModels.cs
index c0c4c6df..1a89034d 100644
--- a/src/Elastic.Markdown/Slices/_ViewModels.cs
+++ b/src/Elastic.Markdown/Slices/_ViewModels.cs
@@ -10,7 +10,7 @@ public class IndexViewModel
{
public required string Title { get; init; }
public required string MarkdownHtml { get; init; }
- public required DocumentationFolder Tree { get; init; }
+ public required DocumentationGroup Tree { get; init; }
public required IReadOnlyCollection PageTocItems { get; init; }
public required MarkdownFile CurrentDocument { get; init; }
public required string NavigationHtml { get; init; }
@@ -22,7 +22,7 @@ public class LayoutViewModel
{
public string Title { get; set; } = "Elastic Documentation";
public required IReadOnlyCollection PageTocItems { get; init; }
- public required DocumentationFolder Tree { get; init; }
+ public required DocumentationGroup Tree { get; init; }
public required MarkdownFile CurrentDocument { get; init; }
public required string NavigationHtml { get; set; }
public required string? UrlPathPrefix { get; set; }
@@ -62,7 +62,7 @@ public class PageTocItem
public class NavigationViewModel
{
- public required DocumentationFolder Tree { get; init; }
+ public required DocumentationGroup Tree { get; init; }
public required MarkdownFile CurrentDocument { get; init; }
}
@@ -70,5 +70,5 @@ public class NavigationTreeItem
{
public required int Level { get; init; }
public required MarkdownFile CurrentDocument { get; init; }
- public required DocumentationFolder SubTree { get; init; }
+ public required DocumentationGroup SubTree { get; init; }
}
diff --git a/src/Elastic.Markdown/SourceGenerationContext.cs b/src/Elastic.Markdown/SourceGenerationContext.cs
new file mode 100644
index 00000000..c489a119
--- /dev/null
+++ b/src/Elastic.Markdown/SourceGenerationContext.cs
@@ -0,0 +1,16 @@
+// Licensed to Elasticsearch B.V under one or more agreements.
+// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
+// See the LICENSE file in the project root for more information
+
+using System.Text.Json.Serialization;
+using Elastic.Markdown.IO;
+
+namespace Elastic.Markdown;
+
+// This configures the source generation for json (de)serialization.
+
+[JsonSourceGenerationOptions(WriteIndented = true)]
+[JsonSerializable(typeof(GenerationState))]
+[JsonSerializable(typeof(LinkReference))]
+[JsonSerializable(typeof(GitCheckoutInformation))]
+internal partial class SourceGenerationContext : JsonSerializerContext;
diff --git a/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs b/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs
index f48b2bc2..2bbfdb34 100644
--- a/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs
+++ b/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs
@@ -19,12 +19,12 @@ public void Create()
}
}
-public class GitConfigurationTests(ITestOutputHelper output) : NavigationTestsBase(output)
+public class GitCheckoutInformationTests(ITestOutputHelper output) : NavigationTestsBase(output)
{
[Fact]
public void Create()
{
- var git = GitConfiguration.Create(ReadFileSystem);
+ var git = GitCheckoutInformation.Create(ReadFileSystem);
git.Should().NotBeNull();
git!.Branch.Should().NotBeNullOrWhiteSpace();
From dd7ef9a2cc28bebef2f820e46198ae1206bb3e4c Mon Sep 17 00:00:00 2001
From: Martijn Laarman
Date: Mon, 13 Jan 2025 17:50:49 +0100
Subject: [PATCH 2/2] adjust namespaces
---
src/Elastic.Markdown/BuildContext.cs | 1 +
src/Elastic.Markdown/DocumentationGenerator.cs | 1 +
src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs | 2 +-
src/Elastic.Markdown/IO/Configuration/ITocItem.cs | 2 +-
src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs | 2 +-
src/Elastic.Markdown/IO/DocumentationSet.cs | 2 ++
src/Elastic.Markdown/IO/MarkdownFile.cs | 1 +
src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs | 4 +++-
src/Elastic.Markdown/IO/State/GenerationState.cs | 4 ++--
src/Elastic.Markdown/IO/State/LinkReference.cs | 3 ++-
src/Elastic.Markdown/Myst/Directives/IncludeBlock.cs | 1 +
src/Elastic.Markdown/Myst/Directives/SettingsBlock.cs | 1 +
src/Elastic.Markdown/Myst/MarkdownParser.cs | 1 +
src/Elastic.Markdown/Myst/ParserContext.cs | 1 +
src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml | 2 +-
src/Elastic.Markdown/Slices/_ViewModels.cs | 1 +
src/Elastic.Markdown/SourceGenerationContext.cs | 2 ++
tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs | 2 ++
tests/Elastic.Markdown.Tests/DocSet/NavigationTestsBase.cs | 1 +
19 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/src/Elastic.Markdown/BuildContext.cs b/src/Elastic.Markdown/BuildContext.cs
index 95c6cb13..04932301 100644
--- a/src/Elastic.Markdown/BuildContext.cs
+++ b/src/Elastic.Markdown/BuildContext.cs
@@ -4,6 +4,7 @@
using System.IO.Abstractions;
using Elastic.Markdown.Diagnostics;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Discovery;
namespace Elastic.Markdown;
diff --git a/src/Elastic.Markdown/DocumentationGenerator.cs b/src/Elastic.Markdown/DocumentationGenerator.cs
index adb50fae..cf820829 100644
--- a/src/Elastic.Markdown/DocumentationGenerator.cs
+++ b/src/Elastic.Markdown/DocumentationGenerator.cs
@@ -5,6 +5,7 @@
using System.Reflection;
using System.Text.Json;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.State;
using Elastic.Markdown.Slices;
using Microsoft.Extensions.Logging;
diff --git a/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs b/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs
index 1a8bf159..437ac461 100644
--- a/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs
+++ b/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs
@@ -8,7 +8,7 @@
using YamlDotNet.Core;
using YamlDotNet.RepresentationModel;
-namespace Elastic.Markdown.IO;
+namespace Elastic.Markdown.IO.Configuration;
public record ConfigurationFile : DocumentationFile
{
diff --git a/src/Elastic.Markdown/IO/Configuration/ITocItem.cs b/src/Elastic.Markdown/IO/Configuration/ITocItem.cs
index 85c25c24..b6262ec2 100644
--- a/src/Elastic.Markdown/IO/Configuration/ITocItem.cs
+++ b/src/Elastic.Markdown/IO/Configuration/ITocItem.cs
@@ -2,7 +2,7 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information
-namespace Elastic.Markdown.IO;
+namespace Elastic.Markdown.IO.Configuration;
public interface ITocItem;
diff --git a/src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs b/src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs
index abcb7d39..39596c0c 100644
--- a/src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs
+++ b/src/Elastic.Markdown/IO/Discovery/GitCheckoutInformation.cs
@@ -6,7 +6,7 @@
using System.Text.Json.Serialization;
using SoftCircuits.IniFileParser;
-namespace Elastic.Markdown.IO;
+namespace Elastic.Markdown.IO.Discovery;
public record GitCheckoutInformation
{
diff --git a/src/Elastic.Markdown/IO/DocumentationSet.cs b/src/Elastic.Markdown/IO/DocumentationSet.cs
index c0d652ab..9793b996 100644
--- a/src/Elastic.Markdown/IO/DocumentationSet.cs
+++ b/src/Elastic.Markdown/IO/DocumentationSet.cs
@@ -4,6 +4,8 @@
using System.IO.Abstractions;
using Elastic.Markdown.Diagnostics;
+using Elastic.Markdown.IO.Configuration;
+using Elastic.Markdown.IO.Navigation;
using Elastic.Markdown.Myst;
namespace Elastic.Markdown.IO;
diff --git a/src/Elastic.Markdown/IO/MarkdownFile.cs b/src/Elastic.Markdown/IO/MarkdownFile.cs
index f9593049..0a909a16 100644
--- a/src/Elastic.Markdown/IO/MarkdownFile.cs
+++ b/src/Elastic.Markdown/IO/MarkdownFile.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information
using System.IO.Abstractions;
using Elastic.Markdown.Diagnostics;
+using Elastic.Markdown.IO.Navigation;
using Elastic.Markdown.Myst;
using Elastic.Markdown.Myst.Directives;
using Elastic.Markdown.Myst.FrontMatter;
diff --git a/src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs b/src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs
index 492e959f..848ed9d1 100644
--- a/src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs
+++ b/src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs
@@ -2,7 +2,9 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information
-namespace Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Configuration;
+
+namespace Elastic.Markdown.IO.Navigation;
public interface INavigationItem
{
diff --git a/src/Elastic.Markdown/IO/State/GenerationState.cs b/src/Elastic.Markdown/IO/State/GenerationState.cs
index c592cc20..f7492198 100644
--- a/src/Elastic.Markdown/IO/State/GenerationState.cs
+++ b/src/Elastic.Markdown/IO/State/GenerationState.cs
@@ -3,9 +3,9 @@
// See the LICENSE file in the project root for more information
using System.Text.Json.Serialization;
-using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Discovery;
-namespace Elastic.Markdown;
+namespace Elastic.Markdown.IO.State;
public record GenerationState
{
diff --git a/src/Elastic.Markdown/IO/State/LinkReference.cs b/src/Elastic.Markdown/IO/State/LinkReference.cs
index f04a448a..73509da5 100644
--- a/src/Elastic.Markdown/IO/State/LinkReference.cs
+++ b/src/Elastic.Markdown/IO/State/LinkReference.cs
@@ -3,8 +3,9 @@
// See the LICENSE file in the project root for more information
using System.Text.Json.Serialization;
+using Elastic.Markdown.IO.Discovery;
-namespace Elastic.Markdown.IO;
+namespace Elastic.Markdown.IO.State;
public record LinkReference
{
diff --git a/src/Elastic.Markdown/Myst/Directives/IncludeBlock.cs b/src/Elastic.Markdown/Myst/Directives/IncludeBlock.cs
index 93bd525b..a2ee2b79 100644
--- a/src/Elastic.Markdown/Myst/Directives/IncludeBlock.cs
+++ b/src/Elastic.Markdown/Myst/Directives/IncludeBlock.cs
@@ -4,6 +4,7 @@
using System.IO.Abstractions;
using Elastic.Markdown.Diagnostics;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Configuration;
using Elastic.Markdown.Myst.FrontMatter;
namespace Elastic.Markdown.Myst.Directives;
diff --git a/src/Elastic.Markdown/Myst/Directives/SettingsBlock.cs b/src/Elastic.Markdown/Myst/Directives/SettingsBlock.cs
index 9ea1442b..5bc5577e 100644
--- a/src/Elastic.Markdown/Myst/Directives/SettingsBlock.cs
+++ b/src/Elastic.Markdown/Myst/Directives/SettingsBlock.cs
@@ -4,6 +4,7 @@
using System.IO.Abstractions;
using Elastic.Markdown.Diagnostics;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Configuration;
using Elastic.Markdown.Myst.FrontMatter;
namespace Elastic.Markdown.Myst.Directives;
diff --git a/src/Elastic.Markdown/Myst/MarkdownParser.cs b/src/Elastic.Markdown/Myst/MarkdownParser.cs
index d45b1cc4..6105459c 100644
--- a/src/Elastic.Markdown/Myst/MarkdownParser.cs
+++ b/src/Elastic.Markdown/Myst/MarkdownParser.cs
@@ -5,6 +5,7 @@
using System.IO.Abstractions;
using Cysharp.IO;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Configuration;
using Elastic.Markdown.Myst.CodeBlocks;
using Elastic.Markdown.Myst.Comments;
using Elastic.Markdown.Myst.Directives;
diff --git a/src/Elastic.Markdown/Myst/ParserContext.cs b/src/Elastic.Markdown/Myst/ParserContext.cs
index a75c2798..6a2583f7 100644
--- a/src/Elastic.Markdown/Myst/ParserContext.cs
+++ b/src/Elastic.Markdown/Myst/ParserContext.cs
@@ -5,6 +5,7 @@
using System.IO.Abstractions;
using Elastic.Markdown.Diagnostics;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Configuration;
using Elastic.Markdown.Myst.FrontMatter;
using Markdig;
using Markdig.Parsers;
diff --git a/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml b/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml
index 2dc4665d..a77fdd9f 100644
--- a/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml
+++ b/src/Elastic.Markdown/Slices/Layout/_TocTreeNav.cshtml
@@ -1,4 +1,4 @@
-@using Elastic.Markdown.IO
+@using Elastic.Markdown.IO.Navigation
@inherits RazorSlice
@foreach (var item in Model.SubTree.NavigationItems)
{
diff --git a/src/Elastic.Markdown/Slices/_ViewModels.cs b/src/Elastic.Markdown/Slices/_ViewModels.cs
index 1a89034d..16a77a6d 100644
--- a/src/Elastic.Markdown/Slices/_ViewModels.cs
+++ b/src/Elastic.Markdown/Slices/_ViewModels.cs
@@ -2,6 +2,7 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Navigation;
using Elastic.Markdown.Myst.FrontMatter;
namespace Elastic.Markdown.Slices;
diff --git a/src/Elastic.Markdown/SourceGenerationContext.cs b/src/Elastic.Markdown/SourceGenerationContext.cs
index c489a119..5ae58eb9 100644
--- a/src/Elastic.Markdown/SourceGenerationContext.cs
+++ b/src/Elastic.Markdown/SourceGenerationContext.cs
@@ -4,6 +4,8 @@
using System.Text.Json.Serialization;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Discovery;
+using Elastic.Markdown.IO.State;
namespace Elastic.Markdown;
diff --git a/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs b/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs
index 2bbfdb34..95ebfafb 100644
--- a/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs
+++ b/tests/Elastic.Markdown.Tests/DocSet/LinkReferenceTests.cs
@@ -3,6 +3,8 @@
// See the LICENSE file in the project root for more information
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Discovery;
+using Elastic.Markdown.IO.State;
using FluentAssertions;
using Xunit.Abstractions;
diff --git a/tests/Elastic.Markdown.Tests/DocSet/NavigationTestsBase.cs b/tests/Elastic.Markdown.Tests/DocSet/NavigationTestsBase.cs
index fc001308..fabac673 100644
--- a/tests/Elastic.Markdown.Tests/DocSet/NavigationTestsBase.cs
+++ b/tests/Elastic.Markdown.Tests/DocSet/NavigationTestsBase.cs
@@ -6,6 +6,7 @@
using System.IO.Abstractions.TestingHelpers;
using Elastic.Markdown.Diagnostics;
using Elastic.Markdown.IO;
+using Elastic.Markdown.IO.Configuration;
using FluentAssertions;
using Xunit.Abstractions;