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 49cccc5de..0a5dfacf2 100644 --- a/src/Elastic.Markdown/DocumentationGenerator.cs +++ b/src/Elastic.Markdown/DocumentationGenerator.cs @@ -147,7 +147,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); await _documentationFileExporter.CopyEmbeddedResource(outputFile, resourceStream, ctx); diff --git a/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs b/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs index 0bceb1f1c..57e9232cb 100644 --- a/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs +++ b/src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs @@ -81,7 +81,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 5ab17cd6d..e7b335104 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; @@ -114,7 +115,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() @@ -189,13 +190,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 (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + 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 +266,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..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,10 +150,13 @@ private static async Task ServeDocumentationFile(ReloadableGeneratorSta { var generator = holder.Generator; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + 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 +234,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);