From 7a4e47a1db16dc4f3116b794998a405e37240346 Mon Sep 17 00:00:00 2001 From: Felipe Cotti Date: Thu, 13 Mar 2025 21:17:58 -0300 Subject: [PATCH 1/2] Adjust path resolution to enable Windows support. * On situations where we receive a prebuilt resource path string, an OS check is performed beforehand. --- src/Elastic.Markdown/BuildContext.cs | 2 +- .../DocumentationGenerator.cs | 2 +- .../DetectionRulesDocsBuilderExtension.cs | 2 +- .../IO/Configuration/ConfigurationFile.cs | 24 ++++++++++--------- src/Elastic.Markdown/IO/DocumentationSet.cs | 5 +++- src/docs-builder/Http/DocumentationWebHost.cs | 7 ++++-- 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/Elastic.Markdown/BuildContext.cs b/src/Elastic.Markdown/BuildContext.cs index df225fe40..523fb66e8 100644 --- a/src/Elastic.Markdown/BuildContext.cs +++ b/src/Elastic.Markdown/BuildContext.cs @@ -62,7 +62,7 @@ public BuildContext(DiagnosticsCollector collector, IFileSystem readFileSystem, DocumentationOutputDirectory = !string.IsNullOrWhiteSpace(output) ? WriteFileSystem.DirectoryInfo.New(output) - : WriteFileSystem.DirectoryInfo.New(Path.Combine(Paths.Root.FullName, ".artifacts/docs/html")); + : WriteFileSystem.DirectoryInfo.New(Path.Combine(Paths.Root.FullName, Path.Combine(".artifacts", "docs", "html"))); if (ConfigurationPath.FullName != DocumentationSourceDirectory.FullName) DocumentationSourceDirectory = ConfigurationPath.Directory!; diff --git a/src/Elastic.Markdown/DocumentationGenerator.cs b/src/Elastic.Markdown/DocumentationGenerator.cs index 833391926..dc1adca1a 100644 --- a/src/Elastic.Markdown/DocumentationGenerator.cs +++ b/src/Elastic.Markdown/DocumentationGenerator.cs @@ -146,7 +146,7 @@ private async Task ExtractEmbeddedStaticResources(Cancel ctx) if (resourceStream == null) continue; - var path = a.Replace("Elastic.Markdown.", "").Replace("_static.", "_static/"); + var path = a.Replace("Elastic.Markdown.", "").Replace("_static.", $"_static{Path.DirectorySeparatorChar}"); var outputFile = OutputFile(path); if (outputFile.Directory is { Exists: false }) diff --git a/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs b/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs index c7a3c2e54..9c71e53ad 100644 --- a/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs +++ b/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs @@ -80,7 +80,7 @@ public IReadOnlyCollection CreateTableOfContentItems( HashSet files ) { - var detectionRulesFolder = $"{Path.Combine(parentPath, detectionRules)}".TrimStart('/'); + var detectionRulesFolder = Path.Combine(parentPath, detectionRules).TrimStart(Path.DirectorySeparatorChar); var fs = Build.ReadFileSystem; var sourceDirectory = Build.DocumentationSourceDirectory; var path = fs.DirectoryInfo.New(fs.Path.GetFullPath(fs.Path.Combine(sourceDirectory.FullName, detectionRulesFolder))); diff --git a/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs b/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs index b6984b10c..73f2f5ca5 100644 --- a/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs +++ b/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs @@ -114,7 +114,7 @@ public ConfigurationFile(IFileInfo sourceFile, IDirectoryInfo rootPath, BuildCon throw; } - Globs = [.. ImplicitFolders.Select(f => Glob.Parse($"{f}/*.md"))]; + Globs = [.. ImplicitFolders.Select(f => Glob.Parse($"{f}{Path.DirectorySeparatorChar}*.md"))]; } private IReadOnlyCollection InstantiateExtensions() @@ -184,13 +184,13 @@ private List ReadChildren(YamlStreamReader reader, KeyValuePair ReadChildren(YamlStreamReader reader, KeyValuePair ReadChildren(YamlStreamReader reader, KeyValuePair ReadChildren(YamlStreamReader reader, KeyValuePair ReadChildren(YamlStreamReader reader, KeyValuePair ReadChildren(YamlStreamReader reader, KeyValuePair? valueAnchors) { + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + to = to.Replace('/', Path.DirectorySeparatorChar); + if (!FlatMappedFiles.TryGetValue(to, out var file)) { Build.EmitError(Configuration.SourceFile, $"Redirect {from} points to {to} which does not exist"); @@ -262,7 +265,7 @@ private DocumentationFile CreateMarkDownFile(IFileInfo file, BuildContext contex return new MarkdownFile(file, SourceDirectory, MarkdownParser, context, this); // we ignore files in folders that start with an underscore - if (relativePath.IndexOf("/_", StringComparison.Ordinal) > 0 || relativePath.StartsWith('_')) + if (relativePath.IndexOf($"{Path.DirectorySeparatorChar}_", StringComparison.Ordinal) > 0 || relativePath.StartsWith('_')) return new ExcludedFile(file, SourceDirectory); context.EmitError(Configuration.SourceFile, $"Not linked in toc: {relativePath}"); diff --git a/src/docs-builder/Http/DocumentationWebHost.cs b/src/docs-builder/Http/DocumentationWebHost.cs index c92854bab..146113e96 100644 --- a/src/docs-builder/Http/DocumentationWebHost.cs +++ b/src/docs-builder/Http/DocumentationWebHost.cs @@ -149,10 +149,13 @@ private static async Task ServeDocumentationFile(ReloadableGeneratorSta { var generator = holder.Generator; + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + slug = slug.Replace('/', Path.DirectorySeparatorChar); + var s = Path.GetExtension(slug) == string.Empty ? Path.Combine(slug, "index.md") : slug; if (!generator.DocumentationSet.FlatMappedFiles.TryGetValue(s, out var documentationFile)) { - s = Path.GetExtension(slug) == string.Empty ? slug + ".md" : s.Replace("/index.md", ".md"); + s = Path.GetExtension(slug) == string.Empty ? slug + ".md" : s.Replace($"{Path.DirectorySeparatorChar}index.md", ".md"); if (!generator.DocumentationSet.FlatMappedFiles.TryGetValue(s, out documentationFile)) { foreach (var extension in generator.Context.Configuration.EnabledExtensions) @@ -230,7 +233,7 @@ public IDirectoryContents GetDirectoryContents(string subpath) public IFileInfo GetFileInfo(string subpath) { - var path = subpath.Replace("/_static", ""); + var path = subpath.Replace($"{Path.DirectorySeparatorChar}_static", ""); var fileInfo = FirstYielding(path, static (a, p) => p.GetFileInfo(a)); if (fileInfo is null || !fileInfo.Exists) fileInfo = _embeddedProvider.GetFileInfo(subpath); From 1ca957ae72c5adb10db140c8f2ee8e59f36a374b Mon Sep 17 00:00:00 2001 From: Felipe Cotti Date: Fri, 14 Mar 2025 08:37:23 -0300 Subject: [PATCH 2/2] Use RuntimeInformation.IsOSPlatform() instead. --- src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs | 3 ++- src/Elastic.Markdown/IO/DocumentationSet.cs | 3 ++- src/docs-builder/Http/DocumentationWebHost.cs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs b/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs index 73f2f5ca5..7160afe3a 100644 --- a/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs +++ b/src/Elastic.Markdown/IO/Configuration/ConfigurationFile.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information using System.IO.Abstractions; +using System.Runtime.InteropServices; using DotNet.Globbing; using Elastic.Markdown.Diagnostics; using Elastic.Markdown.Extensions; @@ -277,7 +278,7 @@ private List ReadChildren(YamlStreamReader reader, KeyValuePair? valueAnchors) { - if (Environment.OSVersion.Platform == PlatformID.Win32NT) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) to = to.Replace('/', Path.DirectorySeparatorChar); if (!FlatMappedFiles.TryGetValue(to, out var file)) diff --git a/src/docs-builder/Http/DocumentationWebHost.cs b/src/docs-builder/Http/DocumentationWebHost.cs index 146113e96..c257a676c 100644 --- a/src/docs-builder/Http/DocumentationWebHost.cs +++ b/src/docs-builder/Http/DocumentationWebHost.cs @@ -4,6 +4,7 @@ using System.IO.Abstractions; using System.Net; +using System.Runtime.InteropServices; using Documentation.Builder.Diagnostics.LiveMode; using Elastic.Documentation.Tooling; using Elastic.Markdown; @@ -149,7 +150,7 @@ private static async Task ServeDocumentationFile(ReloadableGeneratorSta { var generator = holder.Generator; - if (Environment.OSVersion.Platform == PlatformID.Win32NT) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) slug = slug.Replace('/', Path.DirectorySeparatorChar); var s = Path.GetExtension(slug) == string.Empty ? Path.Combine(slug, "index.md") : slug;