This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
namespace LehrerApp.Templating;
|
||||
|
||||
internal static class SystemVariables
|
||||
{
|
||||
internal const string CurrentPage = "curPage";
|
||||
internal const string MaximumPageNumber = "maxPageNum";
|
||||
internal const string Today = "today";
|
||||
|
||||
private static readonly string[] Names = [CurrentPage, MaximumPageNumber, Today];
|
||||
|
||||
internal static bool IsStandalone(string value) =>
|
||||
TryRead(value, 0, out var length) && length == value.Length;
|
||||
|
||||
internal static bool Contains(string value) => Names.Any(name =>
|
||||
value.Contains("$$" + name, StringComparison.Ordinal));
|
||||
|
||||
internal static bool TryRead(string source, int index, out int length)
|
||||
{
|
||||
length = 0;
|
||||
if (index < 0 || index + 2 > source.Length || source[index] != '$' || source[index + 1] != '$')
|
||||
return false;
|
||||
foreach (var name in Names)
|
||||
{
|
||||
var token = "$$" + name;
|
||||
if (!source.AsSpan(index).StartsWith(token, StringComparison.Ordinal)) continue;
|
||||
var end = index + token.Length;
|
||||
if (end < source.Length && (char.IsLetterOrDigit(source[end]) || source[end] is '_' or '-' or '.'))
|
||||
continue;
|
||||
length = token.Length;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static IEnumerable<(string Text, string? Name)> Split(string source)
|
||||
{
|
||||
var literalStart = 0;
|
||||
for (var index = 0; index < source.Length;)
|
||||
{
|
||||
if (!TryRead(source, index, out var length)) { index++; continue; }
|
||||
if (index > literalStart) yield return (source[literalStart..index], null);
|
||||
yield return (source.Substring(index, length), source.Substring(index + 2, length - 2));
|
||||
index += length;
|
||||
literalStart = index;
|
||||
}
|
||||
if (literalStart < source.Length) yield return (source[literalStart..], null);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user