예제 #1
0
        public virtual object Perform (Context cx, IScriptable scope, IScriptable thisObj, object [] args, RegExpActions actionType)
        {
            GlobData data = new GlobData ();
            data.mode = actionType;

            switch ( (RegExpActions)actionType) {

                case EcmaScript.NET.RegExpActions.Match: {
                        object rval;
                        data.optarg = 1;
                        rval = matchOrReplace (cx, scope, thisObj, args, this, data, false);
                        return data.arrayobj == null ? rval : data.arrayobj;
                    }


                case EcmaScript.NET.RegExpActions.Search:
                    data.optarg = 1;
                    return matchOrReplace (cx, scope, thisObj, args, this, data, false);


                case EcmaScript.NET.RegExpActions.Replace: {
                        object arg1 = args.Length < 2 ? Undefined.Value : args [1];
                        string repstr = null;
                        IFunction lambda = null;
                        if (arg1 is IFunction) {
                            lambda = (IFunction)arg1;
                        }
                        else {
                            repstr = ScriptConvert.ToString (arg1);
                        }

                        data.optarg = 2;
                        data.lambda = lambda;
                        data.repstr = repstr;
                        data.dollar = repstr == null ? -1 : repstr.IndexOf ((char)'$');
                        data.charBuf = null;
                        data.leftIndex = 0;
                        object val = matchOrReplace (cx, scope, thisObj, args, this, data, true);
                        SubString rc = this.rightContext;

                        if (data.charBuf == null) {
                            if (data.global || val == null || !val.Equals (true)) {
                                /* Didn't match even once. */
                                return data.str;
                            }
                            SubString lc = this.leftContext;
                            replace_glob (data, cx, scope, this, lc.index, lc.length);
                        }
                        data.charBuf.Append (rc.charArray, rc.index, rc.length);
                        return data.charBuf.ToString ();
                    }


                default:
                    throw Context.CodeBug ();

            }
        }
예제 #2
0
        public virtual object Perform(Context cx, IScriptable scope, IScriptable thisObj, object [] args, RegExpActions actionType)
        {
            GlobData data = new GlobData();

            data.mode = actionType;

            switch ((RegExpActions)actionType)
            {
            case EcmaScript.NET.RegExpActions.Match: {
                object rval;
                data.optarg = 1;
                rval        = matchOrReplace(cx, scope, thisObj, args, this, data, false);
                return(data.arrayobj == null ? rval : data.arrayobj);
            }


            case EcmaScript.NET.RegExpActions.Search:
                data.optarg = 1;
                return(matchOrReplace(cx, scope, thisObj, args, this, data, false));


            case EcmaScript.NET.RegExpActions.Replace: {
                object    arg1   = args.Length < 2 ? Undefined.Value : args [1];
                string    repstr = null;
                IFunction lambda = null;
                if (arg1 is IFunction)
                {
                    lambda = (IFunction)arg1;
                }
                else
                {
                    repstr = ScriptConvert.ToString(arg1);
                }

                data.optarg    = 2;
                data.lambda    = lambda;
                data.repstr    = repstr;
                data.dollar    = repstr == null ? -1 : repstr.IndexOf((char)'$');
                data.charBuf   = null;
                data.leftIndex = 0;
                object    val = matchOrReplace(cx, scope, thisObj, args, this, data, true);
                SubString rc  = this.rightContext;

                if (data.charBuf == null)
                {
                    if (data.global || val == null || !val.Equals(true))
                    {
                        /* Didn't match even once. */
                        return(data.str);
                    }
                    SubString lc = this.leftContext;
                    replace_glob(data, cx, scope, this, lc.index, lc.length);
                }
                data.charBuf.Append(rc.charArray, rc.index, rc.length);
                return(data.charBuf.ToString());
            }


            default:
                throw Context.CodeBug();
            }
        }