using System.IO; using System.Reflection; namespace Explorer.App; public static class DocumentationLoader { public const string EmbeddedName = "Explorer.Documentation.md"; public const string FileName = "Documentation.md"; public static LoadedDocumentation Load() { foreach (var path in CandidatePaths()) { try { if (File.Exists(path)) { return new LoadedDocumentation(File.ReadAllText(path), path); } } catch (IOException) { // try the next candidate } } var assembly = typeof(DocumentationLoader).Assembly; using var stream = assembly.GetManifestResourceStream(EmbeddedName); if (stream is null) { return new LoadedDocumentation( "# Documentation\n\nThe user guide file was not found. Add `docs/Documentation.md` to the project.", null); } using var reader = new StreamReader(stream); return new LoadedDocumentation(reader.ReadToEnd(), null); } public static IEnumerable CandidatePaths() { var baseDir = AppContext.BaseDirectory; yield return Path.Combine(baseDir, FileName); yield return Path.Combine(baseDir, "docs", FileName); var dir = new DirectoryInfo(baseDir); for (var n = 0; n < 8 && dir is not null; n++, dir = dir.Parent) { yield return Path.Combine(dir.FullName, "docs", FileName); yield return Path.Combine(dir.FullName, FileName); } } } public sealed record LoadedDocumentation(string Markdown, string? SourcePath);