2026-06-27 13:30:28 +01:00
|
|
|
using YamlDotNet.Serialization;
|
|
|
|
|
using YamlDotNet.Serialization.NamingConventions;
|
|
|
|
|
using Yavsc.Server.Models.Billing;
|
|
|
|
|
|
|
|
|
|
namespace Yavsc.Server.Services;
|
|
|
|
|
|
|
|
|
|
public static class FrontmatterParser
|
|
|
|
|
{
|
2026-07-04 22:58:29 +01:00
|
|
|
public const string YamlHeader = "---\n";
|
|
|
|
|
public const string YamlSeparator = "\n---";
|
2026-06-27 13:30:28 +01:00
|
|
|
|
|
|
|
|
private static readonly IDeserializer _deserializer =
|
|
|
|
|
new DeserializerBuilder()
|
|
|
|
|
.WithNamingConvention(CamelCaseNamingConvention.Instance)
|
|
|
|
|
.IgnoreUnmatchedProperties()
|
|
|
|
|
.Build();
|
|
|
|
|
|
|
|
|
|
public static FrontmatterOffreResult Parse(string markdown)
|
|
|
|
|
{
|
|
|
|
|
// Le contenu doit commencer par ----
|
2026-07-04 22:58:29 +01:00
|
|
|
if (!markdown.TrimStart().StartsWith(YamlHeader, StringComparison.Ordinal))
|
2026-06-27 13:30:28 +01:00
|
|
|
return new FrontmatterOffreResult { Corps = markdown };
|
2026-07-04 22:58:29 +01:00
|
|
|
|
|
|
|
|
var parts = markdown.Substring(YamlHeader.Length).Trim().Split(new[] { YamlSeparator }, 2,
|
2026-06-27 13:30:28 +01:00
|
|
|
StringSplitOptions.None);
|
|
|
|
|
if (parts.Length < 2)
|
|
|
|
|
return new FrontmatterOffreResult { Corps = markdown };
|
2026-07-04 22:58:29 +01:00
|
|
|
var yamlBlock = parts[0];
|
|
|
|
|
var corps = parts[1];
|
2026-06-27 13:30:28 +01:00
|
|
|
var meta = _deserializer.Deserialize<FrontmatterOffreResult>(yamlBlock);
|
|
|
|
|
meta.Corps = corps;
|
|
|
|
|
return meta;
|
|
|
|
|
}
|
|
|
|
|
}
|