33// See the LICENSE file in the project root for more information
44using System . IO . Abstractions ;
55using Elastic . Markdown . Myst ;
6- using Elastic . Markdown . Myst . Directives ;
76using Elastic . Markdown . Slices ;
87using Markdig ;
98using Markdig . Extensions . Yaml ;
10- using Markdig . Helpers ;
119using Markdig . Syntax ;
1210using Slugify ;
1311
1412namespace Elastic . Markdown . IO ;
1513
16- public class MarkdownFile : DocumentationFile
14+ public record MarkdownFile : DocumentationFile
1715{
1816 private readonly SlugHelper _slugHelper = new ( ) ;
1917 private string ? _navigationTitle ;
2018
2119 public MarkdownFile ( IFileInfo sourceFile , IDirectoryInfo rootPath , MarkdownParser parser , BuildContext context )
2220 : base ( sourceFile , rootPath )
2321 {
24- ParentFolders = RelativePath . Split ( Path . DirectorySeparatorChar ) . SkipLast ( 1 ) . ToArray ( ) ;
2522 FileName = sourceFile . Name ;
2623 UrlPathPrefix = context . UrlPathPrefix ;
2724 MarkdownParser = parser ;
2825 }
2926
3027 public string ? UrlPathPrefix { get ; }
3128 private MarkdownParser MarkdownParser { get ; }
32- private FrontMatterParser FrontMatterParser { get ; } = new ( ) ;
3329 public YamlFrontMatter ? YamlFrontMatter { get ; private set ; }
3430 public string ? Title { get ; private set ; }
3531 public string ? NavigationTitle
@@ -38,16 +34,32 @@ public string? NavigationTitle
3834 private set => _navigationTitle = value ;
3935 }
4036
41- public List < PageTocItem > TableOfContents { get ; } = new ( ) ;
42- public IReadOnlyList < string > ParentFolders { get ; }
37+ private readonly List < PageTocItem > _tableOfContent = new ( ) ;
38+ public IReadOnlyCollection < PageTocItem > TableOfContents => _tableOfContent ;
39+
4340 public string FileName { get ; }
4441 public string Url => $ "{ UrlPathPrefix } /{ RelativePath . Replace ( ".md" , ".html" ) } ";
4542
46- public async Task ParseAsync ( Cancel ctx ) => await ParseFullAsync ( ctx ) ;
43+ private bool _instructionsParsed ;
44+
45+ public async Task < MarkdownDocument > MinimalParse ( Cancel ctx )
46+ {
47+ var document = await MarkdownParser . MinimalParseAsync ( SourceFile , ctx ) ;
48+ ReadDocumentInstructions ( document ) ;
49+ return document ;
50+ }
4751
4852 public async Task < MarkdownDocument > ParseFullAsync ( Cancel ctx )
4953 {
50- var document = await MarkdownParser . QuickParseAsync ( SourceFile , ctx ) ;
54+ if ( ! _instructionsParsed )
55+ await MinimalParse ( ctx ) ;
56+
57+ var document = await MarkdownParser . ParseAsync ( SourceFile , YamlFrontMatter , ctx ) ;
58+ return document ;
59+ }
60+
61+ private void ReadDocumentInstructions ( MarkdownDocument document )
62+ {
5163 if ( document . FirstOrDefault ( ) is YamlFrontMatterBlock yaml )
5264 {
5365 var raw = string . Join ( Environment . NewLine , yaml . Lines . Lines ) ;
@@ -63,14 +75,20 @@ public async Task<MarkdownDocument> ParseFullAsync(Cancel ctx)
6375 . Where ( title => ! string . IsNullOrWhiteSpace ( title ) )
6476 . Select ( title => new PageTocItem { Heading = title ! , Slug = _slugHelper . GenerateSlug ( title ) } )
6577 . ToList ( ) ;
66- TableOfContents . Clear ( ) ;
67- TableOfContents . AddRange ( contents ) ;
68- return document ;
78+ _tableOfContent . Clear ( ) ;
79+ _tableOfContent . AddRange ( contents ) ;
80+ _instructionsParsed = true ;
6981 }
7082
71- public async Task < string > CreateHtmlAsync ( YamlFrontMatter ? matter , Cancel ctx )
72- {
73- var document = await MarkdownParser . ParseAsync ( SourceFile , matter , ctx ) ;
74- return document . ToHtml ( MarkdownParser . Pipeline ) ;
75- }
83+
84+ public string CreateHtml ( MarkdownDocument document ) =>
85+ // var writer = new StringWriter();
86+ // var renderer = new HtmlRenderer(writer);
87+ // renderer.LinkRewriter = (s => s);
88+ // MarkdownParser.Pipeline.Setup(renderer);
89+ //
90+ // var document = MarkdownParser.Parse(markdown, pipeline);
91+ // renderer.Render(document);
92+ // writer.Flush();
93+ document . ToHtml ( MarkdownParser . Pipeline ) ;
7694}
0 commit comments