public static string ProcessTemplate()

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();
        }