public object ExecScript(object targetObject, string script) { object returnValue = null; int lineIndex = 0; this.targetObject = targetObject; var lines = script.Split(new string[] { "\r\n" }, StringSplitOptions.None); ScriptLine lastScriptLine = null; while (lineIndex < lines.Count()) { var scriptLine = new ScriptLine(lineIndex, lines[lineIndex]); if (lastScriptLine != null) { if (scriptLine.Level == lastScriptLine.Level + 1) { scriptLine.ParentIndex = lastScriptLine.LineIndex; } else if (scriptLine.Level == lastScriptLine.Level) { scriptLine.ParentIndex = lastScriptLine.ParentIndex; } else if (scriptLine.Level == lastScriptLine.Level - 1) { var parentLine = scriptLines .Where(l => l.Level == scriptLine.Level - 1) .OrderBy(l => l.LineIndex) .LastOrDefault(); if (parentLine != null) { scriptLine.ParentIndex = parentLine.LineIndex; } } } scriptLines.Add(scriptLine); lastScriptLine = scriptLine; lineIndex++; } returnValue = ExecScriptInternal(targetObject, -1); return(returnValue); }
private bool ProcessIfBlock(object targetObject, ScriptLine scriptLine, string ifExpression) { var result = false; if (!scriptLines.Where(sl => sl.ParentIndex == scriptLine.LineIndex).Any()) { throw new IfWithoutBlockException(); } if (string.IsNullOrEmpty(ifExpression)) { result = true; } else { result = (bool)lineProcessor.ExecLine(targetObject, ifExpression); } if (result) { ExecScriptInternal(targetObject, scriptLine.LineIndex); } return(result); }