using System; using System.Collections.Generic; namespace UnityAtoms.Editor { internal class Templating { public static string ResolveConditionals(string template, List trueConditions) { var templateCopy = String.Copy(template); int indexIfOpened = templateCopy.LastIndexOf("<%IF ", StringComparison.Ordinal); if (indexIfOpened == -1) return templateCopy; // there are no IF blocks anymore -> finished processing. var indexIfClosed = templateCopy.IndexOf("%>", indexIfOpened + 5, StringComparison.Ordinal); if(indexIfClosed == -1) throw new Exception("Found Opened <%IF block but it was never closed (missing %> )"); var condition = templateCopy.Substring(indexIfOpened + 5, indexIfClosed - (indexIfOpened + 5)); var isNegatedCondition = condition.Substring(0, 1) == "!"; if (isNegatedCondition) { condition = condition.Substring(1); } var indexOfNextEndIf = templateCopy.IndexOf("<%ENDIF%>", indexIfClosed, StringComparison.Ordinal); if(indexOfNextEndIf == -1) throw new Exception($"No closing <%ENDIF%> for condition ."); var indexOfNextElse = templateCopy.IndexOf("<%ELSE%>", indexIfClosed, StringComparison.Ordinal); var endThenBlock = indexOfNextElse != -1 ? indexOfNextElse : indexOfNextEndIf; string resolved = ""; if (trueConditions.Contains(condition) ^ isNegatedCondition) { resolved = templateCopy.Substring(indexIfClosed + 2, endThenBlock - (indexIfClosed + 2)); }else if (indexOfNextElse != -1) { resolved = templateCopy.Substring(indexOfNextElse + 8, indexOfNextEndIf - (indexOfNextElse + 8)); } resolved = resolved.Trim('\n'); templateCopy = templateCopy.Remove(indexIfOpened, (indexOfNextEndIf + 9) - indexIfOpened); templateCopy = templateCopy.Insert(indexIfOpened, resolved); return ResolveConditionals(templateCopy, trueConditions); } } }