diff --git a/readme.md b/readme.md index ba0d7a88..1d1a6549 100644 --- a/readme.md +++ b/readme.md @@ -28,9 +28,6 @@ A [dotnet tool](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools) * [Mark resulting files as read only](#mark-resulting-files-as-read-only) * [Table of contents](#table-of-contents) * [LinkFormat](#linkformat) - * [Release Notes](#release-notes) - * [Credits](#credits) - * [Icon](#icon) diff --git a/src/MarkdownSnippets/Processing/DirectoryMarkdownProcessor.cs b/src/MarkdownSnippets/Processing/DirectoryMarkdownProcessor.cs index b3b52480..ad144b65 100644 --- a/src/MarkdownSnippets/Processing/DirectoryMarkdownProcessor.cs +++ b/src/MarkdownSnippets/Processing/DirectoryMarkdownProcessor.cs @@ -12,6 +12,7 @@ public class DirectoryMarkdownProcessor DirectoryFilter directoryFilter; bool readOnly; int tocLevel; + IEnumerable tocExcludes; Action log; string targetDirectory; List sourceMdFiles = new List(); @@ -29,12 +30,15 @@ public class DirectoryMarkdownProcessor DirectoryFilter directoryFilter = null, bool readOnly = true, LinkFormat linkFormat = LinkFormat.GitHub, - int tocLevel = 2) + int tocLevel = 2, + IEnumerable tocExcludes = null) { this.writeHeader = writeHeader; this.directoryFilter = directoryFilter; this.readOnly = readOnly; this.tocLevel = tocLevel; + this.tocExcludes = tocExcludes; + if (appendSnippetGroup == null) { this.appendSnippetGroup = new SnippetMarkdownHandling(targetDirectory, linkFormat).AppendGroup; @@ -123,7 +127,13 @@ public void Run() { Guard.AgainstNull(snippets, nameof(snippets)); Guard.AgainstNull(snippetSourceFiles, nameof(snippetSourceFiles)); - var processor = new MarkdownProcessor(snippets.ToDictionary(), appendSnippetGroup, snippetSourceFiles, writeHeader, tocLevel); + var processor = new MarkdownProcessor( + snippets.ToDictionary(), + appendSnippetGroup, + snippetSourceFiles, + writeHeader, + tocLevel, + tocExcludes); foreach (var sourceFile in sourceMdFiles) { ProcessFile(sourceFile, processor); diff --git a/src/MarkdownSnippets/Processing/MarkdownProcessor.cs b/src/MarkdownSnippets/Processing/MarkdownProcessor.cs index ba09ee13..6c88c6a0 100644 --- a/src/MarkdownSnippets/Processing/MarkdownProcessor.cs +++ b/src/MarkdownSnippets/Processing/MarkdownProcessor.cs @@ -15,6 +15,7 @@ public class MarkdownProcessor AppendSnippetGroupToMarkdown appendSnippetGroup; bool writeHeader; int tocLevel; + List tocExcludes; List snippetSourceFiles; public MarkdownProcessor( @@ -22,7 +23,8 @@ public class MarkdownProcessor AppendSnippetGroupToMarkdown appendSnippetGroup, IReadOnlyList snippetSourceFiles, bool writeHeader, - int tocLevel) + int tocLevel, + IEnumerable tocExcludes = null) { Guard.AgainstNull(snippets, nameof(snippets)); Guard.AgainstNull(appendSnippetGroup, nameof(appendSnippetGroup)); @@ -32,6 +34,15 @@ public class MarkdownProcessor this.appendSnippetGroup = appendSnippetGroup; this.writeHeader = writeHeader; this.tocLevel = tocLevel; + if (tocExcludes == null) + { + this.tocExcludes = new List(); + } + else + { + this.tocExcludes = tocExcludes.ToList(); + } + InitSourceFiles(snippetSourceFiles); } @@ -132,7 +143,7 @@ void AppendLine(string s) if (tocLine != null) { - tocLine.Current = TocBuilder.BuildToc(headerLines, tocLevel); + tocLine.Current = TocBuilder.BuildToc(headerLines, tocLevel, tocExcludes); } return new ProcessResult( diff --git a/src/MarkdownSnippets/Processing/TocBuilder.cs b/src/MarkdownSnippets/Processing/TocBuilder.cs index 7a89702c..14a592dc 100644 --- a/src/MarkdownSnippets/Processing/TocBuilder.cs +++ b/src/MarkdownSnippets/Processing/TocBuilder.cs @@ -4,7 +4,7 @@ static class TocBuilder { - public static string BuildToc(List headerLines, int level) + public static string BuildToc(List headerLines, int level, List tocExcludes) { var processed = new List(); var builder = new StringBuilder(@" @@ -22,21 +22,28 @@ public static string BuildToc(List headerLines, int level) { continue; } + var headerLevel = current.Length - trimmedHash.Length; if (headerLevel == 1) { continue; } + if (headerLevel > headerDepth) { continue; } + var title = current.Substring(3).Trim(); + if (tocExcludes.Contains(title)) + { + continue; + } + headingCount++; - var title = current.Substring(3).Trim(); var link = BuildLink(processed, title); - var indent = new string(' ', (headerLevel-1)*2); + var indent = new string(' ', (headerLevel - 1) * 2); builder.AppendLine($"{indent}* [{title}](#{link})"); } @@ -44,6 +51,7 @@ public static string BuildToc(List headerLines, int level) { return string.Empty; } + builder.AppendLine(""); return builder.ToString(); } diff --git a/src/Tests/DirectoryMarkdownProcessor/DirectoryMarkdownProcessorTests.cs b/src/Tests/DirectoryMarkdownProcessor/DirectoryMarkdownProcessorTests.cs index e4498cb1..b0f1599b 100644 --- a/src/Tests/DirectoryMarkdownProcessor/DirectoryMarkdownProcessorTests.cs +++ b/src/Tests/DirectoryMarkdownProcessor/DirectoryMarkdownProcessorTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -18,7 +19,13 @@ public void Run() targetDirectory: root, scanForMdFiles: false, scanForSnippets: false, - tocLevel: 1); + tocLevel: 1, + tocExcludes: new List + { + "Icon", + "Credits", + "Release Notes" + }); processor.IncludeMdFiles(Path.Combine(root, "readme.source.md")); var doc = Path.Combine(root, "docs"); var files = Directory.EnumerateFiles(doc, "*.source.md", SearchOption.AllDirectories).ToArray(); diff --git a/src/Tests/MarkdownProcessor/TocBuilderTests.Exclude.approved.txt b/src/Tests/MarkdownProcessor/TocBuilderTests.Exclude.approved.txt new file mode 100644 index 00000000..3399bd79 --- /dev/null +++ b/src/Tests/MarkdownProcessor/TocBuilderTests.Exclude.approved.txt @@ -0,0 +1,5 @@ + +## Contents + + * [Heading1](#heading1) + diff --git a/src/Tests/MarkdownProcessor/TocBuilderTests.cs b/src/Tests/MarkdownProcessor/TocBuilderTests.cs index 1d94603b..033960c0 100644 --- a/src/Tests/MarkdownProcessor/TocBuilderTests.cs +++ b/src/Tests/MarkdownProcessor/TocBuilderTests.cs @@ -14,7 +14,7 @@ public void EmptyHeading() new Line("##", "", 0) }; - Approvals.Verify(TocBuilder.BuildToc(lines,1)); + Approvals.Verify(TocBuilder.BuildToc(lines, 1, new List())); } [Fact] @@ -26,7 +26,19 @@ public void IgnoreTop() new Line("## Heading2", "", 0) }; - Approvals.Verify(TocBuilder.BuildToc(lines,1)); + Approvals.Verify(TocBuilder.BuildToc(lines, 1, new List())); + } + + [Fact] + public void Exclude() + { + var lines = new List + { + new Line("## Heading1", "", 0), + new Line("### Heading2", "", 0) + }; + + Approvals.Verify(TocBuilder.BuildToc(lines, 1, new List {"Heading2"})); } [Fact] @@ -40,8 +52,9 @@ public void Nested() new Line("### Heading4", "", 0) }; - Approvals.Verify(TocBuilder.BuildToc(lines,2)); + Approvals.Verify(TocBuilder.BuildToc(lines, 2, new List())); } + [Fact] public void StopAtLevel() { @@ -52,7 +65,7 @@ public void StopAtLevel() new Line("#### Heading3", "", 0) }; - Approvals.Verify(TocBuilder.BuildToc(lines,2)); + Approvals.Verify(TocBuilder.BuildToc(lines, 2, new List())); } [Fact] @@ -63,7 +76,7 @@ public void Single() new Line("## Heading", "", 0) }; - Approvals.Verify(TocBuilder.BuildToc(lines,1)); + Approvals.Verify(TocBuilder.BuildToc(lines, 1, new List())); } [Fact] @@ -74,7 +87,7 @@ public void WithSpaces() new Line("## A B ", "", 0) }; - Approvals.Verify(TocBuilder.BuildToc(lines,1)); + Approvals.Verify(TocBuilder.BuildToc(lines, 1, new List())); } [Fact] @@ -87,7 +100,7 @@ public void Duplicates() new Line("## a", "", 0) }; - Approvals.Verify(TocBuilder.BuildToc(lines,1)); + Approvals.Verify(TocBuilder.BuildToc(lines, 1, new List())); } public TocBuilderTests(ITestOutputHelper output) :