in src/extensions/template_extension/TemplateHelpers.cs [43:144]
public static string ProcessTemplate(string template, Func<string, bool> evaluateCondition, Func<string, string> interpolate, Action<string> setVariable)
{
var lines = template.Split('\n').ToList();
var output = new StringBuilder();
var inTrueBranchNow = new Stack<bool>();
inTrueBranchNow.Push(true);
var skipElseBranches = new Stack<bool>();
skipElseBranches.Push(true);
foreach (var line in lines)
{
var trimmedLine = line.Trim('\n', '\r', ' ', '\t');
if (trimmedLine.StartsWith("{{if ") && trimmedLine.EndsWith("}}") && !trimmedLine.EndsWith("{{endif}}"))
{
var condition = trimmedLine[5..^2].Trim();
var evaluated = evaluateCondition(condition);
inTrueBranchNow.Push(evaluated);
skipElseBranches.Push(evaluated);
continue;
}
else if (trimmedLine.StartsWith("{{else if ") && trimmedLine.EndsWith("}}"))
{
if (inTrueBranchNow.Peek())
{
inTrueBranchNow.Pop();
inTrueBranchNow.Push(false);
// skipElseBranches.Peek() should already be true
continue;
}
else if (skipElseBranches.Peek())
{
continue;
}
var condition = trimmedLine[10..^2].Trim();
var evaluated = evaluateCondition(condition);
inTrueBranchNow.Pop();
inTrueBranchNow.Push(evaluated);
skipElseBranches.Pop();
skipElseBranches.Push(evaluated);
continue;
}
else if (trimmedLine.StartsWith("{{else}}"))
{
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 (trimmedLine.StartsWith("{{endif}}"))
{
inTrueBranchNow.Pop();
skipElseBranches.Pop();
continue;
}
else if (trimmedLine.StartsWith("{{set ") && trimmedLine.EndsWith("}}"))
{
if (inTrueBranchNow.All(b => b))
{
var assignment = trimmedLine[6..^2].Trim();
setVariable(assignment);
}
continue;
}
if (inTrueBranchNow.All(b => b))
{
var updated = line.TrimEnd('\n', '\r');
var firstLine = output.Length == 0;
if (!firstLine) output.AppendLine();
var inlineIfPos = updated.IndexOf("{{if ");
var inlineEndIfPos = updated.IndexOf("{{endif}}");
var inlineIfEndIf = inlineIfPos >= 0 && inlineEndIfPos >= 0 && inlineIfPos < inlineEndIfPos;
if (inlineIfEndIf)
{
updated = HandleInlineIf(updated, evaluateCondition, interpolate);
}
output.Append(interpolate(updated));
}
}
return output.ToString();
}