google-search-results.js: also add binding for return
[conkeror.git] / modules / keywords.js
blob3c1788680f35a5862e3d73658650e252e4abddd6
2 function keyword_argument(name, value)
4     this.name = name;
5     this.value = value;
8 function keyword_argument_forwarder(args)
10     this.args = args;
13 function _get_keyword_argument_setter(name) {
14     return function (value) { return new keyword_argument(name, value); }
17 function _get_keyword_argument_getter(name) {
18     return function () { return new keyword_argument(name, true); }
21 // This function must be called with all string arguments, all of
22 // which must begin with "$".
23 function define_keywords()
25     for (var i = 0; i < arguments.length; ++i)
26     {
27         var name = arguments[i];
28         this.__defineSetter__(name, _get_keyword_argument_setter(name));
29         this.__defineGetter__(name, _get_keyword_argument_getter(name));
30     }
33 var define_keyword = define_keywords;
35 function forward_keywords(args)
37     return new keyword_argument_forwarder(args);
40 // This is called with a function's `arguments' variable.  Additional
41 // default values can also be specified as subsequent arguments.
42 function keywords(args)
44     /* First add our own arguments. */
45     for (var i = 1; i < arguments.length; ++i)
46     {
47         var arg = arguments[i];
48         args[arg.name] = arg.value;
49     }
50     function helper(in_args)
51     {
52         // Begin at the first "undeclared" argument
53         for (var i = in_args.callee.length; i < in_args.length; ++i)
54         {
55             var arg = in_args[i];
56             if (arg instanceof keyword_argument)
57                 args[arg.name] = arg.value;
58             else if (arg instanceof keyword_argument_forwarder)
59                 helper(arg.args);
60         }
61     }
62     helper(args);