在C#中使用Markdig设置根目录

问题描述 投票:0回答:1

有没有办法告诉 Markdig 在哪里查找相对于根目录的文件?

我正在从项目的根目录中读取 README.md 文件,该文件由 C# 中的硬编码路径定义。然后通过 Markdig 将其从 Markdown 转换为 FlowDocument 并显示为 WPF 页面。所有这些都有效,除了 README.md 文件中的图像链接不会被渲染。我假设这是因为 Markdig 中的渲染器无法找到它们,不知道查看与项目根目录的关系。这是代码:

    public partial class ReadmeWindow : Window
    {
        public ReadmeWindow()
        {
            InitializeComponent();
            Loaded += OnReadmeLoaded;
        }

        private static Markdig.MarkdownPipeline BuildPipeline()
        {
            return new Markdig.MarkdownPipelineBuilder()
                .UseSupportedExtensions()
                .Build();
        }

        private void OnReadmeLoaded(object sender, RoutedEventArgs e)
        {
            var projectDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..\\..\\..\\"));
            var readmePath = Path.Combine(projectDirectory, "README.md");

            if (File.Exists(readmePath))
            {
                var markdown = File.ReadAllText(readmePath);
                Markdown.ToXaml(markdown);
                var xaml = Markdig.Wpf.Markdown.ToXaml(markdown, BuildPipeline());
                using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xaml)))
                {
                    using (var reader = new XamlXmlReader(stream, new MyXamlSchemaContext()))
                    {
                        if (XamlReader.Load(reader) is FlowDocument document)
                        {
                            Viewer.Document = document;
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Markdown file not found: " + readmePath);
            }
        }

您可以在上面的 OnReadmeLoaded() 方法中看到我从项目的根目录读取文件。

有没有办法告诉 Markdig 在哪里查找相对于根目录的文件? 例如,图像位于 project root/Docs:

![key details](Docs/key-details.PNG)
c# wpf markdown markdig
1个回答
0
投票

嗯,我不知道Markdig是否有“根”目录的设置,我找不到。但是,我找到了一种让它发挥作用的方法。

假设您要访问的 root/Docs 目录中有两个 PNG 文件,您可以在编译时将它们添加到 csproj 文件中,将它们设置为 ItemGroup 中的 Included 内容。 csproj 文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">
.
.
.
  <ItemGroup>
    <Content Include="Docs\keystore.PNG" Link="Docs\keystore.PNG">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="Docs\key-details.PNG" Link="Docs\key-details.PNG">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

当像这样写入 Markdown 文件时,Markdig 解析器将找到这些 Included 文件:

![keystore](Docs/keystore.PNG)
![key details](Docs/key-details.PNG)

瞧!

© www.soinside.com 2019 - 2024. All rights reserved.