middleman-wizard-template 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/middleman-wizard-template/template/source/index.html.erb +1 -89
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Matrix.js +449 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoader.js +395 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoaderImage.js +96 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/PxLoader/PxLoaderSwiffy.js +68 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/RouteRecognizer.js +506 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Slides.js +846 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/Transform.js +312 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/{Tween.js → ww/Tween.js} +26 -11
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/base.js +8 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/raf.js +131 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/statemachine.js +1024 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/useragent.js +1244 -0
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/{util.js → ww/util.js} +48 -50
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/ww/viewport.js +89 -0
- data/lib/middleman-wizard-template/template/source/javascripts/{app.js → site.js} +5 -5
- data/lib/middleman-wizard-template/template/source/layouts/layout.erb +85 -0
- data/lib/middleman-wizard-template/template/source/stylesheets/default.css +2 -1
- data/lib/middleman-wizard-template/template/source/stylesheets/site.css.scss +11 -3
- data/lib/middleman-wizard-template/version.rb +1 -1
- metadata +23 -23
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/Transform.js +0 -401
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/raf.js +0 -26
- data/lib/middleman-wizard-template/template/source/javascripts/_lib/router.js +0 -679
@@ -1,401 +0,0 @@
|
|
1
|
-
goog.provide('ww.transform');
|
2
|
-
|
3
|
-
/**
|
4
|
-
* CSS Transform support. Handle detection of 3d Transforms or falls back to the
|
5
|
-
* 2d versions if they are available. Fixes cross-browser and browser-prefix
|
6
|
-
* issues.
|
7
|
-
*/
|
8
|
-
ww.transform = (function() {
|
9
|
-
var Sylvester = {
|
10
|
-
version: '0.1.3',
|
11
|
-
precision: 1e-6
|
12
|
-
};
|
13
|
-
|
14
|
-
function Matrix() {}
|
15
|
-
Matrix.prototype = {
|
16
|
-
|
17
|
-
// Returns element (i,j) of the matrix
|
18
|
-
e: function(i, j) {
|
19
|
-
if ((i < 1) ||
|
20
|
-
(i > this.elements.length) ||
|
21
|
-
(j < 1) ||
|
22
|
-
(j > this.elements[0].length)) { return null; }
|
23
|
-
return this.elements[i - 1][j - 1];
|
24
|
-
},
|
25
|
-
|
26
|
-
// Maps the matrix to another matrix (of the same dimensions) according
|
27
|
-
// to the given function
|
28
|
-
map: function(fn) {
|
29
|
-
var els = [], ni = this.elements.length, ki = ni, i, nj,
|
30
|
-
kj = this.elements[0].length, j;
|
31
|
-
do { i = ki - ni;
|
32
|
-
nj = kj;
|
33
|
-
els[i] = [];
|
34
|
-
do { j = kj - nj;
|
35
|
-
els[i][j] = fn(this.elements[i][j], i + 1, j + 1);
|
36
|
-
} while (--nj);
|
37
|
-
} while (--ni);
|
38
|
-
return Matrix.create(els);
|
39
|
-
},
|
40
|
-
|
41
|
-
// Returns the result of multiplying the matrix from the right by the
|
42
|
-
// argument. If the argument is a scalar then just multiply all the
|
43
|
-
// elements. If the argument is a vector, a vector is returned, which
|
44
|
-
// saves you having to remember calling
|
45
|
-
// col(1) on the result.
|
46
|
-
multiply: function(matrix) {
|
47
|
-
if (!matrix.elements) {
|
48
|
-
return this.map(function(x) { return x * matrix; });
|
49
|
-
}
|
50
|
-
var returnVector = matrix.modulus ? true : false;
|
51
|
-
var M = matrix.elements || matrix;
|
52
|
-
if (typeof(M[0][0]) == 'undefined') { M = Matrix.create(M).elements; }
|
53
|
-
if (!this.canMultiplyFromLeft(M)) { return null; }
|
54
|
-
var ni = this.elements.length, ki = ni, i, nj, kj = M[0].length, j;
|
55
|
-
var cols = this.elements[0].length, elements = [], sum, nc, c;
|
56
|
-
do { i = ki - ni;
|
57
|
-
elements[i] = [];
|
58
|
-
nj = kj;
|
59
|
-
do { j = kj - nj;
|
60
|
-
sum = 0;
|
61
|
-
nc = cols;
|
62
|
-
do { c = cols - nc;
|
63
|
-
sum += this.elements[i][c] * M[c][j];
|
64
|
-
} while (--nc);
|
65
|
-
elements[i][j] = sum;
|
66
|
-
} while (--nj);
|
67
|
-
} while (--ni);
|
68
|
-
M = Matrix.create(elements);
|
69
|
-
return returnVector ? M.col(1) : M;
|
70
|
-
},
|
71
|
-
|
72
|
-
x: function(matrix) { return this.multiply(matrix); },
|
73
|
-
|
74
|
-
// Returns true iff the matrix can multiply the argument from the left
|
75
|
-
canMultiplyFromLeft: function(matrix) {
|
76
|
-
var M = matrix.elements || matrix;
|
77
|
-
if (typeof(M[0][0]) == 'undefined') { M = Matrix.create(M).elements; }
|
78
|
-
// this.columns should equal matrix.rows
|
79
|
-
return (this.elements[0].length == M.length);
|
80
|
-
},
|
81
|
-
|
82
|
-
// Set the matrix's elements from an array. If the argument passed
|
83
|
-
// is a vector, the resulting matrix will be a single column.
|
84
|
-
setElements: function(els) {
|
85
|
-
var i, elements = els.elements || els;
|
86
|
-
if (typeof(elements[0][0]) != 'undefined') {
|
87
|
-
var ni = elements.length, ki = ni, nj, kj, j;
|
88
|
-
this.elements = [];
|
89
|
-
do { i = ki - ni;
|
90
|
-
nj = elements[i].length; kj = nj;
|
91
|
-
this.elements[i] = [];
|
92
|
-
do { j = kj - nj;
|
93
|
-
this.elements[i][j] = elements[i][j];
|
94
|
-
} while (--nj);
|
95
|
-
} while (--ni);
|
96
|
-
return this;
|
97
|
-
}
|
98
|
-
var n = elements.length, k = n;
|
99
|
-
this.elements = [];
|
100
|
-
do { i = k - n;
|
101
|
-
this.elements.push([elements[i]]);
|
102
|
-
} while (--n);
|
103
|
-
return this;
|
104
|
-
}
|
105
|
-
};
|
106
|
-
|
107
|
-
/**
|
108
|
-
* Create a new Matrix.
|
109
|
-
* @param {Array} elements Components of the matrix.
|
110
|
-
* @return {Matrix} The matrix.
|
111
|
-
*/
|
112
|
-
Matrix.create = function(elements) {
|
113
|
-
var M = new Matrix();
|
114
|
-
return M.setElements(elements);
|
115
|
-
};
|
116
|
-
|
117
|
-
// Utility functions
|
118
|
-
var $M = Matrix.create;
|
119
|
-
// }).apply(this);
|
120
|
-
|
121
|
-
// (function() {
|
122
|
-
var translationUnit = '',
|
123
|
-
prop = 'transform',
|
124
|
-
supportedProp, supports3d, supports2d;
|
125
|
-
|
126
|
-
supports3d = Modernizr['csstransforms3d'];
|
127
|
-
supports2d = Modernizr['csstransforms'];
|
128
|
-
supportedProp = Modernizr['prefixed'](prop);
|
129
|
-
|
130
|
-
var div = document.createElement('div');
|
131
|
-
if ('MozTransform' in div.style) {
|
132
|
-
translationUnit = 'px';
|
133
|
-
}
|
134
|
-
|
135
|
-
var transformProperty = supportedProp;
|
136
|
-
|
137
|
-
var properties = {
|
138
|
-
'rotateX': {
|
139
|
-
defaultValue: 0,
|
140
|
-
matrix: function(a) {
|
141
|
-
if (supports3d) {
|
142
|
-
return $M([
|
143
|
-
[1, 0, 0, 0],
|
144
|
-
[0, Math.cos(a), Math.sin(-a), 0],
|
145
|
-
[0, Math.sin(a), Math.cos(a), 0],
|
146
|
-
[0, 0, 0, 1]
|
147
|
-
]);
|
148
|
-
}
|
149
|
-
else {
|
150
|
-
return $M([
|
151
|
-
[1, 0, 0],
|
152
|
-
[0, 1, 0],
|
153
|
-
[0, 0, 1]
|
154
|
-
]);
|
155
|
-
}
|
156
|
-
}
|
157
|
-
},
|
158
|
-
'rotateY': {
|
159
|
-
defaultValue: 0,
|
160
|
-
matrix: function(b) {
|
161
|
-
if (supports3d) {
|
162
|
-
return $M([
|
163
|
-
[Math.cos(b), 0, Math.sin(b), 0],
|
164
|
-
[0, 1, 0, 0],
|
165
|
-
[Math.sin(-b), 0, Math.cos(b), 0],
|
166
|
-
[0, 0, 0, 1]
|
167
|
-
]);
|
168
|
-
}
|
169
|
-
else {
|
170
|
-
return $M([
|
171
|
-
[1, 0, 0],
|
172
|
-
[0, 1, 0],
|
173
|
-
[0, 0, 1]
|
174
|
-
]);
|
175
|
-
}
|
176
|
-
}
|
177
|
-
},
|
178
|
-
'rotateZ': {
|
179
|
-
defaultValue: 0,
|
180
|
-
matrix: function(c) {
|
181
|
-
if (supports3d) {
|
182
|
-
return $M([
|
183
|
-
[Math.cos(c), Math.sin(-c), 0, 0],
|
184
|
-
[Math.sin(c), Math.cos(c), 0, 0],
|
185
|
-
[0, 0, 1, 0],
|
186
|
-
[0, 0, 0, 1]
|
187
|
-
]);
|
188
|
-
}
|
189
|
-
else {
|
190
|
-
return $M([
|
191
|
-
[Math.cos(c), Math.sin(-c), 0],
|
192
|
-
[Math.sin(c), Math.cos(c), 0],
|
193
|
-
[0, 0, 1]
|
194
|
-
]);
|
195
|
-
}
|
196
|
-
}
|
197
|
-
},
|
198
|
-
'perspective': {
|
199
|
-
defaultValue: 0,
|
200
|
-
matrix: function(ps) {
|
201
|
-
ps = (ps === 0) ? 0 : -1 / ps;
|
202
|
-
if (supports3d) {
|
203
|
-
return $M([
|
204
|
-
[1, 0, 0, 0],
|
205
|
-
[0, 1, 0, 0],
|
206
|
-
[0, 0, 1, ps],
|
207
|
-
[0, 0, 0, 1]
|
208
|
-
]);
|
209
|
-
} else {
|
210
|
-
return $M([
|
211
|
-
[1, 0, 0],
|
212
|
-
[0, 1, 0],
|
213
|
-
[0, 0, 1]
|
214
|
-
]);
|
215
|
-
}
|
216
|
-
}
|
217
|
-
},
|
218
|
-
'scale': {
|
219
|
-
defaultValue: 1,
|
220
|
-
matrix: function(s) {
|
221
|
-
if (supports3d) {
|
222
|
-
return $M([
|
223
|
-
[s, 0, 0, 0],
|
224
|
-
[0, s, 0, 0],
|
225
|
-
[0, 0, s, 0],
|
226
|
-
[0, 0, 0, 1]
|
227
|
-
]);
|
228
|
-
}
|
229
|
-
else {
|
230
|
-
return $M([
|
231
|
-
[s, 0, 0],
|
232
|
-
[0, s, 0],
|
233
|
-
[0, 0, 1]
|
234
|
-
]);
|
235
|
-
}
|
236
|
-
}
|
237
|
-
},
|
238
|
-
'translateX': {
|
239
|
-
defaultValue: 0,
|
240
|
-
matrix: function(tx) {
|
241
|
-
if (supports3d) {
|
242
|
-
return $M([
|
243
|
-
[1, 0, 0, 0],
|
244
|
-
[0, 1, 0, 0],
|
245
|
-
[0, 0, 1, 0],
|
246
|
-
[tx, 0, 0, 1]
|
247
|
-
]);
|
248
|
-
}
|
249
|
-
else {
|
250
|
-
return $M([
|
251
|
-
[1, 0, 0],
|
252
|
-
[0, 1, 0],
|
253
|
-
[tx, 0, 1]
|
254
|
-
]);
|
255
|
-
}
|
256
|
-
}
|
257
|
-
},
|
258
|
-
'translateY': {
|
259
|
-
defaultValue: 0,
|
260
|
-
matrix: function(ty) {
|
261
|
-
if (supports3d) {
|
262
|
-
return $M([
|
263
|
-
[1, 0, 0, 0],
|
264
|
-
[0, 1, 0, 0],
|
265
|
-
[0, 0, 1, 0],
|
266
|
-
[0, ty, 0, 1]
|
267
|
-
]);
|
268
|
-
}
|
269
|
-
else {
|
270
|
-
return $M([
|
271
|
-
[1, 0, 0],
|
272
|
-
[0, 1, 0],
|
273
|
-
[0, ty, 1]
|
274
|
-
]);
|
275
|
-
}
|
276
|
-
}
|
277
|
-
},
|
278
|
-
'translateZ': {
|
279
|
-
defaultValue: 0,
|
280
|
-
matrix: function(tz) {
|
281
|
-
if (supports3d) {
|
282
|
-
return $M([
|
283
|
-
[1, 0, 0, 0],
|
284
|
-
[0, 1, 0, 0],
|
285
|
-
[0, 0, 1, 0],
|
286
|
-
[0, 0, tz, 1]
|
287
|
-
]);
|
288
|
-
}
|
289
|
-
else {
|
290
|
-
return $M([
|
291
|
-
[1, 0, 0],
|
292
|
-
[0, 1, 0],
|
293
|
-
[0, 0, 1]
|
294
|
-
]);
|
295
|
-
}
|
296
|
-
}
|
297
|
-
}
|
298
|
-
};
|
299
|
-
|
300
|
-
var applyMatrix = function(elem) {
|
301
|
-
var transforms = getTransformsForElem(elem);
|
302
|
-
var tM, s;
|
303
|
-
|
304
|
-
if (supports3d) {
|
305
|
-
tM = $M([
|
306
|
-
[1, 0, 0, 0],
|
307
|
-
[0, 1, 0, 0],
|
308
|
-
[0, 0, 1, -1],
|
309
|
-
[0, 0, 0, 1]
|
310
|
-
]);
|
311
|
-
} else {
|
312
|
-
tM = $M([
|
313
|
-
[1, 0, 0],
|
314
|
-
[0, 1, 0],
|
315
|
-
[0, 0, 1]
|
316
|
-
]);
|
317
|
-
}
|
318
|
-
|
319
|
-
for (var name in properties) {
|
320
|
-
if (properties.hasOwnProperty(name)) {
|
321
|
-
var curVal = transforms[name] || properties[name].defaultValue;
|
322
|
-
var propVal = properties[name];
|
323
|
-
tM = tM.x(propVal.matrix(curVal));
|
324
|
-
}
|
325
|
-
}
|
326
|
-
|
327
|
-
if (supports3d) {
|
328
|
-
s = 'matrix3d(';
|
329
|
-
s += tM.e(1, 1).toFixed(10) + ',' + tM.e(1, 2).toFixed(10) + ',';
|
330
|
-
s += tM.e(1, 3).toFixed(10) + ',' + tM.e(1, 4).toFixed(10) + ',';
|
331
|
-
s += tM.e(2, 1).toFixed(10) + ',' + tM.e(2, 2).toFixed(10) + ',';
|
332
|
-
s += tM.e(2, 3).toFixed(10) + ',' + tM.e(2, 4).toFixed(10) + ',';
|
333
|
-
s += tM.e(3, 1).toFixed(10) + ',' + tM.e(3, 2).toFixed(10) + ',';
|
334
|
-
s += tM.e(3, 3).toFixed(10) + ',' + tM.e(3, 4).toFixed(10) + ',';
|
335
|
-
s += tM.e(4, 1).toFixed(10) + ',' + tM.e(4, 2).toFixed(10) + ',';
|
336
|
-
s += tM.e(4, 3).toFixed(10) + ',' + tM.e(4, 4).toFixed(10);
|
337
|
-
s += ')';
|
338
|
-
} else if (supports2d) {
|
339
|
-
s = 'matrix(';
|
340
|
-
s += tM.e(1, 1).toFixed(10) + ',' + tM.e(1, 2).toFixed(10) + ',';
|
341
|
-
s += tM.e(2, 1).toFixed(10) + ',' + tM.e(2, 2).toFixed(10) + ',';
|
342
|
-
s += tM.e(3, 1).toFixed(10) + translationUnit + ',';
|
343
|
-
s += tM.e(3, 2).toFixed(10) + translationUnit;
|
344
|
-
s += ')';
|
345
|
-
}
|
346
|
-
|
347
|
-
if (s) {
|
348
|
-
elem.style[transformProperty] = s;
|
349
|
-
}
|
350
|
-
};
|
351
|
-
|
352
|
-
var transformsCache = {};
|
353
|
-
|
354
|
-
function getTransformsForElem(elem) {
|
355
|
-
return transformsCache[elem.id];
|
356
|
-
}
|
357
|
-
|
358
|
-
function setTransformsForElem(elem, transforms) {
|
359
|
-
if (!elem.id || !elem.id.length) {
|
360
|
-
throw 'Cannot set current transforms for element without id';
|
361
|
-
}
|
362
|
-
|
363
|
-
transformsCache[elem.id] = transforms;
|
364
|
-
}
|
365
|
-
|
366
|
-
function getValueForElemAndName(elem, name) {
|
367
|
-
var transforms = getTransformsForElem(elem);
|
368
|
-
|
369
|
-
if (transforms === undefined) {
|
370
|
-
transforms = {};
|
371
|
-
}
|
372
|
-
|
373
|
-
return transforms[name] || properties[name].defaultValue;
|
374
|
-
}
|
375
|
-
|
376
|
-
function setValueForElemAndName(elem, name, value) {
|
377
|
-
elem.id = elem.id ||
|
378
|
-
'transform_cache_' + (new Date()).getTime() + Math.random();
|
379
|
-
var transforms = getTransformsForElem(elem);
|
380
|
-
|
381
|
-
if (transforms === undefined) transforms = {};
|
382
|
-
var propInfo = properties[name];
|
383
|
-
|
384
|
-
if (typeof propInfo.apply === 'function') {
|
385
|
-
var curVal = transforms[name] || propInfo.defaultValue;
|
386
|
-
transforms[name] = propInfo.apply(curVal, value);
|
387
|
-
} else {
|
388
|
-
transforms[name] = value;
|
389
|
-
}
|
390
|
-
|
391
|
-
setTransformsForElem(elem, transforms);
|
392
|
-
|
393
|
-
applyMatrix(elem);
|
394
|
-
}
|
395
|
-
|
396
|
-
// Expose API
|
397
|
-
return {
|
398
|
-
getValue: getValueForElemAndName,
|
399
|
-
setValue: setValueForElemAndName
|
400
|
-
};
|
401
|
-
}).call(this);
|
@@ -1,26 +0,0 @@
|
|
1
|
-
(function() {
|
2
|
-
var lastTime = 0;
|
3
|
-
var vendors = ['ms', 'moz', 'webkit', 'o'];
|
4
|
-
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
|
5
|
-
var cancelName1 = vendors[x] + 'CancelAnimationFrame';
|
6
|
-
var cancelName2 = vendors[x] + 'CancelRequestAnimationFrame';
|
7
|
-
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
|
8
|
-
window.cancelAnimationFrame = window[cancelName1] || window[cancelName2];
|
9
|
-
}
|
10
|
-
|
11
|
-
if (!window.requestAnimationFrame)
|
12
|
-
window.requestAnimationFrame = function(callback, element) {
|
13
|
-
var currTime = new Date().getTime();
|
14
|
-
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
15
|
-
var id = window.setTimeout(
|
16
|
-
function() { callback(currTime + timeToCall); },
|
17
|
-
timeToCall
|
18
|
-
);
|
19
|
-
lastTime = currTime + timeToCall;
|
20
|
-
return id;
|
21
|
-
};
|
22
|
-
if (!window.cancelAnimationFrame)
|
23
|
-
window.cancelAnimationFrame = function(id) {
|
24
|
-
clearTimeout(id);
|
25
|
-
};
|
26
|
-
}());
|
@@ -1,679 +0,0 @@
|
|
1
|
-
goog.provide('ww.router');
|
2
|
-
|
3
|
-
/**
|
4
|
-
* Helper method to escape a Regex.
|
5
|
-
* @private
|
6
|
-
* @param {String} text The text to escape.
|
7
|
-
* @return {String} The resulting regex string.
|
8
|
-
*/
|
9
|
-
function regexEscape_(text) {
|
10
|
-
if (!arguments.callee.sRE) {
|
11
|
-
var specials = [
|
12
|
-
'/', '.', '*', '+', '?', '|',
|
13
|
-
'(', ')', '[', ']', '{', '}', '\\'
|
14
|
-
];
|
15
|
-
arguments.callee.sRE = new RegExp(
|
16
|
-
'(\\' + specials.join('|\\') + ')', 'g'
|
17
|
-
);
|
18
|
-
}
|
19
|
-
return text.replace(arguments.callee.sRE, '\\$1');
|
20
|
-
}
|
21
|
-
|
22
|
-
/**
|
23
|
-
* A Router.
|
24
|
-
* @constructor
|
25
|
-
* @param {Object} options Router opts.
|
26
|
-
*/
|
27
|
-
ww.router.Router = function Router(options) {
|
28
|
-
this.routes = {};
|
29
|
-
this.root = new ww.router.Node();
|
30
|
-
this.requestKeys = options && options['requestKeys'] || ['method'];
|
31
|
-
};
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Generate a URL from the router.
|
35
|
-
* @param {String} name The name of the route.
|
36
|
-
* @param {Object} params Options for the route.
|
37
|
-
* @return {String} The resulting URL.
|
38
|
-
*/
|
39
|
-
ww.router.Router.prototype.generate = function routerGenerate(name, params) {
|
40
|
-
return this.routes[name].generate(params);
|
41
|
-
};
|
42
|
-
|
43
|
-
/**
|
44
|
-
* Add a route to this router.
|
45
|
-
* @param {String} uri The route uri.
|
46
|
-
* @param {Object} options Params for the route.
|
47
|
-
* @return {ww.router.Route} The new route.
|
48
|
-
*/
|
49
|
-
ww.router.Router.prototype.add = function routerAdd(uri, options) {
|
50
|
-
var route = new ww.router.Route(this, uri);
|
51
|
-
if (options) route.withOptions(options);
|
52
|
-
return route;
|
53
|
-
};
|
54
|
-
|
55
|
-
/**
|
56
|
-
* Recognize a route given a URL.
|
57
|
-
* @param {String} path The URL.
|
58
|
-
* @param {Object} request The request.
|
59
|
-
* @return {ww.router.Route} The found route.
|
60
|
-
*/
|
61
|
-
ww.router.Router.prototype.recognize = function routerRecognize(path, request) {
|
62
|
-
if (path.substring(0, 1) == '/') path = path.substring(1);
|
63
|
-
return this.root.find(path == '' ? [] : path.split(/\//), request, []);
|
64
|
-
};
|
65
|
-
|
66
|
-
/**
|
67
|
-
* A Route path
|
68
|
-
* @constructor
|
69
|
-
* @param {String} route The path route.
|
70
|
-
* @param {String} uri The path uri.
|
71
|
-
*/
|
72
|
-
ww.router.Path = function Path(route, uri) {
|
73
|
-
this.route = route;
|
74
|
-
var splitUri = this.pathSplit(uri);
|
75
|
-
|
76
|
-
// this.compiledUri = [];
|
77
|
-
|
78
|
-
// for (var splitUriIdx = 0; splitUriIdx != splitUri.length; splitUriIdx++) {
|
79
|
-
// if (splitUri[splitUriIdx].substring(0, 1) == ':') {
|
80
|
-
// this.compiledUri.push(
|
81
|
-
// "params['" + splitUri[splitUriIdx].substring(1) + "']"
|
82
|
-
// );
|
83
|
-
// } else {
|
84
|
-
// this.compiledUri.push("'" + splitUri[splitUriIdx] + "'");
|
85
|
-
// }
|
86
|
-
// }
|
87
|
-
|
88
|
-
this.compiledUri = uri;
|
89
|
-
|
90
|
-
this.groups = [];
|
91
|
-
|
92
|
-
for (var splitIndex = 0; splitIndex < splitUri.length; splitIndex++) {
|
93
|
-
var part = splitUri[splitIndex];
|
94
|
-
if (part == '/') {
|
95
|
-
this.groups.push([]);
|
96
|
-
} else if (part != '') {
|
97
|
-
this.groups[this.groups.length - 1].push(part);
|
98
|
-
}
|
99
|
-
}
|
100
|
-
};
|
101
|
-
|
102
|
-
/**
|
103
|
-
* Split a Path.
|
104
|
-
* @param {String} path The path.
|
105
|
-
* @return {Array} The split parts.
|
106
|
-
*/
|
107
|
-
ww.router.Path.prototype.pathSplit = function pathSplit(path) {
|
108
|
-
var splitParts = [];
|
109
|
-
var parts = path.split('/');
|
110
|
-
if (parts[0] == '') parts.shift();
|
111
|
-
|
112
|
-
for (var i = 0; i != parts.length; i++) {
|
113
|
-
splitParts.push('/');
|
114
|
-
splitParts.push('');
|
115
|
-
partChars = parts[i].split('');
|
116
|
-
|
117
|
-
var inVariable = false;
|
118
|
-
|
119
|
-
for (var j = 0; j != partChars.length; j++) {
|
120
|
-
if (inVariable) {
|
121
|
-
var code = partChars[j].charCodeAt(0);
|
122
|
-
if ((code >= 48 && code <= 57) || (code >= 65 && code <= 90) ||
|
123
|
-
(code >= 97 && code <= 122) || code == 95) {
|
124
|
-
splitParts[splitParts.length - 1] += partChars[j];
|
125
|
-
} else {
|
126
|
-
inVariable = false;
|
127
|
-
splitParts.push(partChars[j]);
|
128
|
-
}
|
129
|
-
} else if (partChars[j] == ':') {
|
130
|
-
inVariable = true;
|
131
|
-
if (splitParts[splitParts.length - 1] == '') {
|
132
|
-
splitParts[splitParts.length - 1] += ':';
|
133
|
-
} else {
|
134
|
-
splitParts.push(':');
|
135
|
-
}
|
136
|
-
} else {
|
137
|
-
splitParts[splitParts.length - 1] += partChars[j];
|
138
|
-
}
|
139
|
-
}
|
140
|
-
}
|
141
|
-
return splitParts;
|
142
|
-
};
|
143
|
-
|
144
|
-
/**
|
145
|
-
* Generate a path.
|
146
|
-
* @param {Object} params The params.
|
147
|
-
* @return {String} The path.
|
148
|
-
*/
|
149
|
-
ww.router.Path.prototype.generate = function pathGenerate(params) {
|
150
|
-
for (var varIdx = 0; varIdx != this.variableNames.length; varIdx++) {
|
151
|
-
if (!params[this.variableNames[varIdx]]) return undefined;
|
152
|
-
}
|
153
|
-
for (var varIdx = 0; varIdx != this.variableNames.length; varIdx++) {
|
154
|
-
var condition = this.route.matchingConditions[this.variableNames[varIdx]];
|
155
|
-
if (condition) {
|
156
|
-
var varName = params[this.variableNames[varIdx]].toString();
|
157
|
-
if (condition.exec(varName) != params[varName]) {
|
158
|
-
return undefined;
|
159
|
-
}
|
160
|
-
}
|
161
|
-
}
|
162
|
-
var path = this.compiledUri;
|
163
|
-
if (path.indexOf(':') >= 0) {
|
164
|
-
for (var varIdx = 0; varIdx != this.variableNames.length; varIdx++) {
|
165
|
-
path = path.replace(
|
166
|
-
':' + this.variableNames[varIdx],
|
167
|
-
params[this.variableNames[varIdx]]
|
168
|
-
);
|
169
|
-
delete params[this.variableNames[varIdx]];
|
170
|
-
}
|
171
|
-
} else {
|
172
|
-
for (var varIdx = 0; varIdx != this.variableNames.length; varIdx++) {
|
173
|
-
delete params[this.variableNames[varIdx]];
|
174
|
-
}
|
175
|
-
}
|
176
|
-
return path;
|
177
|
-
};
|
178
|
-
|
179
|
-
/**
|
180
|
-
* Compile a path.
|
181
|
-
*/
|
182
|
-
ww.router.Path.prototype.compile = function pathCompile() {
|
183
|
-
this.variableNames = [];
|
184
|
-
var currentNode = this.route.router.root;
|
185
|
-
for (var groupIdx = 0; groupIdx != this.groups.length; groupIdx++) {
|
186
|
-
var group = this.groups[groupIdx];
|
187
|
-
if (group.length > 1) {
|
188
|
-
var pattern = '^';
|
189
|
-
for (var partIndex = 0; partIndex != group.length; partIndex++) {
|
190
|
-
var part = group[partIndex];
|
191
|
-
var captureCount = 0;
|
192
|
-
if (part.substring(0, 1) == ':') {
|
193
|
-
var variableName = part.substring(1);
|
194
|
-
this.variableNames.push(variableName);
|
195
|
-
if (this.route.matchingConditions[variableName]) {
|
196
|
-
pattern += this.route.matchingConditions[variableName].toString();
|
197
|
-
} else {
|
198
|
-
pattern += '(.*?)';
|
199
|
-
}
|
200
|
-
captureCount += 1;
|
201
|
-
} else {
|
202
|
-
pattern += regexEscape_(part);
|
203
|
-
}
|
204
|
-
}
|
205
|
-
currentNode = currentNode.addLinear(new RegExp(pattern), captureCount);
|
206
|
-
} else if (group.length == 1) {
|
207
|
-
var part = group[0];
|
208
|
-
if (part.substring(0, 1) == ':') {
|
209
|
-
var variableName = part.substring(1);
|
210
|
-
this.variableNames.push(variableName);
|
211
|
-
if (this.route.matchingConditions[variableName]) {
|
212
|
-
var matched = this.route.matchingConditions[variableName];
|
213
|
-
currentNode = currentNode.addLinear(matched, 1);
|
214
|
-
} else {
|
215
|
-
currentNode = currentNode.addCatchall();
|
216
|
-
}
|
217
|
-
} else {
|
218
|
-
currentNode = currentNode.addLookup(part);
|
219
|
-
}
|
220
|
-
}
|
221
|
-
}
|
222
|
-
var nodes = currentNode.compileRequestConditions(
|
223
|
-
this.route.router,
|
224
|
-
this.route.requestConditions
|
225
|
-
);
|
226
|
-
for (var nodeIdx = 0; nodeIdx != nodes.length; nodeIdx++) {
|
227
|
-
nodes[nodeIdx].destination = this;
|
228
|
-
}
|
229
|
-
};
|
230
|
-
|
231
|
-
/**
|
232
|
-
* A Route.
|
233
|
-
* @constructor
|
234
|
-
* @param {ww.router.Router} router The parent router.
|
235
|
-
* @param {String} uri The route uri.
|
236
|
-
*/
|
237
|
-
ww.router.Route = function Route(router, uri) {
|
238
|
-
this.router = router;
|
239
|
-
this.requestConditions = {};
|
240
|
-
this.matchingConditions = {};
|
241
|
-
this.variableNames = [];
|
242
|
-
var paths = [''];
|
243
|
-
var chars = uri.split('');
|
244
|
-
|
245
|
-
var startIndex = 0;
|
246
|
-
var endIndex = 1;
|
247
|
-
|
248
|
-
for (var charIndex = 0; charIndex < chars.length; charIndex++) {
|
249
|
-
var c = chars[charIndex];
|
250
|
-
if (c == '(') {
|
251
|
-
// over current working set, double paths
|
252
|
-
for (var pathIndex = startIndex; pathIndex != endIndex; pathIndex++) {
|
253
|
-
paths.push(paths[pathIndex]);
|
254
|
-
}
|
255
|
-
// move working set to newly copied paths
|
256
|
-
startIndex = endIndex;
|
257
|
-
endIndex = paths.length;
|
258
|
-
} else if (c == ')') {
|
259
|
-
// expand working set scope
|
260
|
-
startIndex -= (endIndex - startIndex);
|
261
|
-
} else {
|
262
|
-
for (var i = startIndex; i != endIndex; i++) {
|
263
|
-
paths[i] += c;
|
264
|
-
}
|
265
|
-
}
|
266
|
-
}
|
267
|
-
|
268
|
-
this.partial = false;
|
269
|
-
this.paths = [];
|
270
|
-
for (var pathsIdx = 0; pathsIdx != paths.length; pathsIdx++) {
|
271
|
-
this.paths.push(new ww.router.Path(this, paths[pathsIdx]));
|
272
|
-
}
|
273
|
-
};
|
274
|
-
|
275
|
-
/**
|
276
|
-
* Set options on this route.
|
277
|
-
* @param {Object} options The route options.
|
278
|
-
* @return {ww.router.route} This router, for chaining.
|
279
|
-
*/
|
280
|
-
ww.router.Route.prototype.withOptions = function routeWithOptions(options) {
|
281
|
-
if (options['conditions']) {
|
282
|
-
this.condition(options['conditions']);
|
283
|
-
}
|
284
|
-
if (options['matchesWith']) {
|
285
|
-
this.matchesWith(options['matchesWith']);
|
286
|
-
}
|
287
|
-
if (options['matchPartially']) {
|
288
|
-
this.matchPartially(options['matchPartially']);
|
289
|
-
}
|
290
|
-
if (options['name']) {
|
291
|
-
this.matchPartially(options['name']);
|
292
|
-
}
|
293
|
-
return this;
|
294
|
-
};
|
295
|
-
|
296
|
-
/**
|
297
|
-
* Set name on this route.
|
298
|
-
* @param {String} routeName The route's name.
|
299
|
-
* @return {ww.router.route} This router, for chaining.
|
300
|
-
*/
|
301
|
-
ww.router.Route.prototype.name = function routeName(routeName) {
|
302
|
-
this.router.routes[routeName] = this;
|
303
|
-
return this;
|
304
|
-
};
|
305
|
-
|
306
|
-
/**
|
307
|
-
* Whether the route matches partially.
|
308
|
-
* @param {Boolena} partial The partial.
|
309
|
-
* @return {ww.router.route} This router, for chaining.
|
310
|
-
*/
|
311
|
-
ww.router.Route.prototype.matchPartially = function routeMatchPartial(partial) {
|
312
|
-
this.partial = (partial === undefined || partial === true);
|
313
|
-
return this;
|
314
|
-
};
|
315
|
-
|
316
|
-
/**
|
317
|
-
* Set route matches.
|
318
|
-
* @param {Object} matches Match keys.
|
319
|
-
* @return {ww.router.route} This router, for chaining.
|
320
|
-
*/
|
321
|
-
ww.router.Route.prototype.matchesWith = function routeMatchesWith(matches) {
|
322
|
-
for (var matchesKey in matches) {
|
323
|
-
this.matchingConditions[matchesKey] = matches[matchesKey];
|
324
|
-
}
|
325
|
-
return this;
|
326
|
-
};
|
327
|
-
|
328
|
-
/**
|
329
|
-
* Compile route.
|
330
|
-
*/
|
331
|
-
ww.router.Route.prototype.compile = function routeCompile() {
|
332
|
-
for (var pathIdx = 0; pathIdx != this.paths.length; pathIdx++) {
|
333
|
-
this.paths[pathIdx].compile();
|
334
|
-
var varNames = this.paths[pathIdx].variableNames;
|
335
|
-
for (var variableIdx = 0; variableIdx != varNames.length; variableIdx++) {
|
336
|
-
if (goog.array.indexOf(this.variableNames, varNames[variableIdx]) == -1) {
|
337
|
-
this.variableNames.push(varNames[variableIdx]);
|
338
|
-
}
|
339
|
-
}
|
340
|
-
}
|
341
|
-
};
|
342
|
-
|
343
|
-
/**
|
344
|
-
* Set route destination.
|
345
|
-
* @param {String} destination The destination.
|
346
|
-
* @return {ww.router.route} This router, for chaining.
|
347
|
-
*/
|
348
|
-
ww.router.Route.prototype.to = function routeTo(destination) {
|
349
|
-
this.compile();
|
350
|
-
this.destination = destination;
|
351
|
-
return this;
|
352
|
-
};
|
353
|
-
|
354
|
-
/**
|
355
|
-
* Set conditions on this route.
|
356
|
-
* @param {Object} conditions The route conditions.
|
357
|
-
* @return {ww.router.route} This router, for chaining.
|
358
|
-
*/
|
359
|
-
ww.router.Route.prototype.condition = function routeCondition(conditions) {
|
360
|
-
for (var conditionKey in conditions) {
|
361
|
-
this.requestConditions[conditionKey] = conditions[conditionKey];
|
362
|
-
}
|
363
|
-
return this;
|
364
|
-
};
|
365
|
-
|
366
|
-
/**
|
367
|
-
* Generate a URL from this route.
|
368
|
-
* @param {Object} params The route params.
|
369
|
-
* @return {String} The URL.
|
370
|
-
*/
|
371
|
-
ww.router.Route.prototype.generate = function routeGenerate(params) {
|
372
|
-
var path = undefined;
|
373
|
-
if (params == undefined || this.paths.length == 1) {
|
374
|
-
path = this.paths[0].generate(params);
|
375
|
-
} else {
|
376
|
-
for (var pathIdx = this.paths.length - 1; pathIdx >= 0; pathIdx--) {
|
377
|
-
path = this.paths[pathIdx].generate(params);
|
378
|
-
if (path) break;
|
379
|
-
}
|
380
|
-
}
|
381
|
-
|
382
|
-
if (path) {
|
383
|
-
path = encodeURI(path);
|
384
|
-
var query = '';
|
385
|
-
for (var key in params) {
|
386
|
-
query += (query == '' ? '?' : '&');
|
387
|
-
query += encodeURIComponent(key).replace(/%20/g, '+') + '=';
|
388
|
-
query += encodeURIComponent(params[key]).replace(/%20/g, '+');
|
389
|
-
}
|
390
|
-
return path + query;
|
391
|
-
} else {
|
392
|
-
return undefined;
|
393
|
-
}
|
394
|
-
};
|
395
|
-
|
396
|
-
/**
|
397
|
-
* A Router Node.
|
398
|
-
* @constructor
|
399
|
-
*/
|
400
|
-
ww.router.Node = function Node() {
|
401
|
-
this.reset();
|
402
|
-
};
|
403
|
-
|
404
|
-
/**
|
405
|
-
* Reset the node.
|
406
|
-
*/
|
407
|
-
ww.router.Node.prototype.reset = function nodeReset() {
|
408
|
-
this.linear = [];
|
409
|
-
this.lookup = {};
|
410
|
-
this.catchall = null;
|
411
|
-
};
|
412
|
-
|
413
|
-
/**
|
414
|
-
* Duplicate the node.
|
415
|
-
* @return {ww.router.Node} The duplicated node.
|
416
|
-
*/
|
417
|
-
ww.router.Node.prototype.dup = function nodeDup() {
|
418
|
-
var newNode = new ww.router.Node();
|
419
|
-
for (var idx = 0; idx != this.linear.length; idx++) {
|
420
|
-
newNode.linear.push(this.linear[idx]);
|
421
|
-
}
|
422
|
-
for (var key in this.lookup) {
|
423
|
-
newNode.lookup[key] = this.lookup[key];
|
424
|
-
}
|
425
|
-
newNode.catchall = this.catchall;
|
426
|
-
return newNode;
|
427
|
-
};
|
428
|
-
|
429
|
-
/**
|
430
|
-
* Add a linear to this node.
|
431
|
-
* @param {RegExp} regex The regex.
|
432
|
-
* @param {Number} count The count.
|
433
|
-
* @return {ww.router.Node} The new node.
|
434
|
-
*/
|
435
|
-
ww.router.Node.prototype.addLinear = function nodeAddLinear(regex, count) {
|
436
|
-
var newNode = new ww.router.Node();
|
437
|
-
this.linear.push([regex, count, newNode]);
|
438
|
-
return newNode;
|
439
|
-
};
|
440
|
-
|
441
|
-
/**
|
442
|
-
* Add a catchall to this node.
|
443
|
-
* @return {ww.router.Node} Catchall node.
|
444
|
-
*/
|
445
|
-
ww.router.Node.prototype.addCatchall = function nodeAddCatchall() {
|
446
|
-
if (!this.catchall) {
|
447
|
-
this.catchall = new ww.router.Node();
|
448
|
-
}
|
449
|
-
return this.catchall;
|
450
|
-
};
|
451
|
-
|
452
|
-
/**
|
453
|
-
* Add lookup to this node.
|
454
|
-
* @param {String} part Lookup name.
|
455
|
-
* @return {ww.router.Node} The lookup node.
|
456
|
-
*/
|
457
|
-
ww.router.Node.prototype.addLookup = function nodeAddLookup(part) {
|
458
|
-
if (!this.lookup[part]) {
|
459
|
-
this.lookup[part] = new ww.router.Node();
|
460
|
-
}
|
461
|
-
return this.lookup[part];
|
462
|
-
};
|
463
|
-
|
464
|
-
/**
|
465
|
-
* Add a request node.
|
466
|
-
* @return {ww.router.Node} The request node.
|
467
|
-
*/
|
468
|
-
ww.router.Node.prototype.addRequestNode = function nodeAddRequestNode() {
|
469
|
-
if (!this.requestNode) {
|
470
|
-
this.requestNode = new ww.router.Node();
|
471
|
-
this.requestNode.requestMethod = null;
|
472
|
-
}
|
473
|
-
return this.requestNode;
|
474
|
-
};
|
475
|
-
|
476
|
-
/**
|
477
|
-
* Find a node.
|
478
|
-
* @param {Array} parts Node parts.
|
479
|
-
* @param {Request} request The request.
|
480
|
-
* @param {Object} params Find params.
|
481
|
-
* @return {ww.router.Response} The found response.
|
482
|
-
*/
|
483
|
-
ww.router.Node.prototype.find = function nodeFind(parts, request, params) {
|
484
|
-
if (this.requestNode || this.destination && this.destination.route.partial) {
|
485
|
-
var target = this;
|
486
|
-
if (target.requestNode) {
|
487
|
-
target = target.requestNode.findRequest(request);
|
488
|
-
}
|
489
|
-
if (target && target.destination && target.destination.route.partial) {
|
490
|
-
return new ww.router.Response(target.destination, params);
|
491
|
-
}
|
492
|
-
}
|
493
|
-
if (parts.length == 0) {
|
494
|
-
var target = this;
|
495
|
-
if (this.requestNode) {
|
496
|
-
target = this.requestNode.findRequest(request);
|
497
|
-
}
|
498
|
-
if (target && target.destination) {
|
499
|
-
return new ww.router.Response(target.destination, params);
|
500
|
-
} else {
|
501
|
-
return undefined;
|
502
|
-
}
|
503
|
-
} else {
|
504
|
-
if (this.linear.length != 0) {
|
505
|
-
var wholePath = parts.join('/');
|
506
|
-
for (var linearIdx = 0; linearIdx != this.linear.length; linearIdx++) {
|
507
|
-
var lin = this.linear[linearIdx];
|
508
|
-
var match = lin[0].exec(wholePath);
|
509
|
-
if (match) {
|
510
|
-
var matchedParams = [];
|
511
|
-
if (match[1] === undefined) {
|
512
|
-
matchedParams.push(match[0]);
|
513
|
-
} else {
|
514
|
-
for (var matchIdx = 1; matchIdx <= lin[1] + 1; matchIdx++) {
|
515
|
-
matchedParams.push(match[matchIdx]);
|
516
|
-
}
|
517
|
-
}
|
518
|
-
|
519
|
-
var newParams = params.concat(matchedParams);
|
520
|
-
matchedIndex = match.shift().length;
|
521
|
-
var resplitParts = wholePath.substring(matchedIndex).split('/');
|
522
|
-
if (resplitParts.length == 1 && resplitParts[0] == '') {
|
523
|
-
resplitParts.shift();
|
524
|
-
}
|
525
|
-
var potentialMatch = lin[2].find(resplitParts, request, newParams);
|
526
|
-
if (potentialMatch) return potentialMatch;
|
527
|
-
}
|
528
|
-
}
|
529
|
-
}
|
530
|
-
if (this.lookup[parts[0]]) {
|
531
|
-
var potentialMatch = this.lookup[parts[0]].find(
|
532
|
-
parts.slice(1, parts.length),
|
533
|
-
request,
|
534
|
-
params
|
535
|
-
);
|
536
|
-
if (potentialMatch) return potentialMatch;
|
537
|
-
}
|
538
|
-
if (this.catchall) {
|
539
|
-
var part = parts.shift();
|
540
|
-
params.push(part);
|
541
|
-
return this.catchall.find(parts, request, params);
|
542
|
-
}
|
543
|
-
}
|
544
|
-
return undefined;
|
545
|
-
};
|
546
|
-
|
547
|
-
/**
|
548
|
-
* Find the request.
|
549
|
-
* @param {Request} request The request.
|
550
|
-
* @return {ww.router.Node} The found node.
|
551
|
-
*/
|
552
|
-
ww.router.Node.prototype.findRequest = function nodeFindRequest(request) {
|
553
|
-
if (this.requestMethod) {
|
554
|
-
if (this.linear.length != 0 && request[this.requestMethod]) {
|
555
|
-
for (var linearIdx = 0; linearIdx != this.linear.length; linearIdx++) {
|
556
|
-
var lin = this.linear[linearIdx];
|
557
|
-
var match = lin[0].exec(request[this.requestMethod]);
|
558
|
-
if (match) {
|
559
|
-
matchedIndex = match.shift().length;
|
560
|
-
var potentialMatch = lin[2].findRequest(request);
|
561
|
-
if (potentialMatch) return potentialMatch;
|
562
|
-
}
|
563
|
-
}
|
564
|
-
}
|
565
|
-
var foundMeth = this.lookup[request[this.requestMethod]];
|
566
|
-
if (request[this.requestMethod] && foundMeth) {
|
567
|
-
var potentialMatch = foundMeth.findRequest(request);
|
568
|
-
if (potentialMatch) {
|
569
|
-
return potentialMatch;
|
570
|
-
}
|
571
|
-
}
|
572
|
-
if (this.catchall) {
|
573
|
-
return this.catchall.findRequest(request);
|
574
|
-
}
|
575
|
-
} else if (this.destination) {
|
576
|
-
return this;
|
577
|
-
} else {
|
578
|
-
return undefined;
|
579
|
-
}
|
580
|
-
};
|
581
|
-
|
582
|
-
/**
|
583
|
-
* Transplant the value.
|
584
|
-
*/
|
585
|
-
ww.router.Node.prototype.transplantValue = function nodeTransplantValue() {
|
586
|
-
if (this.destination && this.requestNode) {
|
587
|
-
var targetNode = this.requestNode;
|
588
|
-
while (targetNode.requestMethod) {
|
589
|
-
targetNode = (targetNode.addCatchall());
|
590
|
-
}
|
591
|
-
targetNode.destination = this.destination;
|
592
|
-
this.destination = undefined;
|
593
|
-
}
|
594
|
-
};
|
595
|
-
|
596
|
-
/**
|
597
|
-
* Compile request conditions.
|
598
|
-
* @param {ww.router.Router} router The router.
|
599
|
-
* @param {Object} reqConds The request conditions.
|
600
|
-
* @return {Array} The current nodes.
|
601
|
-
*/
|
602
|
-
ww.router.Node.prototype.compileRequestConditions =
|
603
|
-
function nodeCompileReqConds(router, reqConds) {
|
604
|
-
var cNodes = [this];
|
605
|
-
var reqMeths = router.requestKeys;
|
606
|
-
for (var requestMethodIdx in reqMeths) {
|
607
|
-
var method = reqMeths[requestMethodIdx];
|
608
|
-
// so, the request method we care about it ..
|
609
|
-
if (reqConds[method]) {
|
610
|
-
if (cNodes.length == 1 && cNodes[0] === this) {
|
611
|
-
cNodes = [this.addRequestNode()];
|
612
|
-
}
|
613
|
-
|
614
|
-
for (var cNodeIndex = 0; cNodeIndex != cNodes.length; cNodeIndex++) {
|
615
|
-
var cNode = cNodes[cNodeIndex];
|
616
|
-
if (!cNode.requestMethod) {
|
617
|
-
cNode.requestMethod = method;
|
618
|
-
}
|
619
|
-
|
620
|
-
var masterPosition = goog.array.indexOf(reqMeths, method);
|
621
|
-
var currentPosition = goog.array.indexOf(
|
622
|
-
reqMeths,
|
623
|
-
cNode.requestMethod
|
624
|
-
);
|
625
|
-
|
626
|
-
if (masterPosition == currentPosition) {
|
627
|
-
if (reqConds[method].compile) {
|
628
|
-
cNodes[cNodeIndex] = cNodes[cNodeIndex].addLinear(
|
629
|
-
reqConds[method],
|
630
|
-
0
|
631
|
-
);
|
632
|
-
} else {
|
633
|
-
cNodes[cNodeIndex] = cNodes[cNodeIndex].addLookup(
|
634
|
-
reqConds[method]
|
635
|
-
);
|
636
|
-
}
|
637
|
-
} else if (masterPosition < currentPosition) {
|
638
|
-
cNodes[cNodeIndex] = cNodes[cNodeIndex].addCatchall();
|
639
|
-
} else {
|
640
|
-
var nextNode = cNode.dup();
|
641
|
-
cNode.reset();
|
642
|
-
cNode.requestMethod = method;
|
643
|
-
cNode.catchall = nextNode;
|
644
|
-
cNodeIndex--;
|
645
|
-
}
|
646
|
-
}
|
647
|
-
} else {
|
648
|
-
for (var cNodeIndex = 0; cNodeIndex != cNodes.length; cNodeIndex++) {
|
649
|
-
var node = cNodes[cNodeIndex];
|
650
|
-
if (!node.requestMethod && node.requestNode) {
|
651
|
-
node = node.requestNode;
|
652
|
-
}
|
653
|
-
if (node.requestMethod) {
|
654
|
-
cNodes[cNodeIndex] = node.addCatchall();
|
655
|
-
cNodes[cNodeIndex].requestMethod = null;
|
656
|
-
}
|
657
|
-
}
|
658
|
-
}
|
659
|
-
}
|
660
|
-
this.transplantValue();
|
661
|
-
return cNodes;
|
662
|
-
};
|
663
|
-
|
664
|
-
/**
|
665
|
-
* A Router response.
|
666
|
-
* @constructor
|
667
|
-
* @param {String} path The response path.
|
668
|
-
* @param {Object} params Additional options.
|
669
|
-
*/
|
670
|
-
ww.router.Response = function Response(path, params) {
|
671
|
-
this.path = path;
|
672
|
-
this.route = path.route;
|
673
|
-
this.paramsArray = params;
|
674
|
-
this.destination = this.route.destination;
|
675
|
-
this.params = {};
|
676
|
-
for (var varIdx = 0; varIdx != this.path.variableNames.length; varIdx++) {
|
677
|
-
this.params[this.path.variableNames[varIdx]] = this.paramsArray[varIdx];
|
678
|
-
}
|
679
|
-
};
|