prerender_rails_embedded 0.2.1 → 0.2.2

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.
@@ -7,7 +7,9 @@
7
7
  var EVALUATE_JAVASCRIPT_CHECK_TIMEOUT = 50;
8
8
 
9
9
  var page = require('webpage').create(),
10
- system = require('system');
10
+ system = require('system'),
11
+ URI = require('./URI');
12
+
11
13
  var surrender = {};
12
14
  page.viewportSize = {
13
15
  width: 1024,
@@ -29,7 +31,7 @@ surrender.javascriptToExecuteOnPage = function() {
29
31
  } else {
30
32
  return window.prerenderRailsEmbedded.filterHtmlOutput.call(this);
31
33
  }
32
- }
34
+ };
33
35
 
34
36
  try {
35
37
 
@@ -84,7 +86,7 @@ surrender.evaluateJavascriptOnPage = function(t) {
84
86
  surrender.run = function() {
85
87
  try {
86
88
  var _this = this;
87
- page.address = this.params().address;
89
+ page.address = this.removeEscapedFragmentParameter(this.params().address);
88
90
  page.settings.userAgent = 'EtaliaBotAgent';
89
91
  page.open(page.address, function (st) {
90
92
  if (st !== 'success') throw 'FAIL to load the address';
@@ -109,7 +111,23 @@ surrender.run = function() {
109
111
  //page.onConsoleMessage = function(msg, lineNum, sourceId) {
110
112
  // console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
111
113
  //};
114
+ };
115
+
116
+ surrender.removeEscapedFragmentParameter = function (addressUrl) {
117
+ var parts = new URI(addressUrl);
118
+
119
+ // Remove the _escaped_fragment_ query parameter
120
+ if (parts.hasSearch('_escaped_fragment_')) {
121
+ if(parts.search(true)['_escaped_fragment_']) {
122
+ parts.hash("#!" + parts.search(true)['_escaped_fragment_']);
123
+ }
124
+ parts.removeSearch('_escaped_fragment_');
125
+ }
126
+
127
+ var newUrl = parts.toString();
128
+ if(newUrl[0] === '/') newUrl = newUrl.substr(1);
112
129
 
130
+ return newUrl;
113
131
  };
114
132
 
115
133
  surrender.run();
@@ -0,0 +1,508 @@
1
+ /*! http://mths.be/punycode v1.2.3 by @mathias */
2
+ ;(function(root) {
3
+
4
+ /** Detect free variables */
5
+ var freeExports = typeof exports == 'object' && exports;
6
+ var freeModule = typeof module == 'object' && module &&
7
+ module.exports == freeExports && module;
8
+ var freeGlobal = typeof global == 'object' && global;
9
+ if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
10
+ root = freeGlobal;
11
+ }
12
+
13
+ /**
14
+ * The `punycode` object.
15
+ * @name punycode
16
+ * @type Object
17
+ */
18
+ var punycode,
19
+
20
+ /** Highest positive signed 32-bit float value */
21
+ maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
22
+
23
+ /** Bootstring parameters */
24
+ base = 36,
25
+ tMin = 1,
26
+ tMax = 26,
27
+ skew = 38,
28
+ damp = 700,
29
+ initialBias = 72,
30
+ initialN = 128, // 0x80
31
+ delimiter = '-', // '\x2D'
32
+
33
+ /** Regular expressions */
34
+ regexPunycode = /^xn--/,
35
+ regexNonASCII = /[^ -~]/, // unprintable ASCII chars + non-ASCII chars
36
+ regexSeparators = /\x2E|\u3002|\uFF0E|\uFF61/g, // RFC 3490 separators
37
+
38
+ /** Error messages */
39
+ errors = {
40
+ 'overflow': 'Overflow: input needs wider integers to process',
41
+ 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
42
+ 'invalid-input': 'Invalid input'
43
+ },
44
+
45
+ /** Convenience shortcuts */
46
+ baseMinusTMin = base - tMin,
47
+ floor = Math.floor,
48
+ stringFromCharCode = String.fromCharCode,
49
+
50
+ /** Temporary variable */
51
+ key;
52
+
53
+ /*--------------------------------------------------------------------------*/
54
+
55
+ /**
56
+ * A generic error utility function.
57
+ * @private
58
+ * @param {String} type The error type.
59
+ * @returns {Error} Throws a `RangeError` with the applicable error message.
60
+ */
61
+ function error(type) {
62
+ throw RangeError(errors[type]);
63
+ }
64
+
65
+ /**
66
+ * A generic `Array#map` utility function.
67
+ * @private
68
+ * @param {Array} array The array to iterate over.
69
+ * @param {Function} callback The function that gets called for every array
70
+ * item.
71
+ * @returns {Array} A new array of values returned by the callback function.
72
+ */
73
+ function map(array, fn) {
74
+ var length = array.length;
75
+ while (length--) {
76
+ array[length] = fn(array[length]);
77
+ }
78
+ return array;
79
+ }
80
+
81
+ /**
82
+ * A simple `Array#map`-like wrapper to work with domain name strings.
83
+ * @private
84
+ * @param {String} domain The domain name.
85
+ * @param {Function} callback The function that gets called for every
86
+ * character.
87
+ * @returns {Array} A new string of characters returned by the callback
88
+ * function.
89
+ */
90
+ function mapDomain(string, fn) {
91
+ return map(string.split(regexSeparators), fn).join('.');
92
+ }
93
+
94
+ /**
95
+ * Creates an array containing the numeric code points of each Unicode
96
+ * character in the string. While JavaScript uses UCS-2 internally,
97
+ * this function will convert a pair of surrogate halves (each of which
98
+ * UCS-2 exposes as separate characters) into a single code point,
99
+ * matching UTF-16.
100
+ * @see `punycode.ucs2.encode`
101
+ * @see <http://mathiasbynens.be/notes/javascript-encoding>
102
+ * @memberOf punycode.ucs2
103
+ * @name decode
104
+ * @param {String} string The Unicode input string (UCS-2).
105
+ * @returns {Array} The new array of code points.
106
+ */
107
+ function ucs2decode(string) {
108
+ var output = [],
109
+ counter = 0,
110
+ length = string.length,
111
+ value,
112
+ extra;
113
+ while (counter < length) {
114
+ value = string.charCodeAt(counter++);
115
+ if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
116
+ // high surrogate, and there is a next character
117
+ extra = string.charCodeAt(counter++);
118
+ if ((extra & 0xFC00) == 0xDC00) { // low surrogate
119
+ output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
120
+ } else {
121
+ // unmatched surrogate; only append this code unit, in case the next
122
+ // code unit is the high surrogate of a surrogate pair
123
+ output.push(value);
124
+ counter--;
125
+ }
126
+ } else {
127
+ output.push(value);
128
+ }
129
+ }
130
+ return output;
131
+ }
132
+
133
+ /**
134
+ * Creates a string based on an array of numeric code points.
135
+ * @see `punycode.ucs2.decode`
136
+ * @memberOf punycode.ucs2
137
+ * @name encode
138
+ * @param {Array} codePoints The array of numeric code points.
139
+ * @returns {String} The new Unicode string (UCS-2).
140
+ */
141
+ function ucs2encode(array) {
142
+ return map(array, function(value) {
143
+ var output = '';
144
+ if (value > 0xFFFF) {
145
+ value -= 0x10000;
146
+ output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
147
+ value = 0xDC00 | value & 0x3FF;
148
+ }
149
+ output += stringFromCharCode(value);
150
+ return output;
151
+ }).join('');
152
+ }
153
+
154
+ /**
155
+ * Converts a basic code point into a digit/integer.
156
+ * @see `digitToBasic()`
157
+ * @private
158
+ * @param {Number} codePoint The basic numeric code point value.
159
+ * @returns {Number} The numeric value of a basic code point (for use in
160
+ * representing integers) in the range `0` to `base - 1`, or `base` if
161
+ * the code point does not represent a value.
162
+ */
163
+ function basicToDigit(codePoint) {
164
+ if (codePoint - 48 < 10) {
165
+ return codePoint - 22;
166
+ }
167
+ if (codePoint - 65 < 26) {
168
+ return codePoint - 65;
169
+ }
170
+ if (codePoint - 97 < 26) {
171
+ return codePoint - 97;
172
+ }
173
+ return base;
174
+ }
175
+
176
+ /**
177
+ * Converts a digit/integer into a basic code point.
178
+ * @see `basicToDigit()`
179
+ * @private
180
+ * @param {Number} digit The numeric value of a basic code point.
181
+ * @returns {Number} The basic code point whose value (when used for
182
+ * representing integers) is `digit`, which needs to be in the range
183
+ * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
184
+ * used; else, the lowercase form is used. The behavior is undefined
185
+ * if `flag` is non-zero and `digit` has no uppercase form.
186
+ */
187
+ function digitToBasic(digit, flag) {
188
+ // 0..25 map to ASCII a..z or A..Z
189
+ // 26..35 map to ASCII 0..9
190
+ return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
191
+ }
192
+
193
+ /**
194
+ * Bias adaptation function as per section 3.4 of RFC 3492.
195
+ * http://tools.ietf.org/html/rfc3492#section-3.4
196
+ * @private
197
+ */
198
+ function adapt(delta, numPoints, firstTime) {
199
+ var k = 0;
200
+ delta = firstTime ? floor(delta / damp) : delta >> 1;
201
+ delta += floor(delta / numPoints);
202
+ for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
203
+ delta = floor(delta / baseMinusTMin);
204
+ }
205
+ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
206
+ }
207
+
208
+ /**
209
+ * Converts a Punycode string of ASCII-only symbols to a string of Unicode
210
+ * symbols.
211
+ * @memberOf punycode
212
+ * @param {String} input The Punycode string of ASCII-only symbols.
213
+ * @returns {String} The resulting string of Unicode symbols.
214
+ */
215
+ function decode(input) {
216
+ // Don't use UCS-2
217
+ var output = [],
218
+ inputLength = input.length,
219
+ out,
220
+ i = 0,
221
+ n = initialN,
222
+ bias = initialBias,
223
+ basic,
224
+ j,
225
+ index,
226
+ oldi,
227
+ w,
228
+ k,
229
+ digit,
230
+ t,
231
+ length,
232
+ /** Cached calculation results */
233
+ baseMinusT;
234
+
235
+ // Handle the basic code points: let `basic` be the number of input code
236
+ // points before the last delimiter, or `0` if there is none, then copy
237
+ // the first basic code points to the output.
238
+
239
+ basic = input.lastIndexOf(delimiter);
240
+ if (basic < 0) {
241
+ basic = 0;
242
+ }
243
+
244
+ for (j = 0; j < basic; ++j) {
245
+ // if it's not a basic code point
246
+ if (input.charCodeAt(j) >= 0x80) {
247
+ error('not-basic');
248
+ }
249
+ output.push(input.charCodeAt(j));
250
+ }
251
+
252
+ // Main decoding loop: start just after the last delimiter if any basic code
253
+ // points were copied; start at the beginning otherwise.
254
+
255
+ for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
256
+
257
+ // `index` is the index of the next character to be consumed.
258
+ // Decode a generalized variable-length integer into `delta`,
259
+ // which gets added to `i`. The overflow checking is easier
260
+ // if we increase `i` as we go, then subtract off its starting
261
+ // value at the end to obtain `delta`.
262
+ for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
263
+
264
+ if (index >= inputLength) {
265
+ error('invalid-input');
266
+ }
267
+
268
+ digit = basicToDigit(input.charCodeAt(index++));
269
+
270
+ if (digit >= base || digit > floor((maxInt - i) / w)) {
271
+ error('overflow');
272
+ }
273
+
274
+ i += digit * w;
275
+ t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
276
+
277
+ if (digit < t) {
278
+ break;
279
+ }
280
+
281
+ baseMinusT = base - t;
282
+ if (w > floor(maxInt / baseMinusT)) {
283
+ error('overflow');
284
+ }
285
+
286
+ w *= baseMinusT;
287
+
288
+ }
289
+
290
+ out = output.length + 1;
291
+ bias = adapt(i - oldi, out, oldi == 0);
292
+
293
+ // `i` was supposed to wrap around from `out` to `0`,
294
+ // incrementing `n` each time, so we'll fix that now:
295
+ if (floor(i / out) > maxInt - n) {
296
+ error('overflow');
297
+ }
298
+
299
+ n += floor(i / out);
300
+ i %= out;
301
+
302
+ // Insert `n` at position `i` of the output
303
+ output.splice(i++, 0, n);
304
+
305
+ }
306
+
307
+ return ucs2encode(output);
308
+ }
309
+
310
+ /**
311
+ * Converts a string of Unicode symbols to a Punycode string of ASCII-only
312
+ * symbols.
313
+ * @memberOf punycode
314
+ * @param {String} input The string of Unicode symbols.
315
+ * @returns {String} The resulting Punycode string of ASCII-only symbols.
316
+ */
317
+ function encode(input) {
318
+ var n,
319
+ delta,
320
+ handledCPCount,
321
+ basicLength,
322
+ bias,
323
+ j,
324
+ m,
325
+ q,
326
+ k,
327
+ t,
328
+ currentValue,
329
+ output = [],
330
+ /** `inputLength` will hold the number of code points in `input`. */
331
+ inputLength,
332
+ /** Cached calculation results */
333
+ handledCPCountPlusOne,
334
+ baseMinusT,
335
+ qMinusT;
336
+
337
+ // Convert the input in UCS-2 to Unicode
338
+ input = ucs2decode(input);
339
+
340
+ // Cache the length
341
+ inputLength = input.length;
342
+
343
+ // Initialize the state
344
+ n = initialN;
345
+ delta = 0;
346
+ bias = initialBias;
347
+
348
+ // Handle the basic code points
349
+ for (j = 0; j < inputLength; ++j) {
350
+ currentValue = input[j];
351
+ if (currentValue < 0x80) {
352
+ output.push(stringFromCharCode(currentValue));
353
+ }
354
+ }
355
+
356
+ handledCPCount = basicLength = output.length;
357
+
358
+ // `handledCPCount` is the number of code points that have been handled;
359
+ // `basicLength` is the number of basic code points.
360
+
361
+ // Finish the basic string - if it is not empty - with a delimiter
362
+ if (basicLength) {
363
+ output.push(delimiter);
364
+ }
365
+
366
+ // Main encoding loop:
367
+ while (handledCPCount < inputLength) {
368
+
369
+ // All non-basic code points < n have been handled already. Find the next
370
+ // larger one:
371
+ for (m = maxInt, j = 0; j < inputLength; ++j) {
372
+ currentValue = input[j];
373
+ if (currentValue >= n && currentValue < m) {
374
+ m = currentValue;
375
+ }
376
+ }
377
+
378
+ // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
379
+ // but guard against overflow
380
+ handledCPCountPlusOne = handledCPCount + 1;
381
+ if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
382
+ error('overflow');
383
+ }
384
+
385
+ delta += (m - n) * handledCPCountPlusOne;
386
+ n = m;
387
+
388
+ for (j = 0; j < inputLength; ++j) {
389
+ currentValue = input[j];
390
+
391
+ if (currentValue < n && ++delta > maxInt) {
392
+ error('overflow');
393
+ }
394
+
395
+ if (currentValue == n) {
396
+ // Represent delta as a generalized variable-length integer
397
+ for (q = delta, k = base; /* no condition */; k += base) {
398
+ t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
399
+ if (q < t) {
400
+ break;
401
+ }
402
+ qMinusT = q - t;
403
+ baseMinusT = base - t;
404
+ output.push(
405
+ stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
406
+ );
407
+ q = floor(qMinusT / baseMinusT);
408
+ }
409
+
410
+ output.push(stringFromCharCode(digitToBasic(q, 0)));
411
+ bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
412
+ delta = 0;
413
+ ++handledCPCount;
414
+ }
415
+ }
416
+
417
+ ++delta;
418
+ ++n;
419
+
420
+ }
421
+ return output.join('');
422
+ }
423
+
424
+ /**
425
+ * Converts a Punycode string representing a domain name to Unicode. Only the
426
+ * Punycoded parts of the domain name will be converted, i.e. it doesn't
427
+ * matter if you call it on a string that has already been converted to
428
+ * Unicode.
429
+ * @memberOf punycode
430
+ * @param {String} domain The Punycode domain name to convert to Unicode.
431
+ * @returns {String} The Unicode representation of the given Punycode
432
+ * string.
433
+ */
434
+ function toUnicode(domain) {
435
+ return mapDomain(domain, function(string) {
436
+ return regexPunycode.test(string)
437
+ ? decode(string.slice(4).toLowerCase())
438
+ : string;
439
+ });
440
+ }
441
+
442
+ /**
443
+ * Converts a Unicode string representing a domain name to Punycode. Only the
444
+ * non-ASCII parts of the domain name will be converted, i.e. it doesn't
445
+ * matter if you call it with a domain that's already in ASCII.
446
+ * @memberOf punycode
447
+ * @param {String} domain The domain name to convert, as a Unicode string.
448
+ * @returns {String} The Punycode representation of the given domain name.
449
+ */
450
+ function toASCII(domain) {
451
+ return mapDomain(domain, function(string) {
452
+ return regexNonASCII.test(string)
453
+ ? 'xn--' + encode(string)
454
+ : string;
455
+ });
456
+ }
457
+
458
+ /*--------------------------------------------------------------------------*/
459
+
460
+ /** Define the public API */
461
+ punycode = {
462
+ /**
463
+ * A string representing the current Punycode.js version number.
464
+ * @memberOf punycode
465
+ * @type String
466
+ */
467
+ 'version': '1.2.3',
468
+ /**
469
+ * An object of methods to convert from JavaScript's internal character
470
+ * representation (UCS-2) to Unicode code points, and back.
471
+ * @see <http://mathiasbynens.be/notes/javascript-encoding>
472
+ * @memberOf punycode
473
+ * @type Object
474
+ */
475
+ 'ucs2': {
476
+ 'decode': ucs2decode,
477
+ 'encode': ucs2encode
478
+ },
479
+ 'decode': decode,
480
+ 'encode': encode,
481
+ 'toASCII': toASCII,
482
+ 'toUnicode': toUnicode
483
+ };
484
+
485
+ /** Expose `punycode` */
486
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
487
+ // like the following:
488
+ if (
489
+ typeof define == 'function' &&
490
+ typeof define.amd == 'object' &&
491
+ define.amd
492
+ ) {
493
+ define(function() {
494
+ return punycode;
495
+ });
496
+ } else if (freeExports && !freeExports.nodeType) {
497
+ if (freeModule) { // in Node.js or RingoJS v0.8.0+
498
+ freeModule.exports = punycode;
499
+ } else { // in Narwhal or RingoJS v0.7.0-
500
+ for (key in punycode) {
501
+ punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
502
+ }
503
+ }
504
+ } else { // in Rhino or a web browser
505
+ root.punycode = punycode;
506
+ }
507
+
508
+ }(this));