123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- 'use strict';
- var uncurryThis = require('../internals/function-uncurry-this');
- var maxInt = 2147483647;
- var base = 36;
- var tMin = 1;
- var tMax = 26;
- var skew = 38;
- var damp = 700;
- var initialBias = 72;
- var initialN = 128;
- var delimiter = '-';
- var regexNonASCII = /[^\0-\u007E]/;
- var regexSeparators = /[.\u3002\uFF0E\uFF61]/g;
- var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';
- var baseMinusTMin = base - tMin;
- var $RangeError = RangeError;
- var exec = uncurryThis(regexSeparators.exec);
- var floor = Math.floor;
- var fromCharCode = String.fromCharCode;
- var charCodeAt = uncurryThis(''.charCodeAt);
- var join = uncurryThis([].join);
- var push = uncurryThis([].push);
- var replace = uncurryThis(''.replace);
- var split = uncurryThis(''.split);
- var toLowerCase = uncurryThis(''.toLowerCase);
- var ucs2decode = function (string) {
- var output = [];
- var counter = 0;
- var length = string.length;
- while (counter < length) {
- var value = charCodeAt(string, counter++);
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
-
- var extra = charCodeAt(string, counter++);
- if ((extra & 0xFC00) === 0xDC00) {
- push(output, ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
- } else {
-
-
- push(output, value);
- counter--;
- }
- } else {
- push(output, value);
- }
- }
- return output;
- };
- var digitToBasic = function (digit) {
-
-
- return digit + 22 + 75 * (digit < 26);
- };
- var adapt = function (delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor(delta / damp) : delta >> 1;
- delta += floor(delta / numPoints);
- while (delta > baseMinusTMin * tMax >> 1) {
- delta = floor(delta / baseMinusTMin);
- k += base;
- }
- return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
- };
- var encode = function (input) {
- var output = [];
-
- input = ucs2decode(input);
-
- var inputLength = input.length;
-
- var n = initialN;
- var delta = 0;
- var bias = initialBias;
- var i, currentValue;
-
- for (i = 0; i < input.length; i++) {
- currentValue = input[i];
- if (currentValue < 0x80) {
- push(output, fromCharCode(currentValue));
- }
- }
- var basicLength = output.length;
- var handledCPCount = basicLength;
-
- if (basicLength) {
- push(output, delimiter);
- }
-
- while (handledCPCount < inputLength) {
-
- var m = maxInt;
- for (i = 0; i < input.length; i++) {
- currentValue = input[i];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
-
- var handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
- throw new $RangeError(OVERFLOW_ERROR);
- }
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
- for (i = 0; i < input.length; i++) {
- currentValue = input[i];
- if (currentValue < n && ++delta > maxInt) {
- throw new $RangeError(OVERFLOW_ERROR);
- }
- if (currentValue === n) {
-
- var q = delta;
- var k = base;
- while (true) {
- var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
- if (q < t) break;
- var qMinusT = q - t;
- var baseMinusT = base - t;
- push(output, fromCharCode(digitToBasic(t + qMinusT % baseMinusT)));
- q = floor(qMinusT / baseMinusT);
- k += base;
- }
- push(output, fromCharCode(digitToBasic(q)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);
- delta = 0;
- handledCPCount++;
- }
- }
- delta++;
- n++;
- }
- return join(output, '');
- };
- module.exports = function (input) {
- var encoded = [];
- var labels = split(replace(toLowerCase(input), regexSeparators, '\u002E'), '.');
- var i, label;
- for (i = 0; i < labels.length; i++) {
- label = labels[i];
- push(encoded, exec(regexNonASCII, label) ? 'xn--' + encode(label) : label);
- }
- return join(encoded, '.');
- };
|