/// <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)); } }
/// <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); }
/// <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)); } }
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))); }
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))); }
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)); }
/// <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))); }
public JsInstance ToStringImpl(JsDictionaryObject target, JsInstance[] parameters) { return(Global.StringClass.New(target.ToString())); }
/// <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)); }
/// <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())); }
/// <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())); }
/// <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)); } } }
/// <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()))); }
public JsInstance LengthImpl(JsDictionaryObject target) { return((JsInstance)this.Global.NumberClass.New((double)target.ToString().Length)); }
public JsInstance ToLocaleUpperCaseImpl( JsDictionaryObject target, JsInstance[] parameters) { return((JsInstance)this.Global.StringClass.New(target.ToString().ToUpper())); }
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)); }