in src/extensions/template_extension/TemplateHelpers.cs [146:237]
private static string HandleInlineIf(string line, Func<string, bool> evaluateCondition, Func<string, string> interpolate)
{
var output = new StringBuilder();
var inTrueBranchNow = new Stack<bool>();
inTrueBranchNow.Push(true);
var skipElseBranches = new Stack<bool>();
skipElseBranches.Push(true);
var chars = line.ToCharArray();
var position = 0;
while (position < chars.Length)
{
var cch = CountCharsToCheck(chars, position);
if (cch == 1)
{
if (inTrueBranchNow.All(b => b))
{
output.Append(chars[position]);
}
position++;
continue;
}
var check = new string(chars, position, cch);
position += cch;
if (check.StartsWith("{{if ") && check.EndsWith("}}"))
{
var condition = check[5..^2].Trim();
var evaluated = evaluateCondition(condition);
inTrueBranchNow.Push(evaluated);
skipElseBranches.Push(evaluated);
continue;
}
else if (check.StartsWith("{{else if ") && check.EndsWith("}}"))
{
if (inTrueBranchNow.Peek())
{
inTrueBranchNow.Pop();
inTrueBranchNow.Push(false);
// skipElseBranches.Peek() should already be true
continue;
}
else if (skipElseBranches.Peek())
{
continue;
}
var condition = check[10..^2].Trim();
var evaluated = evaluateCondition(condition);
inTrueBranchNow.Pop();
inTrueBranchNow.Push(evaluated);
skipElseBranches.Pop();
skipElseBranches.Push(evaluated);
continue;
}
else if (check.StartsWith("{{else}}") && check.EndsWith("}}"))
{
if (inTrueBranchNow.Peek())
{
inTrueBranchNow.Pop();
inTrueBranchNow.Push(false);
// skipElseBranches.Peek() should already be true
continue;
}
else if (skipElseBranches.Peek())
{
continue;
}
inTrueBranchNow.Pop();
inTrueBranchNow.Push(true);
skipElseBranches.Pop();
skipElseBranches.Push(true);
continue;
}
else if (check.StartsWith("{{endif}}") && check.EndsWith("}}"))
{
inTrueBranchNow.Pop();
skipElseBranches.Pop();
continue;
}
else if (inTrueBranchNow.All(b => b))
{
output.Append(interpolate(check));
}
}
return output.ToString();
}