/// <summary> /// Parses a string as an array. /// </summary> internal new static SObject Parse(ScriptProcessor processor, string exp) { // Format: [item1, item2, ... itemn] if (Regex.IsMatch(exp, RegexEmptyArray)) { return(processor.CreateArray(0)); } exp = exp.Remove(exp.Length - 1, 1).Remove(0, 1).Trim(); // Remove [ and ]. var elements = new List <SObject>(); var elementStart = 0; var index = 0; var depth = 0; StringEscapeHelper escaper = new LeftToRightStringEscapeHelper(exp, 0); string element; while (index < exp.Length) { var t = exp[index]; escaper.CheckStartAt(index); if (!escaper.IsString) { if (t == '{' || t == '[' || t == '(') { depth++; } else if (t == '}' || t == ']' || t == ')') { depth--; } else if (t == ',' && depth == 0) { element = exp.Substring(elementStart, index - elementStart); elements.Add(string.IsNullOrWhiteSpace(element) ? processor.Undefined : processor.ExecuteStatement(new ScriptStatement(element))); elementStart = index + 1; } } index++; } element = exp.Substring(elementStart, index - elementStart); elements.Add(string.IsNullOrWhiteSpace(element) ? processor.Undefined : processor.ExecuteStatement(new ScriptStatement(element))); return(processor.CreateArray(elements.ToArray())); }
/// <summary> /// Parses a string as an array. /// </summary> internal new static SObject Parse(ScriptProcessor processor, string exp) { // Format: [item1, item2, ... itemn] if (Regex.IsMatch(exp, REGEX_EMPTY_ARRAY)) return processor.CreateArray(0); exp = exp.Remove(exp.Length - 1, 1).Remove(0, 1).Trim(); // Remove [ and ]. var elements = new List<SObject>(); var elementStart = 0; var index = 0; var depth = 0; StringEscapeHelper escaper = new LeftToRightStringEscapeHelper(exp, 0); string element; while (index < exp.Length) { var t = exp[index]; escaper.CheckStartAt(index); if (!escaper.IsString) { if (t == '{' || t == '[' || t == '(') { depth++; } else if (t == '}' || t == ']' || t == ')') { depth--; } else if (t == ',' && depth == 0) { element = exp.Substring(elementStart, index - elementStart); if (string.IsNullOrWhiteSpace(element)) elements.Add(processor.Undefined); else elements.Add(processor.ExecuteStatement(new ScriptStatement(element))); elementStart = index + 1; } } index++; } element = exp.Substring(elementStart, index - elementStart); if (string.IsNullOrWhiteSpace(element)) elements.Add(processor.Undefined); else elements.Add(processor.ExecuteStatement(new ScriptStatement(element))); return processor.CreateArray(elements.ToArray()); }
public static SObject Split(ScriptProcessor processor, SObject instance, SObject This, SObject[] parameters) { int limit = -1; string[] delimiters; string str = ((SString)instance).Value; if (TypeContract.Ensure(parameters, new[] { typeof(SArray), typeof(SNumber) })) { delimiters = ((SArray)parameters[0]).ArrayMembers.Select(m => m.ToString(processor).Value).ToArray(); limit = (int)((SNumber)parameters[1]).Value; } else if (TypeContract.Ensure(parameters, typeof(SArray))) { delimiters = ((SArray)parameters[0]).ArrayMembers.Select(m => m.ToString(processor).Value).ToArray(); } else if (TypeContract.Ensure(parameters, new[] { typeof(SString), typeof(SNumber) })) { delimiters = new[] { ((SString)parameters[0]).Value }; limit = (int)((SNumber)parameters[1]).Value; } else if (TypeContract.Ensure(parameters, typeof(SString))) { delimiters = new[] { ((SString)parameters[0]).Value }; } else { return(processor.CreateArray(new SObject[] { processor.CreateString(str) })); } var split = str.Split(delimiters, StringSplitOptions.None); if (limit >= 0 && split.Length > limit) { var result = new string[limit]; Array.Copy(split, result, limit); split = result; } return(processor.CreateArray(split.Select(processor.CreateString).ToArray <SObject>())); }
public static SObject Select(ScriptProcessor processor, SObject instance, SObject This, SObject[] parameters) { if (parameters.Length >= 1) { var arr = (SArray)instance; var comparer = (SFunction)Unbox(parameters[0]); var result = arr.ArrayMembers.Select(m => comparer.Call(processor, This, This, new[] { m })); return(processor.CreateArray(result.ToArray())); } return(processor.Undefined); }
public static SObject Where(ScriptProcessor processor, SObject instance, SObject This, SObject[] parameters) { if (parameters.Length >= 1) { var arr = (SArray)instance; var comparer = (SFunction)Unbox(parameters[0]); var results = arr.ArrayMembers.Where((m, i) => ((SBool)comparer.Call(processor, This, This, new[] { m, processor.CreateNumber(i) })).Value); return(processor.CreateArray(results.ToArray())); } return(processor.Undefined); }
private static SObject TranslateArray(ScriptProcessor processor, Array array) => processor.CreateArray(array.Cast <object>().Select((t, i) => Translate(processor, array.GetValue(i))).ToArray());
public static SObject Split(ScriptProcessor processor, SObject instance, SObject This, SObject[] parameters) { int limit = -1; string[] split; string[] delimiters; string str = (instance as SString).Value; if (TypeContract.Ensure(parameters, new[] { typeof(SArray), typeof(SNumber) })) { delimiters = (parameters[0] as SArray).ArrayMembers.Select(m => m.ToString(processor).Value).ToArray(); limit = (int)(parameters[1] as SNumber).Value; } else if (TypeContract.Ensure(parameters, typeof(SArray))) { delimiters = (parameters[0] as SArray).ArrayMembers.Select(m => m.ToString(processor).Value).ToArray(); } else if (TypeContract.Ensure(parameters, new[] { typeof(SString), typeof(SNumber) })) { delimiters = new[] { (parameters[0] as SString).Value }; limit = (int)(parameters[1] as SNumber).Value; } else if (TypeContract.Ensure(parameters, typeof(SString))) { delimiters = new[] { (parameters[0] as SString).Value }; } else { return processor.CreateArray(new[] { processor.CreateString(str) }); } split = str.Split(delimiters, StringSplitOptions.None); if (limit >= 0 && split.Length > limit) { var result = new string[limit]; Array.Copy(split, result, limit); split = result; } return processor.CreateArray(split.Select(m => processor.CreateString(m)).ToArray()); }
private static SObject TranslateArray(ScriptProcessor processor, Array array) => processor.CreateArray(array.Cast<object>().Select((t, i) => Translate(processor, array.GetValue(i))).ToArray());
public static SObject Select(ScriptProcessor processor, SObject instance, SObject This, SObject[] parameters) { if (parameters.Length >= 1) { var arr = (SArray)instance; var comparer = (SFunction)Unbox(parameters[0]); var result = arr.ArrayMembers.Select(m => comparer.Call(processor, This, This, new[] { m })); return processor.CreateArray(result.ToArray()); } return processor.Undefined; }
public static SObject Where(ScriptProcessor processor, SObject instance, SObject This, SObject[] parameters) { if (parameters.Length >= 1) { var arr = (SArray)instance; var comparer = (SFunction)Unbox(parameters[0]); var results = arr.ArrayMembers.Where((m, i) => ((SBool)comparer.Call(processor, This, This, new[] {m, processor.CreateNumber(i)})).Value); return processor.CreateArray(results.ToArray()); } return processor.Undefined; }