uri-js-rails 1.11.2 → 1.14.1

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.
@@ -2,231 +2,234 @@
2
2
  * URI.js - Mutating URLs
3
3
  * jQuery Plugin
4
4
  *
5
- * Version: 1.11.2
5
+ * Version: 1.14.1
6
6
  *
7
7
  * Author: Rodney Rehm
8
- * Web: http://medialize.github.com/URI.js/jquery-uri-plugin.html
8
+ * Web: http://medialize.github.io/URI.js/jquery-uri-plugin.html
9
9
  *
10
10
  * Licensed under
11
11
  * MIT License http://www.opensource.org/licenses/mit-license
12
12
  * GPL v3 http://opensource.org/licenses/GPL-3.0
13
13
  *
14
14
  */
15
-
16
15
  (function (root, factory) {
17
- // https://github.com/umdjs/umd/blob/master/returnExports.js
18
- if (typeof exports === 'object') {
19
- // Node
20
- module.exports = factory(require('jquery', './URI'));
21
- } else if (typeof define === 'function' && define.amd) {
22
- // AMD. Register as an anonymous module.
23
- define(['jquery', './URI'], factory);
24
- } else {
25
- // Browser globals (root is window)
26
- factory(root.jQuery, root.URI);
27
- }
16
+ 'use strict';
17
+ // https://github.com/umdjs/umd/blob/master/returnExports.js
18
+ if (typeof exports === 'object') {
19
+ // Node
20
+ module.exports = factory(require('jquery', './URI'));
21
+ } else if (typeof define === 'function' && define.amd) {
22
+ // AMD. Register as an anonymous module.
23
+ define(['jquery', './URI'], factory);
24
+ } else {
25
+ // Browser globals (root is window)
26
+ factory(root.jQuery, root.URI);
27
+ }
28
28
  }(this, function ($, URI) {
29
- "use strict";
29
+ 'use strict';
30
+ // FIXME: v2.0.0 renamce non-camelCase properties to uppercase
31
+ /*jshint camelcase: false */
30
32
 
31
- var comparable = {};
32
- var compare = {
33
+ var comparable = {};
34
+ var compare = {
33
35
  // equals
34
36
  '=': function(value, target) {
35
- return value === target;
37
+ return value === target;
36
38
  },
37
39
  // ~= translates to value.match((?:^|\s)target(?:\s|$)) which is useless for URIs
38
40
  // |= translates to value.match((?:\b)target(?:-|\s|$)) which is useless for URIs
39
41
  // begins with
40
- '^=': function(value, target, property) {
41
- return !!(value + "").match(new RegExp('^' + escapeRegEx(target), 'i'));
42
+ '^=': function(value, target) {
43
+ return !!(value + '').match(new RegExp('^' + escapeRegEx(target), 'i'));
42
44
  },
43
45
  // ends with
44
- '$=': function(value, target, property) {
45
- return !!(value + "").match(new RegExp(escapeRegEx(target) + '$', 'i'));
46
+ '$=': function(value, target) {
47
+ return !!(value + '').match(new RegExp(escapeRegEx(target) + '$', 'i'));
46
48
  },
47
49
  // contains
48
50
  '*=': function(value, target, property) {
49
- if (property == 'directory') {
50
- // add trailing slash so /dir/ will match the deep-end as well
51
- value += '/';
52
- }
53
-
54
- return !!(value + "").match(new RegExp(escapeRegEx(target), 'i'));
51
+ if (property === 'directory') {
52
+ // add trailing slash so /dir/ will match the deep-end as well
53
+ value += '/';
54
+ }
55
+
56
+ return !!(value + '').match(new RegExp(escapeRegEx(target), 'i'));
55
57
  },
56
58
  'equals:': function(uri, target) {
57
- return uri.equals(target);
59
+ return uri.equals(target);
58
60
  },
59
61
  'is:': function(uri, target) {
60
- return uri.is(target);
62
+ return uri.is(target);
61
63
  }
62
- };
64
+ };
63
65
 
64
- function escapeRegEx(string) {
66
+ function escapeRegEx(string) {
65
67
  // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963
66
68
  return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
67
- }
69
+ }
68
70
 
69
- function getUriProperty(elem) {
71
+ function getUriProperty(elem) {
70
72
  var nodeName = elem.nodeName.toLowerCase();
71
73
  var property = URI.domAttributes[nodeName];
72
74
  if (nodeName === 'input' && elem.type !== 'image') {
73
- // compensate ambiguous <input> that is not an image
74
- return undefined;
75
+ // compensate ambiguous <input> that is not an image
76
+ return undefined;
75
77
  }
76
-
78
+
77
79
  // NOTE: as we use a static mapping from element to attribute,
78
80
  // the HTML5 attribute issue should not come up again
79
81
  // https://github.com/medialize/URI.js/issues/69
80
82
  return property;
81
- }
83
+ }
82
84
 
83
- function generateAccessor(property) {
85
+ function generateAccessor(property) {
84
86
  return {
85
- get: function(elem) {
86
- return $(elem).uri()[property]();
87
- },
88
- set: function(elem, value) {
89
- $(elem).uri()[property](value);
90
- return value;
91
- }
87
+ get: function(elem) {
88
+ return $(elem).uri()[property]();
89
+ },
90
+ set: function(elem, value) {
91
+ $(elem).uri()[property](value);
92
+ return value;
93
+ }
92
94
  };
93
- };
95
+ }
94
96
 
95
- // populate lookup table and register $.attr('uri:accessor') handlers
96
- $.each('authority directory domain filename fragment hash host hostname href password path pathname port protocol query resource scheme search subdomain suffix tld username'.split(" "), function(k, v) {
97
+ // populate lookup table and register $.attr('uri:accessor') handlers
98
+ $.each('authority directory domain filename fragment hash host hostname href password path pathname port protocol query resource scheme search subdomain suffix tld username'.split(' '), function(k, v) {
97
99
  comparable[v] = true;
98
100
  $.attrHooks['uri:' + v] = generateAccessor(v);
99
- });
101
+ });
100
102
 
101
- // pipe $.attr('src') and $.attr('href') through URI.js
102
- var _attrHooks = {
103
+ // pipe $.attr('src') and $.attr('href') through URI.js
104
+ var _attrHooks = {
103
105
  get: function(elem) {
104
- return $(elem).uri();
106
+ return $(elem).uri();
105
107
  },
106
108
  set: function(elem, value) {
107
- return $(elem).uri().href(value).toString();
109
+ return $(elem).uri().href(value).toString();
108
110
  }
109
- };
110
- $.each(['src', 'href', 'action', 'uri', 'cite'], function(k, v) {
111
+ };
112
+ $.each(['src', 'href', 'action', 'uri', 'cite'], function(k, v) {
111
113
  $.attrHooks[v] = {
112
- set: _attrHooks.set
114
+ set: _attrHooks.set
113
115
  };
114
- });
115
- $.attrHooks.uri.get = _attrHooks.get;
116
+ });
117
+ $.attrHooks.uri.get = _attrHooks.get;
116
118
 
117
- // general URI accessor
118
- $.fn.uri = function(uri) {
119
+ // general URI accessor
120
+ $.fn.uri = function(uri) {
119
121
  var $this = this.first();
120
122
  var elem = $this.get(0);
121
123
  var property = getUriProperty(elem);
122
-
124
+
123
125
  if (!property) {
124
- throw new Error('Element "' + elem.nodeName + '" does not have either property: href, src, action, cite');
126
+ throw new Error('Element "' + elem.nodeName + '" does not have either property: href, src, action, cite');
125
127
  }
126
-
128
+
127
129
  if (uri !== undefined) {
128
- var old = $this.data('uri');
129
- if (old) {
130
- return old.href(uri);
131
- }
132
-
133
- if (!(uri instanceof URI)) {
134
- uri = URI(uri || '');
135
- }
130
+ var old = $this.data('uri');
131
+ if (old) {
132
+ return old.href(uri);
133
+ }
134
+
135
+ if (!(uri instanceof URI)) {
136
+ uri = URI(uri || '');
137
+ }
136
138
  } else {
137
- uri = $this.data('uri');
138
- if (uri) {
139
- return uri;
140
- } else {
141
- uri = URI($this.attr(property) || '');
142
- }
139
+ uri = $this.data('uri');
140
+ if (uri) {
141
+ return uri;
142
+ } else {
143
+ uri = URI($this.attr(property) || '');
144
+ }
143
145
  }
144
-
146
+
145
147
  uri._dom_element = elem;
146
148
  uri._dom_attribute = property;
147
149
  uri.normalize();
148
150
  $this.data('uri', uri);
149
151
  return uri;
150
- };
152
+ };
151
153
 
152
- // overwrite URI.build() to update associated DOM element if necessary
153
- URI.prototype.build = function(deferBuild) {
154
+ // overwrite URI.build() to update associated DOM element if necessary
155
+ URI.prototype.build = function(deferBuild) {
154
156
  if (this._dom_element) {
155
- // cannot defer building when hooked into a DOM element
156
- this._string = URI.build(this._parts);
157
- this._deferred_build = false;
158
- this._dom_element.setAttribute(this._dom_attribute, this._string);
159
- this._dom_element[this._dom_attribute] = this._string;
157
+ // cannot defer building when hooked into a DOM element
158
+ this._string = URI.build(this._parts);
159
+ this._deferred_build = false;
160
+ this._dom_element.setAttribute(this._dom_attribute, this._string);
161
+ this._dom_element[this._dom_attribute] = this._string;
160
162
  } else if (deferBuild === true) {
161
- this._deferred_build = true;
163
+ this._deferred_build = true;
162
164
  } else if (deferBuild === undefined || this._deferred_build) {
163
- this._string = URI.build(this._parts);
164
- this._deferred_build = false;
165
+ this._string = URI.build(this._parts);
166
+ this._deferred_build = false;
165
167
  }
166
-
168
+
167
169
  return this;
168
- };
170
+ };
169
171
 
170
- // add :uri() pseudo class selector to sizzle
171
- var uriSizzle;
172
- var pseudoArgs = /^([a-zA-Z]+)\s*([\^\$*]?=|:)\s*(['"]?)(.+)\3|^\s*([a-zA-Z0-9]+)\s*$/;
173
- function uriPseudo (elem, text) {
172
+ // add :uri() pseudo class selector to sizzle
173
+ var uriSizzle;
174
+ var pseudoArgs = /^([a-zA-Z]+)\s*([\^\$*]?=|:)\s*(['"]?)(.+)\3|^\s*([a-zA-Z0-9]+)\s*$/;
175
+ function uriPseudo (elem, text) {
174
176
  var match, property, uri;
175
-
177
+
176
178
  // skip anything without src|href|action and bad :uri() syntax
177
179
  if (!getUriProperty(elem) || !text) {
178
- return false;
180
+ return false;
179
181
  }
180
-
182
+
181
183
  match = text.match(pseudoArgs);
182
184
 
183
185
  if (!match || (!match[5] && match[2] !== ':' && !compare[match[2]])) {
184
- // abort because the given selector cannot be executed
185
- // filers seem to fail silently
186
- return false;
186
+ // abort because the given selector cannot be executed
187
+ // filers seem to fail silently
188
+ return false;
187
189
  }
188
190
 
189
191
  uri = $(elem).uri();
190
-
192
+
191
193
  if (match[5]) {
192
- return uri.is(match[5]);
194
+ return uri.is(match[5]);
193
195
  } else if (match[2] === ':') {
194
- property = match[1].toLowerCase() + ':';
195
- if (!compare[property]) {
196
- // filers seem to fail silently
197
- return false;
198
- }
199
-
200
- return compare[property](uri, match[4]);
196
+ property = match[1].toLowerCase() + ':';
197
+ if (!compare[property]) {
198
+ // filers seem to fail silently
199
+ return false;
200
+ }
201
+
202
+ return compare[property](uri, match[4]);
201
203
  } else {
202
- property = match[1].toLowerCase();
203
- if (!comparable[property]) {
204
- // filers seem to fail silently
205
- return false;
206
- }
207
-
208
- return compare[match[2]](uri[property](), match[4], property);
204
+ property = match[1].toLowerCase();
205
+ if (!comparable[property]) {
206
+ // filers seem to fail silently
207
+ return false;
208
+ }
209
+
210
+ return compare[match[2]](uri[property](), match[4], property);
209
211
  }
210
212
 
211
213
  return false;
212
- }
214
+ }
213
215
 
214
- if ($.expr.createPseudo) {
216
+ if ($.expr.createPseudo) {
215
217
  // jQuery >= 1.8
216
218
  uriSizzle = $.expr.createPseudo(function (text) {
217
- return function (elem) {
218
- return uriPseudo(elem, text);
219
- };
219
+ return function (elem) {
220
+ return uriPseudo(elem, text);
221
+ };
220
222
  });
221
- } else {
223
+ } else {
222
224
  // jQuery < 1.8
223
225
  uriSizzle = function (elem, i, match) {
224
- return uriPseudo(elem, match[3]);
226
+ return uriPseudo(elem, match[3]);
225
227
  };
226
- }
228
+ }
227
229
 
228
- $.expr[":"].uri = uriSizzle;
230
+ $.expr[':'].uri = uriSizzle;
229
231
 
230
- // extending existing object rather than defining something new
231
- return {};
232
+ // extending existing object rather than defining something new,
233
+ // return jQuery anyway
234
+ return $;
232
235
  }));
@@ -0,0 +1,7 @@
1
+ /*! URI.js v1.14.1 http://medialize.github.io/URI.js/ */
2
+ /* build contains: jquery.URI.js */
3
+ (function(d,e){"object"===typeof exports?module.exports=e(require("jquery","./URI")):"function"===typeof define&&define.amd?define(["jquery","./URI"],e):e(d.jQuery,d.URI)})(this,function(d,e){function h(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function k(a){var b=a.nodeName.toLowerCase();return"input"===b&&"image"!==a.type?void 0:e.domAttributes[b]}function p(a){return{get:function(b){return d(b).uri()[a]()},set:function(b,c){d(b).uri()[a](c);return c}}}function l(a,b){var c,e,f;if(!k(a)||
4
+ !b)return!1;c=b.match(q);if(!c||!c[5]&&":"!==c[2]&&!g[c[2]])return!1;f=d(a).uri();if(c[5])return f.is(c[5]);if(":"===c[2])return e=c[1].toLowerCase()+":",g[e]?g[e](f,c[4]):!1;e=c[1].toLowerCase();return m[e]?g[c[2]](f[e](),c[4],e):!1}var m={},g={"=":function(a,b){return a===b},"^=":function(a,b){return!!(a+"").match(new RegExp("^"+h(b),"i"))},"$=":function(a,b){return!!(a+"").match(new RegExp(h(b)+"$","i"))},"*=":function(a,b,c){"directory"===c&&(a+="/");return!!(a+"").match(new RegExp(h(b),"i"))},
5
+ "equals:":function(a,b){return a.equals(b)},"is:":function(a,b){return a.is(b)}};d.each("authority directory domain filename fragment hash host hostname href password path pathname port protocol query resource scheme search subdomain suffix tld username".split(" "),function(a,b){m[b]=!0;d.attrHooks["uri:"+b]=p(b)});var r=function(a,b){return d(a).uri().href(b).toString()};d.each(["src","href","action","uri","cite"],function(a,b){d.attrHooks[b]={set:r}});d.attrHooks.uri.get=function(a){return d(a).uri()};
6
+ d.fn.uri=function(a){var b=this.first(),c=b.get(0),d=k(c);if(!d)throw Error('Element "'+c.nodeName+'" does not have either property: href, src, action, cite');if(void 0!==a){var f=b.data("uri");if(f)return f.href(a);a instanceof e||(a=e(a||""))}else{if(a=b.data("uri"))return a;a=e(b.attr(d)||"")}a._dom_element=c;a._dom_attribute=d;a.normalize();b.data("uri",a);return a};e.prototype.build=function(a){if(this._dom_element)this._string=e.build(this._parts),this._deferred_build=!1,this._dom_element.setAttribute(this._dom_attribute,
7
+ this._string),this._dom_element[this._dom_attribute]=this._string;else if(!0===a)this._deferred_build=!0;else if(void 0===a||this._deferred_build)this._string=e.build(this._parts),this._deferred_build=!1;return this};var n,q=/^([a-zA-Z]+)\s*([\^\$*]?=|:)\s*(['"]?)(.+)\3|^\s*([a-zA-Z0-9]+)\s*$/;n=d.expr.createPseudo?d.expr.createPseudo(function(a){return function(b){return l(b,a)}}):function(a,b,c){return l(a,c[3])};d.expr[":"].uri=n;return d});
@@ -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));