aboutsummaryrefslogtreecommitdiff
path: root/node_modules/montage/core/selector/abstract-semantics.js
diff options
context:
space:
mode:
authorArmen Kesablyan2012-05-17 14:01:38 -0700
committerArmen Kesablyan2012-05-17 14:01:38 -0700
commit6c8f3525b839e82cf43df43700a0160ee2c5458f (patch)
tree3fb801fa54b759c5568d75bb467e02652ce77c3e /node_modules/montage/core/selector/abstract-semantics.js
parente8ae5db7ce7023b638375cbc27a3f7b7a2f77b23 (diff)
parent342c97ac9b727b22a7b0bfefca4d2a168bc3055b (diff)
downloadninja-6c8f3525b839e82cf43df43700a0160ee2c5458f.tar.gz
Merge branch 'refs/heads/dom-architecture' into binding
Conflicts: css/ninja.css scss/imports/scss/_toolbar.scss Signed-off-by: Armen Kesablyan <armen@motorola.com>
Diffstat (limited to 'node_modules/montage/core/selector/abstract-semantics.js')
-rw-r--r--node_modules/montage/core/selector/abstract-semantics.js100
1 files changed, 100 insertions, 0 deletions
diff --git a/node_modules/montage/core/selector/abstract-semantics.js b/node_modules/montage/core/selector/abstract-semantics.js
new file mode 100644
index 00000000..9a55ecca
--- /dev/null
+++ b/node_modules/montage/core/selector/abstract-semantics.js
@@ -0,0 +1,100 @@
1/* <copyright>
2 This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
3 No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
4 (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
5 </copyright> */
6
7var Montage = require("montage").Montage;
8
9var AbstractSemantics = exports.AbstractSemantics = Montage.create(Montage, {
10
11 create: {
12 value: function (prototype, descriptor) {
13 var self = Montage.create(prototype, descriptor);
14
15 var operators = self.operators;
16 self.evaluatorArgumentLengths = {};
17
18 // convert the declared operators into evaluators
19 Object.keys(operators).forEach(function (name) {
20 var operate = operators[name];
21 self.evaluators[name] = function () { // ...args
22 var args = Array.prototype.slice.call(
23 arguments,
24 0,
25 operate.length
26 );
27 return function (value, parameters, visitor) {
28 return operate.apply(
29 operators,
30 args.map(function (argument) {
31 return argument(value, parameters, visitor);
32 })
33 );
34 };
35 };
36 self.evaluatorArgumentLengths[name] = operate.length;
37 });
38
39 return self;
40 }
41 },
42
43 evaluatorArgumentLengths: {
44 value: null
45 },
46
47 compile: {
48 value: function (syntax, parents) {
49 var self = this;
50 parents = {
51 syntax: syntax,
52 parents: parents
53 };
54 if (syntax.type === 'value') {
55 return function (value) {
56 return value;
57 };
58 } else if (syntax.type === 'parameters') {
59 return function (value, parameters) {
60 return parameters;
61 };
62 } else if (syntax.type === 'literal') {
63 return function () {
64 return syntax.value;
65 };
66 } else if (self.evaluators[syntax.type]) {
67 var evaluator = self.evaluators[syntax.type];
68 var length =
69 self.evaluatorArgumentLengths[syntax.type] ||
70 evaluator.length;
71 var args = syntax.args.map(function (child) {
72 return self.compile(child, parents);
73 });
74 if (syntax.insensitive) {
75 args = args.map(function (evaluate) {
76 return function (value, parameters, visitor) {
77 return evaluate.call(
78 self,
79 value,
80 parameters,
81 visitor
82 ).toLowerCase();
83 };
84 })
85 }
86 return evaluator.apply(self, args.concat([parents]));
87 } else {
88 throw new Error("Unknown evaluator " + syntax.type);
89 }
90 }
91 },
92
93 evaluate: {
94 value: function (syntax, value, parameters, visitor) {
95 return this.compile(syntax)(value, parameters, visitor);
96 }
97 }
98
99});
100