func replace_Regexp(ctx *EngineContext, scope *Scope, ins protoface.Instruction, args []interface{}) (returnValue interface{}) { regexp := args[0].(*rubex.Regexp) scope.Value = regexp.GsubFunc(scope.Value.(string), func(match string, captures map[string]string) string { usesGlobal := (ctx.GetEnv("use_global_replace_vars") == "true") for name, capture := range captures { if usesGlobal { //println("setting $", name, "to", capture) ctx.SetEnv(name, capture) } ctx.SetVar(name, capture) } replacementScope := &Scope{Value: match} for i := 0; i < ins.INumChildren(); i++ { child := ins.IGetNthChild(i) ctx.RunInstruction(replacementScope, child) } //println(ins.String()) //println("Replacement:", replacementScope.Value.(string)) return ctx.GetInnerReplacer().GsubFunc(replacementScope.Value.(string), func(_ string, numeric_captures map[string]string) string { capture := numeric_captures["1"] var val string if usesGlobal { val = ctx.GetEnv(capture) } else { val = ctx.GetVar(capture).(string) } return val }) }) returnValue = scope.Value return }
func capture_Regexp(ctx *EngineContext, scope *Scope, ins protoface.Instruction, args []interface{}) (returnValue interface{}) { regexp := args[0].(*rubex.Regexp) scope.Value = regexp.GsubFunc(scope.Value.(string), func(match string, captures map[string]string) string { usesGlobal := (ctx.GetEnv("use_global_replace_vars") == "true") for name, capture := range captures { if usesGlobal { ctx.SetEnv(name, capture) } ctx.SetVar(name, capture) } replacementScope := &Scope{Value: match} for i := 0; i < ins.INumChildren(); i++ { child := ins.IGetNthChild(i) ctx.RunInstruction(replacementScope, child) } return replacementScope.Value.(string) }) returnValue = scope.Value return }