Пример #1
0
 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;
     }
 }
Пример #2
0
 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)));
 }
Пример #3
0
 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)));
 }