Ejemplo n.º 1
0
        /// <summary>
        /// 15.5.4.12
        /// </summary>
        /// <param name="target"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public JsInstance SearchImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            // Converts the parameters to a regex
            if (parameters[0].Class == JsString.TYPEOF)
            {
                parameters[0] = Global.RegExpClass.New(parameters[0].ToString(), false, false, false);
            }

            Match m = ((Regex)(parameters[0].Value)).Match(target.ToString());

            if (m != null)
            {
                return(Global.NumberClass.New(m.Index));
            }
            else
            {
                return(Global.NumberClass.New(-1));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 15.5.4.10
        /// </summary>
        /// <param name="target"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public JsInstance MatchFunc(JsDictionaryObject target, JsInstance[] parameters)
        {
            // Converts the parameters to a regex
            if (parameters[0].Class == JsString.TYPEOF)
            {
                parameters[0] = Global.RegExpClass.New(parameters[0].ToString(), false, false, false);
            }

            JsArray result = Global.ArrayClass.New();
            int     i      = 0;
            var     match  = ((Regex)(parameters[0].Value)).Match(target.ToString());

            foreach (Group group in match.Groups)
            {
                result[i++.ToString()] = Global.StringClass.New(group.Value);
            }

            return(result);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 15.5.4.12
        /// </summary>
        /// <param name="target"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public JsInstance SearchImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            // Converts the parameters to a regex
            if (parameters[0].Class == JsInstance.CLASS_STRING)
            {
                parameters[0] = Global.RegExpClass.New(parameters[0].ToString(), false, false, false);
            }

            Match m = ((JsRegExp)parameters[0]).Regex.Match(target.ToString());

            if (m != null && m.Success)
            {
                return(Global.NumberClass.New(m.Index));
            }
            else
            {
                return(Global.NumberClass.New(-1));
            }
        }
Ejemplo n.º 4
0
        public JsInstance SliceImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            string str        = target.ToString();
            int    startIndex = (int)parameters[0].ToNumber();
            int    num        = str.Length;

            if (parameters.Length > 1)
            {
                num = (int)parameters[1].ToNumber();
                if (num < 0)
                {
                    num = str.Length + num;
                }
            }
            if (startIndex < 0)
            {
                startIndex = str.Length + startIndex;
            }
            return((JsInstance)this.Global.StringClass.New(str.Substring(startIndex, num - startIndex)));
        }
Ejemplo n.º 5
0
        public JsInstance IndexOfImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            string str1 = target.ToString();
            string str2 = parameters[0].ToString();
            int    num  = parameters.Length > 1 ? (int)parameters[1].ToNumber() : 0;

            if (str2 == string.Empty)
            {
                if (parameters.Length > 1)
                {
                    return((JsInstance)this.Global.NumberClass.New((double)Math.Min(str1.Length, num)));
                }
                return((JsInstance)this.Global.NumberClass.New(0.0));
            }
            if (num >= str1.Length)
            {
                return((JsInstance)this.Global.NumberClass.New(-1.0));
            }
            return((JsInstance)this.Global.NumberClass.New((double)str1.IndexOf(str2, num)));
        }
Ejemplo n.º 6
0
        public JsInstance SubstrImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            string str = target.ToString();
            int    start = 0, end = str.Length;

            if (parameters.Length > 0 && !double.IsNaN(parameters[0].ToNumber()))
            {
                start = Convert.ToInt32(parameters[0].ToNumber());
            }

            if (parameters.Length > 1 && parameters[1] != JsUndefined.Instance && !double.IsNaN(parameters[1].ToNumber()))
            {
                end = Convert.ToInt32(parameters[1].ToNumber());
            }

            start = Math.Min(Math.Max(start, 0), Math.Max(0, str.Length - 1));
            end   = Math.Min(Math.Max(end, 0), str.Length);
            str   = str.Substring(start, end);

            return(New(str));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 15.5.4.13
        /// </summary>
        /// <param name="target"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public JsInstance SliceImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            string source = target.ToString();
            int    start  = (int)parameters[0].ToNumber();
            int    end    = source.Length;

            if (parameters.Length > 1)
            {
                end = (int)parameters[1].ToNumber();
                if (end < 0)
                {
                    end = source.Length + end;
                }
            }

            if (start < 0)
            {
                start = source.Length + start;
            }

            return(Global.StringClass.New(source.Substring(start, end - start)));
        }
Ejemplo n.º 8
0
 public JsInstance ToStringImpl(JsDictionaryObject target, JsInstance[] parameters)
 {
     return(Global.StringClass.New(target.ToString()));
 }
Ejemplo n.º 9
0
        /// <summary>
        /// 15.5.5.1
        /// </summary>
        /// <param name="target"></param>
        /// <returns></returns>
        public JsInstance LengthImpl(JsDictionaryObject target)
        {
            string str = target.ToString();

            return(Global.NumberClass.New(str.Length));
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 15.5.4.19
        /// </summary>
        /// <param name="target"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public JsInstance ToLocaleUpperCaseImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            string str = target.ToString();

            return(Global.StringClass.New(str.ToUpper()));
        }
Ejemplo n.º 11
0
 /// <summary>
 /// 15.5.4.18
 /// </summary>
 /// <param name="target"></param>
 /// <param name="parameters"></param>
 /// <returns></returns>
 public JsInstance ToUpperCaseImpl(JsDictionaryObject target, JsInstance[] parameters)
 {
     return(Global.StringClass.New(target.ToString().ToUpperInvariant()));
 }
Ejemplo n.º 12
0
        /// <summary>
        /// 15.5.4.11
        /// </summary>
        /// <param name="target"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public JsInstance ReplaceImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            if (parameters.Length == 0)
            {
                return(Global.StringClass.New(target.ToString()));
            }

            JsInstance searchValue  = parameters[0];
            JsInstance replaceValue = JsUndefined.Instance;

            if (parameters.Length > 1)
            {
                replaceValue = parameters[1];
            }

            string source = target.ToString();

            JsFunction function = replaceValue as JsFunction;

            if (searchValue.Class == JsInstance.CLASS_REGEXP)
            {
                int count     = ((JsRegExp)parameters[0]).IsGlobal ? int.MaxValue : 1;
                var regexp    = ((JsRegExp)parameters[0]);
                int lastIndex = regexp.IsGlobal ? 0 : Math.Max(0, (int)regexp["lastIndex"].ToNumber() - 1);

                if (regexp.IsGlobal)
                {
                    regexp["lastIndex"] = Global.NumberClass.New(0);
                }

                if (replaceValue is JsFunction)
                {
                    string ret = ((JsRegExp)parameters[0]).Regex.Replace(source, delegate(Match m) {
                        List <JsInstance> replaceParameters = new List <JsInstance>();
                        if (!regexp.IsGlobal)
                        {
                            regexp["lastIndex"] = Global.NumberClass.New(m.Index + 1);
                        }

                        replaceParameters.Add(Global.StringClass.New(m.Value));
                        for (int i = 1; i < m.Groups.Count; i++)
                        {
                            if (m.Groups[i].Success)
                            {
                                replaceParameters.Add(Global.StringClass.New(m.Groups[i].Value));
                            }
                            else
                            {
                                replaceParameters.Add(JsUndefined.Instance);
                            }
                        }
                        replaceParameters.Add(Global.NumberClass.New(m.Index));
                        replaceParameters.Add(Global.StringClass.New(source));

                        Global.Visitor.ExecuteFunction(function, null, replaceParameters.ToArray());

                        return(Global.Visitor.Returned.ToString());
                    }, count, lastIndex);


                    return(Global.StringClass.New(ret));
                }
                else
                {
                    string str = parameters[1].ToString();
                    string ret = ((JsRegExp)parameters[0]).Regex.Replace(target.ToString(), delegate(Match m) {
                        if (!regexp.IsGlobal)
                        {
                            regexp["lastIndex"] = Global.NumberClass.New(m.Index + 1);
                        }

                        string after = source.Substring(Math.Min(source.Length - 1, m.Index + m.Length));
                        return(EvaluateReplacePattern(m.Value, source.Substring(0, m.Index), after, str, m.Groups));
                    }, count, lastIndex);

                    return(Global.StringClass.New(ret));
                }
            }
            else
            {
                string search = searchValue.ToString();
                int    index  = source.IndexOf(search);
                if (index != -1)
                {
                    if (replaceValue is JsFunction)
                    {
                        List <JsInstance> replaceParameters = new List <JsInstance>();
                        replaceParameters.Add(Global.StringClass.New(search));
                        replaceParameters.Add(Global.NumberClass.New(index));
                        replaceParameters.Add(Global.StringClass.New(source));

                        Global.Visitor.ExecuteFunction(function, null, replaceParameters.ToArray());
                        replaceValue = Global.Visitor.Result;

                        return(Global.StringClass.New(source.Substring(0, index) + replaceValue.ToString() + source.Substring(index + search.Length)));
                    }
                    else
                    {
                        string before    = source.Substring(0, index);
                        string after     = source.Substring(index + search.Length);
                        string newString = EvaluateReplacePattern(search, before, after, replaceValue.ToString(), null);
                        return(Global.StringClass.New(before + newString + after));
                    }
                }
                else
                {
                    return(Global.StringClass.New(source));
                }
            }
        }
Ejemplo n.º 13
0
 /// <summary>
 /// 15.5.4.9
 /// </summary>
 /// <param name="target"></param>
 /// <param name="parameters"></param>
 /// <returns></returns>
 public JsInstance LocaleCompareImpl(JsDictionaryObject target, JsInstance[] parameters)
 {
     return(Global.NumberClass.New(target.ToString().CompareTo(parameters[0].ToString())));
 }
Ejemplo n.º 14
0
 public JsInstance LengthImpl(JsDictionaryObject target)
 {
     return((JsInstance)this.Global.NumberClass.New((double)target.ToString().Length));
 }
Ejemplo n.º 15
0
 public JsInstance ToLocaleUpperCaseImpl(
     JsDictionaryObject target,
     JsInstance[] parameters)
 {
     return((JsInstance)this.Global.StringClass.New(target.ToString().ToUpper()));
 }
Ejemplo n.º 16
0
        public JsInstance ReplaceImpl(JsDictionaryObject target, JsInstance[] parameters)
        {
            if (parameters.Length == 0)
            {
                return((JsInstance)this.Global.StringClass.New(target.ToString()));
            }
            JsInstance parameter  = parameters[0];
            JsInstance jsInstance = (JsInstance)JsUndefined.Instance;

            if (parameters.Length > 1)
            {
                jsInstance = parameters[1];
            }
            string     source   = target.ToString();
            JsFunction function = jsInstance as JsFunction;

            if (parameter.Class == "RegExp")
            {
                int      count   = ((JsRegExp)parameters[0]).IsGlobal ? int.MaxValue : 1;
                JsRegExp regexp  = (JsRegExp)parameters[0];
                int      startat = regexp.IsGlobal ? 0 : Math.Max(0, (int)regexp["lastIndex"].ToNumber() - 1);
                if (regexp.IsGlobal)
                {
                    regexp["lastIndex"] = (JsInstance)this.Global.NumberClass.New(0.0);
                }
                if (jsInstance is JsFunction)
                {
                    return((JsInstance)this.Global.StringClass.New(((JsRegExp)parameters[0]).Regex.Replace(source, (MatchEvaluator)(m =>
                    {
                        List <JsInstance> jsInstanceList = new List <JsInstance>();
                        if (!regexp.IsGlobal)
                        {
                            regexp["lastIndex"] = (JsInstance)this.Global.NumberClass.New((double)(m.Index + 1));
                        }
                        jsInstanceList.Add((JsInstance)this.Global.StringClass.New(m.Value));
                        for (int index = 1; index < m.Groups.Count; ++index)
                        {
                            if (m.Groups[index].Success)
                            {
                                jsInstanceList.Add((JsInstance)this.Global.StringClass.New(m.Groups[index].Value));
                            }
                            else
                            {
                                jsInstanceList.Add((JsInstance)JsUndefined.Instance);
                            }
                        }
                        jsInstanceList.Add((JsInstance)this.Global.NumberClass.New((double)m.Index));
                        jsInstanceList.Add((JsInstance)this.Global.StringClass.New(source));
                        this.Global.Visitor.ExecuteFunction(function, (JsDictionaryObject)null, jsInstanceList.ToArray());
                        return this.Global.Visitor.Returned.ToString();
                    }), count, startat)));
                }
                string str = parameters[1].ToString();
                return((JsInstance)this.Global.StringClass.New(((JsRegExp)parameters[0]).Regex.Replace(target.ToString(), (MatchEvaluator)(m =>
                {
                    if (!regexp.IsGlobal)
                    {
                        regexp["lastIndex"] = (JsInstance)this.Global.NumberClass.New((double)(m.Index + 1));
                    }
                    string after = source.Substring(Math.Min(source.Length - 1, m.Index + m.Length));
                    return JsStringConstructor.EvaluateReplacePattern(m.Value, source.Substring(0, m.Index), after, str, m.Groups);
                }), count, startat)));
            }
            string matched = parameter.ToString();
            int    length  = source.IndexOf(matched);

            if (length == -1)
            {
                return((JsInstance)this.Global.StringClass.New(source));
            }
            if (jsInstance is JsFunction)
            {
                this.Global.Visitor.ExecuteFunction(function, (JsDictionaryObject)null, new List <JsInstance>()
                {
                    (JsInstance)this.Global.StringClass.New(matched),
                    (JsInstance)this.Global.NumberClass.New((double)length),
                    (JsInstance)this.Global.StringClass.New(source)
                }.ToArray());
                JsInstance result = this.Global.Visitor.Result;
                return((JsInstance)this.Global.StringClass.New(source.Substring(0, length) + result.ToString() + source.Substring(length + matched.Length)));
            }
            string before         = source.Substring(0, length);
            string after1         = source.Substring(length + matched.Length);
            string replacePattern = JsStringConstructor.EvaluateReplacePattern(matched, before, after1, jsInstance.ToString(), (GroupCollection)null);

            return((JsInstance)this.Global.StringClass.New(before + replacePattern + after1));
        }