ktsu.Frontmatter
1.4.0
Prefix Reserved
dotnet add package ktsu.Frontmatter --version 1.4.0
NuGet\Install-Package ktsu.Frontmatter -Version 1.4.0
<PackageReference Include="ktsu.Frontmatter" Version="1.4.0" />
<PackageVersion Include="ktsu.Frontmatter" Version="1.4.0" />
<PackageReference Include="ktsu.Frontmatter" />
paket add ktsu.Frontmatter --version 1.4.0
#r "nuget: ktsu.Frontmatter, 1.4.0"
#:package ktsu.Frontmatter@1.4.0
#addin nuget:?package=ktsu.Frontmatter&version=1.4.0
#tool nuget:?package=ktsu.Frontmatter&version=1.4.0
ktsu.Frontmatter
A .NET library for processing and manipulating YAML frontmatter in markdown files.
Features
- Extract, add, replace, and remove frontmatter from markdown documents
- Combine multiple frontmatter sections into a single section
- Standardize property names using intelligent matching
- Sort properties according to standard conventions
- Merge similar properties using different strategies
- High performance with caching for repeated operations
Installation
dotnet add package ktsu.Frontmatter
Usage
using ktsu.Frontmatter;
// Extract frontmatter from a markdown document
string markdown = File.ReadAllText("document.md");
var frontmatter = Frontmatter.ExtractFrontmatter(markdown);
// Add frontmatter to a document
var properties = new Dictionary<string, object>
{
{ "title", "My Document" },
{ "date", DateTime.Now },
{ "tags", new[] { "documentation", "markdown" } }
};
string withFrontmatter = Frontmatter.AddFrontmatter(markdown, properties);
// Replace frontmatter
string replaced = Frontmatter.ReplaceFrontmatter(markdown, properties);
// Remove frontmatter
string withoutFrontmatter = Frontmatter.RemoveFrontmatter(markdown);
// Combine multiple frontmatter sections
string combined = Frontmatter.CombineFrontmatter(markdown);
// Customize property naming and ordering
string customized = Frontmatter.CombineFrontmatter(
markdown,
FrontmatterNaming.Standard, // Standardize property names
FrontmatterOrder.Sorted, // Sort properties in standard order
FrontmatterMergeStrategy.Conservative // Merge similar properties
);
// Extract just the document body (content after frontmatter)
string body = Frontmatter.ExtractBody(markdown);
Advanced Features
Property Naming
Control how property names are handled:
FrontmatterNaming.AsIs: Keep property names as-isFrontmatterNaming.Standard: Standardize property names using common conventions
Property Ordering
Control how properties are ordered:
FrontmatterOrder.AsIs: Keep properties in the order they appearFrontmatterOrder.Sorted: Sort properties according to standard conventions
Merge Strategies
Control how similar properties are merged:
FrontmatterMergeStrategy.None: Do not merge any propertiesFrontmatterMergeStrategy.Conservative: Only merge properties using predefined mappingsFrontmatterMergeStrategy.Aggressive: Merge properties using basic pattern matchingFrontmatterMergeStrategy.Maximum: Merge properties using semantic analysis
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- ktsu.Extensions (>= 1.9.0)
- ktsu.FuzzySearch (>= 1.3.13)
- System.Memory (>= 4.6.3)
- System.Threading.Tasks.Extensions (>= 4.6.3)
- YamlDotNet (>= 18.1.0)
-
.NETStandard 2.1
- ktsu.Extensions (>= 1.9.0)
- ktsu.FuzzySearch (>= 1.3.13)
- YamlDotNet (>= 18.1.0)
-
net10.0
- ktsu.Extensions (>= 1.9.0)
- ktsu.FuzzySearch (>= 1.3.13)
- YamlDotNet (>= 18.1.0)
-
net8.0
- ktsu.Extensions (>= 1.9.0)
- ktsu.FuzzySearch (>= 1.3.13)
- YamlDotNet (>= 18.1.0)
-
net9.0
- ktsu.Extensions (>= 1.9.0)
- ktsu.FuzzySearch (>= 1.3.13)
- YamlDotNet (>= 18.1.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on ktsu.Frontmatter:
| Package | Downloads |
|---|---|
|
ktsu.KtsuTools.Markdown
KtsuTools is a unified developer tools suite that consolidates multiple ktsu-dev utilities into a single CLI application with consistent UX powered by Spectre.Console. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.4.0 | 0 | 9/30/2026 |
| 1.3.4 | 27 | 9/29/2026 |
| 1.3.3 | 35 | 9/29/2026 |
| 1.3.3-pre.1 | 45 | 9/28/2026 |
| 1.3.2 | 82 | 9/28/2026 |
| 1.3.1 | 82 | 9/27/2026 |
| 1.3.0 | 88 | 9/26/2026 |
| 1.2.41 | 94 | 9/26/2026 |
| 1.2.40 | 82 | 9/25/2026 |
| 1.2.39 | 193 | 9/25/2026 |
| 1.2.38 | 87 | 9/24/2026 |
| 1.2.37 | 122 | 9/23/2026 |
| 1.2.36 | 124 | 9/22/2026 |
| 1.2.35 | 159 | 9/22/2026 |
| 1.2.34 | 107 | 9/21/2026 |
| 1.2.33 | 153 | 9/18/2026 |
| 1.2.32 | 116 | 9/17/2026 |
| 1.2.31 | 141 | 9/16/2026 |
| 1.2.30 | 144 | 9/16/2026 |
| 1.2.29 | 121 | 9/15/2026 |
## v1.4.0 (minor)
Changes since v1.3.0:
- Assert the boolean round trip with IsFalse and Contains in scalar type tests ([@Claude](https://github.com/Claude))
- Use TryGetValue instead of ContainsKey plus indexer in scalar round-trip test ([@Claude](https://github.com/Claude))
- [minor] Keep scalar types and nulls through a frontmatter round trip ([@Claude](https://github.com/Claude))
- Keep a lone list property's key when merging properties [patch] ([@Claude](https://github.com/Claude))
- Keep the first body line's indentation when rewriting a document [patch] ([@Claude](https://github.com/Claude))
- Move CI onto the shared ci-shared.yml pipeline ([@Claude](https://github.com/Claude))
- [patch] Keep every frontmatter block when adding or combining properties ([@Claude](https://github.com/Claude))
- Merge keys that normalize alike under one name instead of swapping them [patch] ([@matt-edmondson](https://github.com/matt-edmondson))
- Use TryGetValue instead of ContainsKey plus indexer in collision test ([@matt-edmondson](https://github.com/matt-edmondson))
- Use TryGetValue instead of ContainsKey plus indexer in merge-isolation tests ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Keep both values when two keys standardize to the same name ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Stop the merge-strategy cache letting one call decide a key for every later call ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge remote-tracking branch 'origin/main' into fix/rule-under-header-stays-in-body ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Treat a frontmatter block with no YAML content as unreadable instead of throwing ([@Claude](https://github.com/Claude))
- [patch] Keep a thematic break directly under the header in the body ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Keep repeated items within a list when merging properties ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Recognise an opening delimiter with trailing whitespace or a leading BOM ([@matt-edmondson](https://github.com/matt-edmondson))