Files
LehrerApp/LehrerApp.Templating/TemplateMetadataText.cs
T
adminandClaude Opus 5.5 dd92128464 Klausur-Deckblätter als Sammel-PDF aus Vorlagen vom Typ exam-cover
Neuer Dialog "Deckblätter…" bei Klausuren, Punktetabelle als Drawing mit
festen Spaltenbreiten, FLOWDRAWBOX-Attribut fit=content, Stapel-Rendering
mit Seitenzahl je Datensatz, Kursbezeichnung und konfigurierbares Kürzel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 10:39:09 +02:00

62 lines
2.5 KiB
C#

namespace LehrerApp.Templating;
public static class TemplateMetadataKeys
{
public const string Language = "language";
public const string ReportType = "report-type";
}
/// <summary>Bekannte Werte für <see cref="TemplateMetadataKeys.ReportType"/>. Pakete ohne Angabe
/// (oder mit einem anderen Wert) gelten wie bisher als Brief-/Arbeitsblattvorlage.</summary>
public static class TemplateReportTypes
{
public const string Letter = "letter";
public const string ExamCover = "exam-cover";
}
public static class TemplateMetadataText
{
public const string FileName = "metadata.txt";
public static Dictionary<string, string> Parse(string source)
{
var result = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var lines = source.Replace("\r\n", "\n", StringComparison.Ordinal).Replace('\r', '\n').Split('\n');
for (var index = 0; index < lines.Length; index++)
{
var line = lines[index].Trim();
if (line.Length == 0 || line.StartsWith('#')) continue;
var separator = line.IndexOf('=');
if (separator < 1)
throw new InvalidDataException($"Metadatenzeile {index + 1} muss Schlüssel=Wert enthalten.");
var key = line[..separator].Trim();
var value = line[(separator + 1)..].Trim();
Validate(key, value);
if (!result.TryAdd(key, value))
throw new InvalidDataException($"Metadatenschlüssel „{key}“ ist mehrfach vorhanden.");
}
return result;
}
public static string Serialize(IReadOnlyDictionary<string, string> metadata)
{
if (metadata.Count == 0) return "";
var lines = new List<string>(metadata.Count);
foreach (var (key, value) in metadata.OrderBy(x => x.Key, StringComparer.OrdinalIgnoreCase))
{
Validate(key, value);
lines.Add($"{key.Trim()}={value.Trim()}");
}
return string.Join('\n', lines) + "\n";
}
private static void Validate(string key, string value)
{
if (string.IsNullOrWhiteSpace(key)) throw new InvalidDataException("Ein Metadatenschlüssel darf nicht leer sein.");
if (key.Contains('=') || key.Contains('\n') || key.Contains('\r'))
throw new InvalidDataException($"Metadatenschlüssel „{key}“ enthält ein unzulässiges Zeichen.");
if (value.Contains('\n') || value.Contains('\r'))
throw new InvalidDataException($"Metadatenwert für „{key}“ darf nur eine Zeile umfassen.");
}
}