public static JSObject split(JSObject self, Arguments args) { if (args.Length == 0 || !args[0].IsDefinded) return new Array(new object[] { self.ToString() }); uint limit = uint.MaxValue; if (args.Length > 1) { var limO = args[1]; if (limO.valueType >= JSObjectType.Object) limO = limO.ToPrimitiveValue_Value_String(); switch (limO.valueType) { case JSObjectType.Int: case JSObjectType.Bool: { limit = (uint)limO.iValue; break; } case JSObjectType.Double: { limit = (uint)limO.dValue; break; } case JSObjectType.Object: case JSObjectType.Date: case JSObjectType.Function: case JSObjectType.String: { double d; Tools.ParseNumber(limO.ToString(), 0, out d, Tools.ParseNumberOptions.Default); limit = (uint)d; break; } } } if (args[0].valueType == JSObjectType.Object && args[0].oValue is RegExp) { string selfString = self.ToPrimitiveValue_Value_String().ToString(); var match = (args[0].oValue as RegExp).regEx.Match(selfString); if ((args[0].oValue as RegExp).regEx.ToString().Length == 0) { match = match.NextMatch(); if (limit == uint.MaxValue) limit = (uint)selfString.Length; } Array res = new Array(); int index = 0; while (res.data.Length < limit) { if (!match.Success) { res.data.Add(selfString.Substring(index, selfString.Length - index)); break; } int nindex = match.Index; if (nindex == -1) { res.data.Add(selfString.Substring(index, selfString.Length - index)); break; } else { var item = selfString.Substring(index, nindex - index); res.data.Add(item); index = nindex + match.Length; } match = match.NextMatch(); } return res; } else { string fstr = args[0].ToString(); string selfString = self.ToPrimitiveValue_Value_String().ToString(); Array res = new Array(); if (string.IsNullOrEmpty(fstr)) { for (var i = 0; i < System.Math.Min(selfString.Length, limit); i++) res.data.Add(selfString[i]); } else { int index = 0; while (res.data.Length < limit) { int nindex = selfString.IndexOf(fstr, index); if (nindex == -1) { res.data.Add(selfString.Substring(index, selfString.Length - index)); break; } else { var item = selfString.Substring(index, nindex - index); res.data.Add(item); index = nindex + fstr.Length; } } } return res; } }
public static JSObject substring(JSObject self, Arguments args) { string selfString = self.ToPrimitiveValue_Value_String().ToString(); if (args.Length == 0) return selfString; int pos0 = 0; switch (args[0].valueType) { case JSObjectType.Int: case JSObjectType.Bool: { pos0 = args[0].iValue; break; } case JSObjectType.Double: { if (double.IsNaN(args[0].dValue) || double.IsNegativeInfinity(args[0].dValue)) pos0 = 0; else if (double.IsPositiveInfinity(args[0].dValue)) pos0 = selfString.Length; else pos0 = (int)args[0].dValue; break; } case JSObjectType.Object: case JSObjectType.Date: case JSObjectType.Function: case JSObjectType.String: { pos0 = Tools.JSObjectToInt32(args[0], 0, true); break; } } int pos1 = 0; if (args.Length > 1) { switch (args[1].valueType) { case JSObjectType.Int: case JSObjectType.Bool: { pos1 = args[1].iValue; break; } case JSObjectType.Double: { if (double.IsNaN(args[1].dValue) || double.IsNegativeInfinity(args[0].dValue)) pos1 = 0; else if (double.IsPositiveInfinity(args[1].dValue)) pos1 = selfString.Length; else pos1 = (int)args[1].dValue; break; } case JSObjectType.Object: case JSObjectType.Date: case JSObjectType.Function: case JSObjectType.String: { pos1 = Tools.JSObjectToInt32(args[1], 0, true); break; } case JSObjectType.NotExists: case JSObjectType.NotExistsInObject: case JSObjectType.Undefined: { pos1 = selfString.Length; break; } } } else pos1 = selfString.Length; if (pos0 > pos1) { pos0 ^= pos1; pos1 ^= pos0; pos0 ^= pos1; } pos0 = System.Math.Max(0, System.Math.Min(pos0, selfString.Length)); pos1 = System.Math.Max(0, System.Math.Min(pos1, selfString.Length)); return selfString.Substring(pos0, System.Math.Min(selfString.Length, System.Math.Max(0, pos1 - pos0))); }
public static JSObject slice(JSObject self, Arguments args) { string selfString = self.ToPrimitiveValue_Value_String().ToString(); if (args.Length == 0) return selfString; int pos0 = 0; switch (args[0].valueType) { case JSObjectType.Int: case JSObjectType.Bool: { pos0 = args[0].iValue; break; } case JSObjectType.Double: { if (double.IsNaN(args[0].dValue) || double.IsNegativeInfinity(args[0].dValue)) pos0 = 0; else if (double.IsPositiveInfinity(args[0].dValue)) pos0 = selfString.Length; else pos0 = (int)args[0].dValue; break; } case JSObjectType.Object: case JSObjectType.Date: case JSObjectType.Function: case JSObjectType.String: { pos0 = Tools.JSObjectToInt32(args[0], 0, true); break; } } int pos1 = 0; if (args.Length > 1) { switch (args[1].valueType) { case JSObjectType.Int: case JSObjectType.Bool: { pos1 = args[1].iValue; break; } case JSObjectType.Double: { if (double.IsNaN(args[1].dValue) || double.IsNegativeInfinity(args[0].dValue)) pos1 = 0; else if (double.IsPositiveInfinity(args[1].dValue)) pos1 = selfString.Length; else pos1 = (int)args[1].dValue; break; } case JSObjectType.Object: case JSObjectType.Date: case JSObjectType.Function: case JSObjectType.String: { //double d; //Tools.ParseNumber(args[1].ToPrimitiveValue_Value_String().ToString(), pos1, out d, Tools.ParseNumberOptions.Default); //pos1 = (int)d; pos1 = Tools.JSObjectToInt32(args[1], 0, true); break; } case JSObjectType.NotExists: case JSObjectType.NotExistsInObject: case JSObjectType.Undefined: { pos1 = selfString.Length; break; } } } else pos1 = selfString.Length; while (pos0 < 0) pos0 += selfString.Length; while (pos1 < 0) pos1 += selfString.Length; pos0 = System.Math.Min(pos0, selfString.Length); return selfString.Substring(pos0, System.Math.Min(selfString.Length, System.Math.Max(0, pos1 - pos0))); }