|
|
@ -34,6 +34,10 @@ |
|
|
|
initialN = 128, // 0x80
|
|
|
|
delimiter = '-', // '\x2D'
|
|
|
|
|
|
|
|
/** Regular expressions */ |
|
|
|
regexASCII = /[^\x20-\x7e]/, |
|
|
|
regexPunycode = /^xn--/, |
|
|
|
|
|
|
|
/** Error messages */ |
|
|
|
errors = { |
|
|
|
'overflow': 'Overflow: input needs wider integers to process.', |
|
|
@ -87,7 +91,7 @@ |
|
|
|
*/ |
|
|
|
function mapDomain(string, fn) { |
|
|
|
var glue = '.'; |
|
|
|
return map(string.toLowerCase().split(glue), fn).join(glue); |
|
|
|
return map(string.split(glue), fn).join(glue); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -196,6 +200,7 @@ |
|
|
|
|
|
|
|
/** |
|
|
|
* Converts a basic code point to lowercase is `flag` is falsy, or to |
|
|
|
* uppercase if `flag` is truthy. The code point is unchanged if it's |
|
|
|
* caseless. The behavior is undefined if `codePoint` is not a basic code |
|
|
|
* point. |
|
|
|
* @private |
|
|
@ -482,22 +487,6 @@ |
|
|
|
return output.join(''); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Converts a Unicode string representing a domain name to Punycode. Only the |
|
|
|
* non-ASCII parts of the domain name will be converted, i.e. it doesn't |
|
|
|
* matter if you call it with a domain that's already in ASCII. |
|
|
|
* @memberOf Punycode |
|
|
|
* @param {String} domain The domain name to convert, as a Unicode string. |
|
|
|
* @returns {String} The Punycode representation of the given domain name. |
|
|
|
*/ |
|
|
|
function toASCII(domain) { |
|
|
|
return mapDomain(domain, function(string) { |
|
|
|
return string.match(/[^a-zA-Z0-9-]/) |
|
|
|
? 'xn--' + encode(string) |
|
|
|
: string; |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Converts a Punycode string representing a domain name to Unicode. Only the |
|
|
|
* Punycoded parts of the domain name will be converted, i.e. it doesn't |
|
|
@ -510,8 +499,24 @@ |
|
|
|
*/ |
|
|
|
function toUnicode(domain) { |
|
|
|
return mapDomain(domain, function(string) { |
|
|
|
return string.match(/^xn--/) |
|
|
|
? decode(string.slice(4)) |
|
|
|
return regexPunycode.test(string) |
|
|
|
? decode(string.slice(4).toLowerCase()) |
|
|
|
: string; |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Converts a Unicode string representing a domain name to Punycode. Only the |
|
|
|
* non-ASCII parts of the domain name will be converted, i.e. it doesn't |
|
|
|
* matter if you call it with a domain that's already in ASCII. |
|
|
|
* @memberOf Punycode |
|
|
|
* @param {String} domain The domain name to convert, as a Unicode string. |
|
|
|
* @returns {String} The Punycode representation of the given domain name. |
|
|
|
*/ |
|
|
|
function toASCII(domain) { |
|
|
|
return mapDomain(domain, function(string) { |
|
|
|
return regexASCII.test(string) |
|
|
|
? 'xn--' + encode(string) |
|
|
|
: string; |
|
|
|
}); |
|
|
|
} |
|
|
@ -520,11 +525,10 @@ |
|
|
|
|
|
|
|
/** Define the public API */ |
|
|
|
Punycode = { |
|
|
|
'version': '0.0.1337', |
|
|
|
'version': '0.1.1', |
|
|
|
/** |
|
|
|
* An object of methods to convert from JavaScript's internal character |
|
|
|
* representation to Unicode and back. |
|
|
|
* @static |
|
|
|
* @memberOf Punycode |
|
|
|
* @type Object |
|
|
|
*/ |
|
|
|