Exemplo n.º 1
0
        /// <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()));
        }
Exemplo n.º 2
0
        /// <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());
        }
Exemplo n.º 3
0
        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>()));
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 private static SObject TranslateArray(ScriptProcessor processor, Array array) =>
 processor.CreateArray(array.Cast <object>().Select((t, i) =>
                                                    Translate(processor, array.GetValue(i))).ToArray());
Exemplo n.º 7
0
        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());
        }
Exemplo n.º 8
0
 private static SObject TranslateArray(ScriptProcessor processor, Array array) =>
     processor.CreateArray(array.Cast<object>().Select((t, i) =>
             Translate(processor, array.GetValue(i))).ToArray());
Exemplo n.º 9
0
        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;
        }
Exemplo n.º 10
0
        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;
        }