init
This commit is contained in:
1
vendor/bower-asset/punycode/.gitattributes
vendored
Normal file
1
vendor/bower-asset/punycode/.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
||||
* text=auto
|
||||
17
vendor/bower-asset/punycode/.gitignore
vendored
Normal file
17
vendor/bower-asset/punycode/.gitignore
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Coverage report
|
||||
coverage
|
||||
|
||||
# Installed npm modules
|
||||
node_modules
|
||||
|
||||
# Folder view configuration files
|
||||
.DS_Store
|
||||
Desktop.ini
|
||||
|
||||
# Thumbnail cache files
|
||||
._*
|
||||
Thumbs.db
|
||||
|
||||
# Files that might appear on external disks
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
8
vendor/bower-asset/punycode/.npmignore
vendored
Normal file
8
vendor/bower-asset/punycode/.npmignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
.*
|
||||
*.md
|
||||
coverage
|
||||
docs
|
||||
tests
|
||||
bower.json
|
||||
component.json
|
||||
Gruntfile.js
|
||||
20
vendor/bower-asset/punycode/.travis.yml
vendored
Normal file
20
vendor/bower-asset/punycode/.travis.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
before_script:
|
||||
- "npm install -g grunt-cli"
|
||||
# Narwhal uses a hardcoded path to openjdk v6, so use that version
|
||||
- "sudo apt-get update -qq"
|
||||
- "sudo apt-get install -qq openjdk-6-jre"
|
||||
- "PACKAGE=rhino1_7R3; wget http://ftp.mozilla.org/pub/mozilla.org/js/$PACKAGE.zip && sudo unzip $PACKAGE -d /opt/ && rm $PACKAGE.zip"
|
||||
- "PACKAGE=rhino1_7R3; echo -e '#!/bin/sh\\njava -jar /opt/'$PACKAGE'/js.jar $@' | sudo tee /usr/local/bin/rhino && sudo chmod +x /usr/local/bin/rhino"
|
||||
- "PACKAGE=ringojs-0.9; wget http://ringojs.org/downloads/$PACKAGE.zip && sudo unzip $PACKAGE -d /opt/ && rm $PACKAGE.zip"
|
||||
- "PACKAGE=ringojs-0.9; sudo ln -s /opt/$PACKAGE/bin/ringo /usr/local/bin/ringo && sudo chmod +x /usr/local/bin/ringo"
|
||||
- "PACKAGE=v0.3.2; wget https://github.com/280north/narwhal/archive/$PACKAGE.zip && sudo unzip $PACKAGE -d /opt/ && rm $PACKAGE.zip"
|
||||
- "PACKAGE=narwhal-0.3.2; sudo ln -s /opt/$PACKAGE/bin/narwhal /usr/local/bin/narwhal && sudo chmod +x /usr/local/bin/narwhal"
|
||||
# If the enviroment stores rt.jar in a different directory, find it and symlink the directory
|
||||
- "PREFIX=/usr/lib/jvm; if [ ! -d $PREFIX/java-6-openjdk ]; then for d in $PREFIX/java-6-openjdk-*; do if [ -e $d/jre/lib/rt.jar ]; then sudo ln -s $d $PREFIX/java-6-openjdk; break; fi; done; fi"
|
||||
script:
|
||||
- "grunt ci"
|
||||
after_script:
|
||||
- "grunt shell:cover-coveralls"
|
||||
91
vendor/bower-asset/punycode/Gruntfile.js
vendored
Normal file
91
vendor/bower-asset/punycode/Gruntfile.js
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.initConfig({
|
||||
'meta': {
|
||||
'testFile': 'tests/tests.js'
|
||||
},
|
||||
'uglify': {
|
||||
'dist': {
|
||||
'options': {
|
||||
'report': 'gzip',
|
||||
'preserveComments': 'some'
|
||||
},
|
||||
'files': {
|
||||
'punycode.min.js': ['punycode.js']
|
||||
}
|
||||
}
|
||||
},
|
||||
// 'esmangle': {
|
||||
// 'dist': {
|
||||
// 'options': {
|
||||
// 'banner': require('fs').readFileSync('punycode.js', 'utf8').split('\n')[0] + '\n;'
|
||||
// },
|
||||
// 'files': {
|
||||
// 'punycode.min.js': ['punycode.js']
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
'shell': {
|
||||
'options': {
|
||||
'stdout': true,
|
||||
'stderr': true,
|
||||
'failOnError': true
|
||||
},
|
||||
'cover-html': {
|
||||
'command': 'istanbul cover --report "html" --verbose --dir "coverage" "tests/tests.js"'
|
||||
},
|
||||
'cover-coveralls': {
|
||||
'command': 'istanbul cover --verbose --dir "coverage" "tests/tests.js" && cat coverage/lcov.info | coveralls; rm -rf coverage/lcov*'
|
||||
},
|
||||
'test-narwhal': {
|
||||
'command': 'echo "Testing in Narwhal..."; export NARWHAL_OPTIMIZATION=-1; narwhal "tests/tests.js"'
|
||||
},
|
||||
'test-phantomjs': {
|
||||
'command': 'echo "Testing in PhantomJS..."; phantomjs "tests/tests.js"'
|
||||
},
|
||||
// Rhino 1.7R4 has a bug that makes it impossible to test in.
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=775566
|
||||
// To test, use Rhino 1.7R3, or wait (heh) for the 1.7R5 release.
|
||||
'test-rhino': {
|
||||
'command': 'echo "Testing in Rhino..."; rhino -opt -1 "tests.js"',
|
||||
'options': {
|
||||
'execOptions': {
|
||||
'cwd': 'tests'
|
||||
}
|
||||
}
|
||||
},
|
||||
'test-ringo': {
|
||||
'command': 'echo "Testing in Ringo..."; ringo -o -1 "tests/tests.js"'
|
||||
},
|
||||
'test-node': {
|
||||
'command': 'echo "Testing in Node..."; node "tests/tests.js"'
|
||||
},
|
||||
'test-browser': {
|
||||
'command': 'echo "Testing in a browser..."; open "tests/index.html"'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
grunt.loadNpmTasks('grunt-shell');
|
||||
grunt.loadNpmTasks('grunt-contrib-uglify');
|
||||
//grunt.loadNpmTasks('grunt-esmangle');
|
||||
|
||||
grunt.registerTask('cover', 'shell:cover-html');
|
||||
grunt.registerTask('ci', [
|
||||
'shell:test-narwhal',
|
||||
'shell:test-phantomjs',
|
||||
'shell:test-rhino',
|
||||
'shell:test-ringo',
|
||||
'shell:test-node'
|
||||
]);
|
||||
grunt.registerTask('test', [
|
||||
'ci',
|
||||
'shell:test-browser'
|
||||
]);
|
||||
|
||||
grunt.registerTask('default', [
|
||||
'uglify',
|
||||
'shell:test-node'
|
||||
]);
|
||||
|
||||
};
|
||||
20
vendor/bower-asset/punycode/LICENSE-MIT.txt
vendored
Normal file
20
vendor/bower-asset/punycode/LICENSE-MIT.txt
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
Copyright Mathias Bynens <https://mathiasbynens.be/>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
176
vendor/bower-asset/punycode/README.md
vendored
Normal file
176
vendor/bower-asset/punycode/README.md
vendored
Normal file
@@ -0,0 +1,176 @@
|
||||
# Punycode.js [](https://travis-ci.org/bestiejs/punycode.js) [](https://coveralls.io/r/bestiejs/punycode.js) [](https://gemnasium.com/bestiejs/punycode.js)
|
||||
|
||||
A robust Punycode converter that fully complies to [RFC 3492](http://tools.ietf.org/html/rfc3492) and [RFC 5891](http://tools.ietf.org/html/rfc5891), and works on nearly all JavaScript platforms.
|
||||
|
||||
This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm:
|
||||
|
||||
* [The C example code from RFC 3492](http://tools.ietf.org/html/rfc3492#appendix-C)
|
||||
* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c)
|
||||
* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c)
|
||||
* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287)
|
||||
* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072))
|
||||
|
||||
This project is [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with [Node.js v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc).
|
||||
|
||||
## Installation
|
||||
|
||||
Via [npm](http://npmjs.org/) (only required for Node.js releases older than v0.6.2):
|
||||
|
||||
```bash
|
||||
npm install punycode
|
||||
```
|
||||
|
||||
Via [Bower](http://bower.io/):
|
||||
|
||||
```bash
|
||||
bower install punycode
|
||||
```
|
||||
|
||||
Via [Component](https://github.com/component/component):
|
||||
|
||||
```bash
|
||||
component install bestiejs/punycode.js
|
||||
```
|
||||
|
||||
In a browser:
|
||||
|
||||
```html
|
||||
<script src="punycode.js"></script>
|
||||
```
|
||||
|
||||
In [Narwhal](http://narwhaljs.org/), [Node.js](http://nodejs.org/), and [RingoJS](http://ringojs.org/):
|
||||
|
||||
```js
|
||||
var punycode = require('punycode');
|
||||
```
|
||||
|
||||
In [Rhino](http://www.mozilla.org/rhino/):
|
||||
|
||||
```js
|
||||
load('punycode.js');
|
||||
```
|
||||
|
||||
Using an AMD loader like [RequireJS](http://requirejs.org/):
|
||||
|
||||
```js
|
||||
require(
|
||||
{
|
||||
'paths': {
|
||||
'punycode': 'path/to/punycode'
|
||||
}
|
||||
},
|
||||
['punycode'],
|
||||
function(punycode) {
|
||||
console.log(punycode);
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### `punycode.decode(string)`
|
||||
|
||||
Converts a Punycode string of ASCII symbols to a string of Unicode symbols.
|
||||
|
||||
```js
|
||||
// decode domain name parts
|
||||
punycode.decode('maana-pta'); // 'mañana'
|
||||
punycode.decode('--dqo34k'); // '☃-⌘'
|
||||
```
|
||||
|
||||
### `punycode.encode(string)`
|
||||
|
||||
Converts a string of Unicode symbols to a Punycode string of ASCII symbols.
|
||||
|
||||
```js
|
||||
// encode domain name parts
|
||||
punycode.encode('mañana'); // 'maana-pta'
|
||||
punycode.encode('☃-⌘'); // '--dqo34k'
|
||||
```
|
||||
|
||||
### `punycode.toUnicode(input)`
|
||||
|
||||
Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode.
|
||||
|
||||
```js
|
||||
// decode domain names
|
||||
punycode.toUnicode('xn--maana-pta.com');
|
||||
// → 'mañana.com'
|
||||
punycode.toUnicode('xn----dqo34k.com');
|
||||
// → '☃-⌘.com'
|
||||
|
||||
// decode email addresses
|
||||
punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq');
|
||||
// → 'джумла@джpумлатест.bрфa'
|
||||
```
|
||||
|
||||
### `punycode.toASCII(input)`
|
||||
|
||||
Converts a Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that's already in ASCII.
|
||||
|
||||
```js
|
||||
// encode domain names
|
||||
punycode.toASCII('mañana.com');
|
||||
// → 'xn--maana-pta.com'
|
||||
punycode.toASCII('☃-⌘.com');
|
||||
// → 'xn----dqo34k.com'
|
||||
|
||||
// encode email addresses
|
||||
punycode.toASCII('джумла@джpумлатест.bрфa');
|
||||
// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'
|
||||
```
|
||||
|
||||
### `punycode.ucs2`
|
||||
|
||||
#### `punycode.ucs2.decode(string)`
|
||||
|
||||
Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16.
|
||||
|
||||
```js
|
||||
punycode.ucs2.decode('abc');
|
||||
// → [0x61, 0x62, 0x63]
|
||||
// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE:
|
||||
punycode.ucs2.decode('\uD834\uDF06');
|
||||
// → [0x1D306]
|
||||
```
|
||||
|
||||
#### `punycode.ucs2.encode(codePoints)`
|
||||
|
||||
Creates a string based on an array of numeric code point values.
|
||||
|
||||
```js
|
||||
punycode.ucs2.encode([0x61, 0x62, 0x63]);
|
||||
// → 'abc'
|
||||
punycode.ucs2.encode([0x1D306]);
|
||||
// → '\uD834\uDF06'
|
||||
```
|
||||
|
||||
### `punycode.version`
|
||||
|
||||
A string representing the current Punycode.js version number.
|
||||
|
||||
## Unit tests & code coverage
|
||||
|
||||
After cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.
|
||||
|
||||
Once that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use `grunt test`.
|
||||
|
||||
To generate the code coverage report, use `grunt cover`.
|
||||
|
||||
Feel free to fork if you see possible improvements!
|
||||
|
||||
## Author
|
||||
|
||||
| [](https://twitter.com/mathias "Follow @mathias on Twitter") |
|
||||
|---|
|
||||
| [Mathias Bynens](https://mathiasbynens.be/) |
|
||||
|
||||
## Contributors
|
||||
|
||||
| [](https://twitter.com/jdalton "Follow @jdalton on Twitter") |
|
||||
|---|
|
||||
| [John-David Dalton](http://allyoucanleet.com/) |
|
||||
|
||||
## License
|
||||
|
||||
Punycode.js is available under the [MIT](https://mths.be/mit) license.
|
||||
14
vendor/bower-asset/punycode/bower.json
vendored
Normal file
14
vendor/bower-asset/punycode/bower.json
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "punycode",
|
||||
"version": "1.3.2",
|
||||
"main": "punycode.js",
|
||||
"ignore": [
|
||||
"coverage",
|
||||
"tests",
|
||||
".*",
|
||||
"component.json",
|
||||
"Gruntfile.js",
|
||||
"node_modules",
|
||||
"package.json"
|
||||
]
|
||||
}
|
||||
19
vendor/bower-asset/punycode/component.json
vendored
Normal file
19
vendor/bower-asset/punycode/component.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "punycode",
|
||||
"version": "1.3.2",
|
||||
"description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
|
||||
"repo": "bestiejs/punycode.js",
|
||||
"license": "MIT",
|
||||
"scripts": [
|
||||
"punycode.js"
|
||||
],
|
||||
"keywords": [
|
||||
"punycode",
|
||||
"unicode",
|
||||
"idn",
|
||||
"idna",
|
||||
"dns",
|
||||
"url",
|
||||
"domain"
|
||||
]
|
||||
}
|
||||
53
vendor/bower-asset/punycode/package.json
vendored
Normal file
53
vendor/bower-asset/punycode/package.json
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"name": "punycode",
|
||||
"version": "1.3.2",
|
||||
"description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
|
||||
"homepage": "https://mths.be/punycode",
|
||||
"main": "punycode.js",
|
||||
"keywords": [
|
||||
"punycode",
|
||||
"unicode",
|
||||
"idn",
|
||||
"idna",
|
||||
"dns",
|
||||
"url",
|
||||
"domain"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "Mathias Bynens",
|
||||
"url": "https://mathiasbynens.be/"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Mathias Bynens",
|
||||
"url": "https://mathiasbynens.be/"
|
||||
},
|
||||
{
|
||||
"name": "John-David Dalton",
|
||||
"url": "http://allyoucanleet.com/"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/bestiejs/punycode.js.git"
|
||||
},
|
||||
"bugs": "https://github.com/bestiejs/punycode.js/issues",
|
||||
"files": [
|
||||
"LICENSE-MIT.txt",
|
||||
"punycode.js"
|
||||
],
|
||||
"scripts": {
|
||||
"test": "node tests/tests.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"coveralls": "^2.10.1",
|
||||
"grunt": "^0.4.5",
|
||||
"grunt-contrib-uglify": "^0.5.0",
|
||||
"grunt-shell": "^0.7.0",
|
||||
"istanbul": "^0.2.13",
|
||||
"qunit-extras": "^1.2.0",
|
||||
"qunitjs": "~1.11.0",
|
||||
"requirejs": "^2.1.14"
|
||||
}
|
||||
}
|
||||
530
vendor/bower-asset/punycode/punycode.js
vendored
Normal file
530
vendor/bower-asset/punycode/punycode.js
vendored
Normal file
@@ -0,0 +1,530 @@
|
||||
/*! https://mths.be/punycode v1.3.2 by @mathias */
|
||||
;(function(root) {
|
||||
|
||||
/** Detect free variables */
|
||||
var freeExports = typeof exports == 'object' && exports &&
|
||||
!exports.nodeType && exports;
|
||||
var freeModule = typeof module == 'object' && module &&
|
||||
!module.nodeType && module;
|
||||
var freeGlobal = typeof global == 'object' && global;
|
||||
if (
|
||||
freeGlobal.global === freeGlobal ||
|
||||
freeGlobal.window === freeGlobal ||
|
||||
freeGlobal.self === freeGlobal
|
||||
) {
|
||||
root = freeGlobal;
|
||||
}
|
||||
|
||||
/**
|
||||
* The `punycode` object.
|
||||
* @name punycode
|
||||
* @type Object
|
||||
*/
|
||||
var punycode,
|
||||
|
||||
/** Highest positive signed 32-bit float value */
|
||||
maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
|
||||
|
||||
/** Bootstring parameters */
|
||||
base = 36,
|
||||
tMin = 1,
|
||||
tMax = 26,
|
||||
skew = 38,
|
||||
damp = 700,
|
||||
initialBias = 72,
|
||||
initialN = 128, // 0x80
|
||||
delimiter = '-', // '\x2D'
|
||||
|
||||
/** Regular expressions */
|
||||
regexPunycode = /^xn--/,
|
||||
regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
|
||||
regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
|
||||
|
||||
/** Error messages */
|
||||
errors = {
|
||||
'overflow': 'Overflow: input needs wider integers to process',
|
||||
'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
|
||||
'invalid-input': 'Invalid input'
|
||||
},
|
||||
|
||||
/** Convenience shortcuts */
|
||||
baseMinusTMin = base - tMin,
|
||||
floor = Math.floor,
|
||||
stringFromCharCode = String.fromCharCode,
|
||||
|
||||
/** Temporary variable */
|
||||
key;
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* A generic error utility function.
|
||||
* @private
|
||||
* @param {String} type The error type.
|
||||
* @returns {Error} Throws a `RangeError` with the applicable error message.
|
||||
*/
|
||||
function error(type) {
|
||||
throw RangeError(errors[type]);
|
||||
}
|
||||
|
||||
/**
|
||||
* A generic `Array#map` utility function.
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} callback The function that gets called for every array
|
||||
* item.
|
||||
* @returns {Array} A new array of values returned by the callback function.
|
||||
*/
|
||||
function map(array, fn) {
|
||||
var length = array.length;
|
||||
var result = [];
|
||||
while (length--) {
|
||||
result[length] = fn(array[length]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple `Array#map`-like wrapper to work with domain name strings or email
|
||||
* addresses.
|
||||
* @private
|
||||
* @param {String} domain The domain name or email address.
|
||||
* @param {Function} callback The function that gets called for every
|
||||
* character.
|
||||
* @returns {Array} A new string of characters returned by the callback
|
||||
* function.
|
||||
*/
|
||||
function mapDomain(string, fn) {
|
||||
var parts = string.split('@');
|
||||
var result = '';
|
||||
if (parts.length > 1) {
|
||||
// In email addresses, only the domain name should be punycoded. Leave
|
||||
// the local part (i.e. everything up to `@`) intact.
|
||||
result = parts[0] + '@';
|
||||
string = parts[1];
|
||||
}
|
||||
// Avoid `split(regex)` for IE8 compatibility. See #17.
|
||||
string = string.replace(regexSeparators, '\x2E');
|
||||
var labels = string.split('.');
|
||||
var encoded = map(labels, fn).join('.');
|
||||
return result + encoded;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an array containing the numeric code points of each Unicode
|
||||
* character in the string. While JavaScript uses UCS-2 internally,
|
||||
* this function will convert a pair of surrogate halves (each of which
|
||||
* UCS-2 exposes as separate characters) into a single code point,
|
||||
* matching UTF-16.
|
||||
* @see `punycode.ucs2.encode`
|
||||
* @see <https://mathiasbynens.be/notes/javascript-encoding>
|
||||
* @memberOf punycode.ucs2
|
||||
* @name decode
|
||||
* @param {String} string The Unicode input string (UCS-2).
|
||||
* @returns {Array} The new array of code points.
|
||||
*/
|
||||
function ucs2decode(string) {
|
||||
var output = [],
|
||||
counter = 0,
|
||||
length = string.length,
|
||||
value,
|
||||
extra;
|
||||
while (counter < length) {
|
||||
value = string.charCodeAt(counter++);
|
||||
if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
|
||||
// high surrogate, and there is a next character
|
||||
extra = string.charCodeAt(counter++);
|
||||
if ((extra & 0xFC00) == 0xDC00) { // low surrogate
|
||||
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
|
||||
} else {
|
||||
// unmatched surrogate; only append this code unit, in case the next
|
||||
// code unit is the high surrogate of a surrogate pair
|
||||
output.push(value);
|
||||
counter--;
|
||||
}
|
||||
} else {
|
||||
output.push(value);
|
||||
}
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a string based on an array of numeric code points.
|
||||
* @see `punycode.ucs2.decode`
|
||||
* @memberOf punycode.ucs2
|
||||
* @name encode
|
||||
* @param {Array} codePoints The array of numeric code points.
|
||||
* @returns {String} The new Unicode string (UCS-2).
|
||||
*/
|
||||
function ucs2encode(array) {
|
||||
return map(array, function(value) {
|
||||
var output = '';
|
||||
if (value > 0xFFFF) {
|
||||
value -= 0x10000;
|
||||
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
|
||||
value = 0xDC00 | value & 0x3FF;
|
||||
}
|
||||
output += stringFromCharCode(value);
|
||||
return output;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a basic code point into a digit/integer.
|
||||
* @see `digitToBasic()`
|
||||
* @private
|
||||
* @param {Number} codePoint The basic numeric code point value.
|
||||
* @returns {Number} The numeric value of a basic code point (for use in
|
||||
* representing integers) in the range `0` to `base - 1`, or `base` if
|
||||
* the code point does not represent a value.
|
||||
*/
|
||||
function basicToDigit(codePoint) {
|
||||
if (codePoint - 48 < 10) {
|
||||
return codePoint - 22;
|
||||
}
|
||||
if (codePoint - 65 < 26) {
|
||||
return codePoint - 65;
|
||||
}
|
||||
if (codePoint - 97 < 26) {
|
||||
return codePoint - 97;
|
||||
}
|
||||
return base;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a digit/integer into a basic code point.
|
||||
* @see `basicToDigit()`
|
||||
* @private
|
||||
* @param {Number} digit The numeric value of a basic code point.
|
||||
* @returns {Number} The basic code point whose value (when used for
|
||||
* representing integers) is `digit`, which needs to be in the range
|
||||
* `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
|
||||
* used; else, the lowercase form is used. The behavior is undefined
|
||||
* if `flag` is non-zero and `digit` has no uppercase form.
|
||||
*/
|
||||
function digitToBasic(digit, flag) {
|
||||
// 0..25 map to ASCII a..z or A..Z
|
||||
// 26..35 map to ASCII 0..9
|
||||
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bias adaptation function as per section 3.4 of RFC 3492.
|
||||
* http://tools.ietf.org/html/rfc3492#section-3.4
|
||||
* @private
|
||||
*/
|
||||
function adapt(delta, numPoints, firstTime) {
|
||||
var k = 0;
|
||||
delta = firstTime ? floor(delta / damp) : delta >> 1;
|
||||
delta += floor(delta / numPoints);
|
||||
for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
|
||||
delta = floor(delta / baseMinusTMin);
|
||||
}
|
||||
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Punycode string of ASCII-only symbols to a string of Unicode
|
||||
* symbols.
|
||||
* @memberOf punycode
|
||||
* @param {String} input The Punycode string of ASCII-only symbols.
|
||||
* @returns {String} The resulting string of Unicode symbols.
|
||||
*/
|
||||
function decode(input) {
|
||||
// Don't use UCS-2
|
||||
var output = [],
|
||||
inputLength = input.length,
|
||||
out,
|
||||
i = 0,
|
||||
n = initialN,
|
||||
bias = initialBias,
|
||||
basic,
|
||||
j,
|
||||
index,
|
||||
oldi,
|
||||
w,
|
||||
k,
|
||||
digit,
|
||||
t,
|
||||
/** Cached calculation results */
|
||||
baseMinusT;
|
||||
|
||||
// Handle the basic code points: let `basic` be the number of input code
|
||||
// points before the last delimiter, or `0` if there is none, then copy
|
||||
// the first basic code points to the output.
|
||||
|
||||
basic = input.lastIndexOf(delimiter);
|
||||
if (basic < 0) {
|
||||
basic = 0;
|
||||
}
|
||||
|
||||
for (j = 0; j < basic; ++j) {
|
||||
// if it's not a basic code point
|
||||
if (input.charCodeAt(j) >= 0x80) {
|
||||
error('not-basic');
|
||||
}
|
||||
output.push(input.charCodeAt(j));
|
||||
}
|
||||
|
||||
// Main decoding loop: start just after the last delimiter if any basic code
|
||||
// points were copied; start at the beginning otherwise.
|
||||
|
||||
for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
|
||||
|
||||
// `index` is the index of the next character to be consumed.
|
||||
// Decode a generalized variable-length integer into `delta`,
|
||||
// which gets added to `i`. The overflow checking is easier
|
||||
// if we increase `i` as we go, then subtract off its starting
|
||||
// value at the end to obtain `delta`.
|
||||
for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
|
||||
|
||||
if (index >= inputLength) {
|
||||
error('invalid-input');
|
||||
}
|
||||
|
||||
digit = basicToDigit(input.charCodeAt(index++));
|
||||
|
||||
if (digit >= base || digit > floor((maxInt - i) / w)) {
|
||||
error('overflow');
|
||||
}
|
||||
|
||||
i += digit * w;
|
||||
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
|
||||
|
||||
if (digit < t) {
|
||||
break;
|
||||
}
|
||||
|
||||
baseMinusT = base - t;
|
||||
if (w > floor(maxInt / baseMinusT)) {
|
||||
error('overflow');
|
||||
}
|
||||
|
||||
w *= baseMinusT;
|
||||
|
||||
}
|
||||
|
||||
out = output.length + 1;
|
||||
bias = adapt(i - oldi, out, oldi == 0);
|
||||
|
||||
// `i` was supposed to wrap around from `out` to `0`,
|
||||
// incrementing `n` each time, so we'll fix that now:
|
||||
if (floor(i / out) > maxInt - n) {
|
||||
error('overflow');
|
||||
}
|
||||
|
||||
n += floor(i / out);
|
||||
i %= out;
|
||||
|
||||
// Insert `n` at position `i` of the output
|
||||
output.splice(i++, 0, n);
|
||||
|
||||
}
|
||||
|
||||
return ucs2encode(output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a string of Unicode symbols (e.g. a domain name label) to a
|
||||
* Punycode string of ASCII-only symbols.
|
||||
* @memberOf punycode
|
||||
* @param {String} input The string of Unicode symbols.
|
||||
* @returns {String} The resulting Punycode string of ASCII-only symbols.
|
||||
*/
|
||||
function encode(input) {
|
||||
var n,
|
||||
delta,
|
||||
handledCPCount,
|
||||
basicLength,
|
||||
bias,
|
||||
j,
|
||||
m,
|
||||
q,
|
||||
k,
|
||||
t,
|
||||
currentValue,
|
||||
output = [],
|
||||
/** `inputLength` will hold the number of code points in `input`. */
|
||||
inputLength,
|
||||
/** Cached calculation results */
|
||||
handledCPCountPlusOne,
|
||||
baseMinusT,
|
||||
qMinusT;
|
||||
|
||||
// Convert the input in UCS-2 to Unicode
|
||||
input = ucs2decode(input);
|
||||
|
||||
// Cache the length
|
||||
inputLength = input.length;
|
||||
|
||||
// Initialize the state
|
||||
n = initialN;
|
||||
delta = 0;
|
||||
bias = initialBias;
|
||||
|
||||
// Handle the basic code points
|
||||
for (j = 0; j < inputLength; ++j) {
|
||||
currentValue = input[j];
|
||||
if (currentValue < 0x80) {
|
||||
output.push(stringFromCharCode(currentValue));
|
||||
}
|
||||
}
|
||||
|
||||
handledCPCount = basicLength = output.length;
|
||||
|
||||
// `handledCPCount` is the number of code points that have been handled;
|
||||
// `basicLength` is the number of basic code points.
|
||||
|
||||
// Finish the basic string - if it is not empty - with a delimiter
|
||||
if (basicLength) {
|
||||
output.push(delimiter);
|
||||
}
|
||||
|
||||
// Main encoding loop:
|
||||
while (handledCPCount < inputLength) {
|
||||
|
||||
// All non-basic code points < n have been handled already. Find the next
|
||||
// larger one:
|
||||
for (m = maxInt, j = 0; j < inputLength; ++j) {
|
||||
currentValue = input[j];
|
||||
if (currentValue >= n && currentValue < m) {
|
||||
m = currentValue;
|
||||
}
|
||||
}
|
||||
|
||||
// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
|
||||
// but guard against overflow
|
||||
handledCPCountPlusOne = handledCPCount + 1;
|
||||
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
|
||||
error('overflow');
|
||||
}
|
||||
|
||||
delta += (m - n) * handledCPCountPlusOne;
|
||||
n = m;
|
||||
|
||||
for (j = 0; j < inputLength; ++j) {
|
||||
currentValue = input[j];
|
||||
|
||||
if (currentValue < n && ++delta > maxInt) {
|
||||
error('overflow');
|
||||
}
|
||||
|
||||
if (currentValue == n) {
|
||||
// Represent delta as a generalized variable-length integer
|
||||
for (q = delta, k = base; /* no condition */; k += base) {
|
||||
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
|
||||
if (q < t) {
|
||||
break;
|
||||
}
|
||||
qMinusT = q - t;
|
||||
baseMinusT = base - t;
|
||||
output.push(
|
||||
stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
|
||||
);
|
||||
q = floor(qMinusT / baseMinusT);
|
||||
}
|
||||
|
||||
output.push(stringFromCharCode(digitToBasic(q, 0)));
|
||||
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
|
||||
delta = 0;
|
||||
++handledCPCount;
|
||||
}
|
||||
}
|
||||
|
||||
++delta;
|
||||
++n;
|
||||
|
||||
}
|
||||
return output.join('');
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Punycode string representing a domain name or an email address
|
||||
* to Unicode. Only the Punycoded parts of the input will be converted, i.e.
|
||||
* it doesn't matter if you call it on a string that has already been
|
||||
* converted to Unicode.
|
||||
* @memberOf punycode
|
||||
* @param {String} input The Punycoded domain name or email address to
|
||||
* convert to Unicode.
|
||||
* @returns {String} The Unicode representation of the given Punycode
|
||||
* string.
|
||||
*/
|
||||
function toUnicode(input) {
|
||||
return mapDomain(input, function(string) {
|
||||
return regexPunycode.test(string)
|
||||
? decode(string.slice(4).toLowerCase())
|
||||
: string;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Unicode string representing a domain name or an email address 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} input The domain name or email address to convert, as a
|
||||
* Unicode string.
|
||||
* @returns {String} The Punycode representation of the given domain name or
|
||||
* email address.
|
||||
*/
|
||||
function toASCII(input) {
|
||||
return mapDomain(input, function(string) {
|
||||
return regexNonASCII.test(string)
|
||||
? 'xn--' + encode(string)
|
||||
: string;
|
||||
});
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/** Define the public API */
|
||||
punycode = {
|
||||
/**
|
||||
* A string representing the current Punycode.js version number.
|
||||
* @memberOf punycode
|
||||
* @type String
|
||||
*/
|
||||
'version': '1.3.2',
|
||||
/**
|
||||
* An object of methods to convert from JavaScript's internal character
|
||||
* representation (UCS-2) to Unicode code points, and back.
|
||||
* @see <https://mathiasbynens.be/notes/javascript-encoding>
|
||||
* @memberOf punycode
|
||||
* @type Object
|
||||
*/
|
||||
'ucs2': {
|
||||
'decode': ucs2decode,
|
||||
'encode': ucs2encode
|
||||
},
|
||||
'decode': decode,
|
||||
'encode': encode,
|
||||
'toASCII': toASCII,
|
||||
'toUnicode': toUnicode
|
||||
};
|
||||
|
||||
/** Expose `punycode` */
|
||||
// Some AMD build optimizers, like r.js, check for specific condition patterns
|
||||
// like the following:
|
||||
if (
|
||||
typeof define == 'function' &&
|
||||
typeof define.amd == 'object' &&
|
||||
define.amd
|
||||
) {
|
||||
define('punycode', function() {
|
||||
return punycode;
|
||||
});
|
||||
} else if (freeExports && freeModule) {
|
||||
if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+
|
||||
freeModule.exports = punycode;
|
||||
} else { // in Narwhal or RingoJS v0.7.0-
|
||||
for (key in punycode) {
|
||||
punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
|
||||
}
|
||||
}
|
||||
} else { // in Rhino or a web browser
|
||||
root.punycode = punycode;
|
||||
}
|
||||
|
||||
}(this));
|
||||
2
vendor/bower-asset/punycode/punycode.min.js
vendored
Normal file
2
vendor/bower-asset/punycode/punycode.min.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/*! https://mths.be/punycode v1.3.2 by @mathias */
|
||||
!function(a){function b(a){throw RangeError(E[a])}function c(a,b){for(var c=a.length,d=[];c--;)d[c]=b(a[c]);return d}function d(a,b){var d=a.split("@"),e="";d.length>1&&(e=d[0]+"@",a=d[1]),a=a.replace(D,".");var f=a.split("."),g=c(f,b).join(".");return e+g}function e(a){for(var b,c,d=[],e=0,f=a.length;f>e;)b=a.charCodeAt(e++),b>=55296&&56319>=b&&f>e?(c=a.charCodeAt(e++),56320==(64512&c)?d.push(((1023&b)<<10)+(1023&c)+65536):(d.push(b),e--)):d.push(b);return d}function f(a){return c(a,function(a){var b="";return a>65535&&(a-=65536,b+=H(a>>>10&1023|55296),a=56320|1023&a),b+=H(a)}).join("")}function g(a){return 10>a-48?a-22:26>a-65?a-65:26>a-97?a-97:t}function h(a,b){return a+22+75*(26>a)-((0!=b)<<5)}function i(a,b,c){var d=0;for(a=c?G(a/x):a>>1,a+=G(a/b);a>F*v>>1;d+=t)a=G(a/F);return G(d+(F+1)*a/(a+w))}function j(a){var c,d,e,h,j,k,l,m,n,o,p=[],q=a.length,r=0,w=z,x=y;for(d=a.lastIndexOf(A),0>d&&(d=0),e=0;d>e;++e)a.charCodeAt(e)>=128&&b("not-basic"),p.push(a.charCodeAt(e));for(h=d>0?d+1:0;q>h;){for(j=r,k=1,l=t;h>=q&&b("invalid-input"),m=g(a.charCodeAt(h++)),(m>=t||m>G((s-r)/k))&&b("overflow"),r+=m*k,n=x>=l?u:l>=x+v?v:l-x,!(n>m);l+=t)o=t-n,k>G(s/o)&&b("overflow"),k*=o;c=p.length+1,x=i(r-j,c,0==j),G(r/c)>s-w&&b("overflow"),w+=G(r/c),r%=c,p.splice(r++,0,w)}return f(p)}function k(a){var c,d,f,g,j,k,l,m,n,o,p,q,r,w,x,B=[];for(a=e(a),q=a.length,c=z,d=0,j=y,k=0;q>k;++k)p=a[k],128>p&&B.push(H(p));for(f=g=B.length,g&&B.push(A);q>f;){for(l=s,k=0;q>k;++k)p=a[k],p>=c&&l>p&&(l=p);for(r=f+1,l-c>G((s-d)/r)&&b("overflow"),d+=(l-c)*r,c=l,k=0;q>k;++k)if(p=a[k],c>p&&++d>s&&b("overflow"),p==c){for(m=d,n=t;o=j>=n?u:n>=j+v?v:n-j,!(o>m);n+=t)x=m-o,w=t-o,B.push(H(h(o+x%w,0))),m=G(x/w);B.push(H(h(m,0))),j=i(d,r,f==g),d=0,++f}++d,++c}return B.join("")}function l(a){return d(a,function(a){return B.test(a)?j(a.slice(4).toLowerCase()):a})}function m(a){return d(a,function(a){return C.test(a)?"xn--"+k(a):a})}var n="object"==typeof exports&&exports&&!exports.nodeType&&exports,o="object"==typeof module&&module&&!module.nodeType&&module,p="object"==typeof global&&global;(p.global===p||p.window===p||p.self===p)&&(a=p);var q,r,s=2147483647,t=36,u=1,v=26,w=38,x=700,y=72,z=128,A="-",B=/^xn--/,C=/[^\x20-\x7E]/,D=/[\x2E\u3002\uFF0E\uFF61]/g,E={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},F=t-u,G=Math.floor,H=String.fromCharCode;if(q={version:"1.3.2",ucs2:{decode:e,encode:f},decode:j,encode:k,toASCII:m,toUnicode:l},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return q});else if(n&&o)if(module.exports==n)o.exports=q;else for(r in q)q.hasOwnProperty(r)&&(n[r]=q[r]);else a.punycode=q}(this);
|
||||
1114115
vendor/bower-asset/punycode/tests/data.js
vendored
Normal file
1114115
vendor/bower-asset/punycode/tests/data.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
54
vendor/bower-asset/punycode/tests/index.html
vendored
Normal file
54
vendor/bower-asset/punycode/tests/index.html
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Punycode.js test suite</title>
|
||||
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="qunit"></div>
|
||||
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||
<script src="../punycode.js"></script>
|
||||
<script>
|
||||
QUnit.urlParams.norequire = /[?&]norequire=true(?:&|$)/.test(location.search);
|
||||
|
||||
document.write(QUnit.urlParams.norequire
|
||||
? '<script src="tests.js"><\/script>'
|
||||
: '<script src="../node_modules/requirejs/require.js"><\/script>'
|
||||
);
|
||||
</script>
|
||||
<script>
|
||||
(function(root) {
|
||||
if (!root.require) {
|
||||
return;
|
||||
}
|
||||
QUnit.config.autostart = false;
|
||||
|
||||
requirejs.config({
|
||||
'baseUrl': './',
|
||||
'urlArgs': 't=' + (+new Date),
|
||||
'waitSeconds': 0,
|
||||
'packages': [
|
||||
{
|
||||
'name': 'punycode',
|
||||
'location': '..',
|
||||
'main': 'punycode'
|
||||
},
|
||||
{
|
||||
'name': 'tests',
|
||||
'location': '.',
|
||||
'main': 'tests'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
require(['punycode'], function(punycode) {
|
||||
root.punycode = punycode;
|
||||
require(['tests'], function() {
|
||||
QUnit.start();
|
||||
});
|
||||
});
|
||||
}(this));
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
384
vendor/bower-asset/punycode/tests/tests.js
vendored
Normal file
384
vendor/bower-asset/punycode/tests/tests.js
vendored
Normal file
@@ -0,0 +1,384 @@
|
||||
(function(root) {
|
||||
'use strict';
|
||||
|
||||
var noop = Function.prototype;
|
||||
|
||||
var load = (typeof require == 'function' && !(root.define && define.amd)) ?
|
||||
require :
|
||||
(!root.document && root.java && root.load) || noop;
|
||||
|
||||
var QUnit = (function() {
|
||||
return root.QUnit || (
|
||||
root.addEventListener || (root.addEventListener = noop),
|
||||
root.setTimeout || (root.setTimeout = noop),
|
||||
root.QUnit = load('../node_modules/qunitjs/qunit/qunit.js') || root.QUnit,
|
||||
addEventListener === noop && delete root.addEventListener,
|
||||
root.QUnit
|
||||
);
|
||||
}());
|
||||
|
||||
var qe = load('../node_modules/qunit-extras/qunit-extras.js');
|
||||
if (qe) {
|
||||
qe.runInContext(root);
|
||||
}
|
||||
|
||||
/** The `punycode` object to test */
|
||||
var punycode = root.punycode || (root.punycode = (
|
||||
punycode = load('../punycode.js') || root.punycode,
|
||||
punycode = punycode.punycode || punycode
|
||||
));
|
||||
|
||||
// Quick and dirty test to see if we’re in Node or PhantomJS
|
||||
var runExtendedTests = (function() {
|
||||
try {
|
||||
return process.argv[0] == 'node' || root.phantom;
|
||||
} catch (exception) { }
|
||||
}());
|
||||
|
||||
/** Data that will be used in the tests */
|
||||
var allSymbols = runExtendedTests && require('./data.js');
|
||||
var testData = {
|
||||
'strings': [
|
||||
{
|
||||
'description': 'a single basic code point',
|
||||
'decoded': 'Bach',
|
||||
'encoded': 'Bach-'
|
||||
},
|
||||
{
|
||||
'description': 'a single non-ASCII character',
|
||||
'decoded': '\xFC',
|
||||
'encoded': 'tda'
|
||||
},
|
||||
{
|
||||
'description': 'multiple non-ASCII characters',
|
||||
'decoded': '\xFC\xEB\xE4\xF6\u2665',
|
||||
'encoded': '4can8av2009b'
|
||||
},
|
||||
{
|
||||
'description': 'mix of ASCII and non-ASCII characters',
|
||||
'decoded': 'b\xFCcher',
|
||||
'encoded': 'bcher-kva'
|
||||
},
|
||||
{
|
||||
'description': 'long string with both ASCII and non-ASCII characters',
|
||||
'decoded': 'Willst du die Bl\xFCthe des fr\xFChen, die Fr\xFCchte des sp\xE4teren Jahres',
|
||||
'encoded': 'Willst du die Blthe des frhen, die Frchte des spteren Jahres-x9e96lkal'
|
||||
},
|
||||
// http://tools.ietf.org/html/rfc3492#section-7.1
|
||||
{
|
||||
'description': 'Arabic (Egyptian)',
|
||||
'decoded': '\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F',
|
||||
'encoded': 'egbpdaj6bu4bxfgehfvwxn'
|
||||
},
|
||||
{
|
||||
'description': 'Chinese (simplified)',
|
||||
'decoded': '\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2d\u6587',
|
||||
'encoded': 'ihqwcrb4cv8a8dqg056pqjye'
|
||||
},
|
||||
{
|
||||
'description': 'Chinese (traditional)',
|
||||
'decoded': '\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587',
|
||||
'encoded': 'ihqwctvzc91f659drss3x8bo0yb'
|
||||
},
|
||||
{
|
||||
'description': 'Czech',
|
||||
'decoded': 'Pro\u010Dprost\u011Bnemluv\xED\u010Desky',
|
||||
'encoded': 'Proprostnemluvesky-uyb24dma41a'
|
||||
},
|
||||
{
|
||||
'description': 'Hebrew',
|
||||
'decoded': '\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2\u05D1\u05E8\u05D9\u05EA',
|
||||
'encoded': '4dbcagdahymbxekheh6e0a7fei0b'
|
||||
},
|
||||
{
|
||||
'description': 'Hindi (Devanagari)',
|
||||
'decoded': '\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947\u0939\u0948\u0902',
|
||||
'encoded': 'i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd'
|
||||
},
|
||||
{
|
||||
'description': 'Japanese (kanji and hiragana)',
|
||||
'decoded': '\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B',
|
||||
'encoded': 'n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa'
|
||||
},
|
||||
{
|
||||
'description': 'Korean (Hangul syllables)',
|
||||
'decoded': '\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C',
|
||||
'encoded': '989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c'
|
||||
},
|
||||
/**
|
||||
* As there's no way to do it in JavaScript, Punycode.js doesn't support
|
||||
* mixed-case annotation (which is entirely optional as per the RFC).
|
||||
* So, while the RFC sample string encodes to:
|
||||
* `b1abfaaepdrnnbgefbaDotcwatmq2g4l`
|
||||
* Without mixed-case annotation it has to encode to:
|
||||
* `b1abfaaepdrnnbgefbadotcwatmq2g4l`
|
||||
* https://github.com/bestiejs/punycode.js/issues/3
|
||||
*/
|
||||
{
|
||||
'description': 'Russian (Cyrillic)',
|
||||
'decoded': '\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A\u0438',
|
||||
'encoded': 'b1abfaaepdrnnbgefbadotcwatmq2g4l'
|
||||
},
|
||||
{
|
||||
'description': 'Spanish',
|
||||
'decoded': 'Porqu\xE9nopuedensimplementehablarenEspa\xF1ol',
|
||||
'encoded': 'PorqunopuedensimplementehablarenEspaol-fmd56a'
|
||||
},
|
||||
{
|
||||
'description': 'Vietnamese',
|
||||
'decoded': 'T\u1EA1isaoh\u1ECDkh\xF4ngth\u1EC3ch\u1EC9n\xF3iti\u1EBFngVi\u1EC7t',
|
||||
'encoded': 'TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g'
|
||||
},
|
||||
{
|
||||
'decoded': '3\u5E74B\u7D44\u91D1\u516B\u5148\u751F',
|
||||
'encoded': '3B-ww4c5e180e575a65lsy2b'
|
||||
},
|
||||
{
|
||||
'decoded': '\u5B89\u5BA4\u5948\u7F8E\u6075-with-SUPER-MONKEYS',
|
||||
'encoded': '-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n'
|
||||
},
|
||||
{
|
||||
'decoded': 'Hello-Another-Way-\u305D\u308C\u305E\u308C\u306E\u5834\u6240',
|
||||
'encoded': 'Hello-Another-Way--fc4qua05auwb3674vfr0b'
|
||||
},
|
||||
{
|
||||
'decoded': '\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B2',
|
||||
'encoded': '2-u9tlzr9756bt3uc0v'
|
||||
},
|
||||
{
|
||||
'decoded': 'Maji\u3067Koi\u3059\u308B5\u79D2\u524D',
|
||||
'encoded': 'MajiKoi5-783gue6qz075azm5e'
|
||||
},
|
||||
{
|
||||
'decoded': '\u30D1\u30D5\u30A3\u30FCde\u30EB\u30F3\u30D0',
|
||||
'encoded': 'de-jg4avhby1noc0d'
|
||||
},
|
||||
{
|
||||
'decoded': '\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067',
|
||||
'encoded': 'd9juau41awczczp'
|
||||
},
|
||||
/**
|
||||
* This example is an ASCII string that breaks the existing rules for host
|
||||
* name labels. (It's not a realistic example for IDNA, because IDNA never
|
||||
* encodes pure ASCII labels.)
|
||||
*/
|
||||
{
|
||||
'description': 'ASCII string that breaks the existing rules for host-name labels',
|
||||
'decoded': '-> $1.00 <-',
|
||||
'encoded': '-> $1.00 <--'
|
||||
}
|
||||
],
|
||||
'ucs2': [
|
||||
// Every Unicode symbol is tested separately. These are just the extra
|
||||
// tests for symbol combinations:
|
||||
{
|
||||
'description': 'Consecutive astral symbols',
|
||||
'decoded': [127829, 119808, 119558, 119638],
|
||||
'encoded': '\uD83C\uDF55\uD835\uDC00\uD834\uDF06\uD834\uDF56'
|
||||
},
|
||||
{
|
||||
'description': 'U+D800 (high surrogate) followed by non-surrogates',
|
||||
'decoded': [55296, 97, 98],
|
||||
'encoded': '\uD800ab'
|
||||
},
|
||||
{
|
||||
'description': 'U+DC00 (low surrogate) followed by non-surrogates',
|
||||
'decoded': [56320, 97, 98],
|
||||
'encoded': '\uDC00ab'
|
||||
},
|
||||
{
|
||||
'description': 'High surrogate followed by another high surrogate',
|
||||
'decoded': [0xD800, 0xD800],
|
||||
'encoded': '\uD800\uD800'
|
||||
},
|
||||
{
|
||||
'description': 'Unmatched high surrogate, followed by a surrogate pair, followed by an unmatched high surrogate',
|
||||
'decoded': [0xD800, 0x1D306, 0xD800],
|
||||
'encoded': '\uD800\uD834\uDF06\uD800'
|
||||
},
|
||||
{
|
||||
'description': 'Low surrogate followed by another low surrogate',
|
||||
'decoded': [0xDC00, 0xDC00],
|
||||
'encoded': '\uDC00\uDC00'
|
||||
},
|
||||
{
|
||||
'description': 'Unmatched low surrogate, followed by a surrogate pair, followed by an unmatched low surrogate',
|
||||
'decoded': [0xDC00, 0x1D306, 0xDC00],
|
||||
'encoded': '\uDC00\uD834\uDF06\uDC00'
|
||||
}
|
||||
],
|
||||
'domains': [
|
||||
{
|
||||
'decoded': 'ma\xF1ana.com',
|
||||
'encoded': 'xn--maana-pta.com'
|
||||
},
|
||||
{ // https://github.com/bestiejs/punycode.js/issues/17
|
||||
'decoded': 'example.com.',
|
||||
'encoded': 'example.com.'
|
||||
},
|
||||
{
|
||||
'decoded': 'b\xFCcher.com',
|
||||
'encoded': 'xn--bcher-kva.com'
|
||||
},
|
||||
{
|
||||
'decoded': 'caf\xE9.com',
|
||||
'encoded': 'xn--caf-dma.com'
|
||||
},
|
||||
{
|
||||
'decoded': '\u2603-\u2318.com',
|
||||
'encoded': 'xn----dqo34k.com'
|
||||
},
|
||||
{
|
||||
'decoded': '\uD400\u2603-\u2318.com',
|
||||
'encoded': 'xn----dqo34kn65z.com'
|
||||
},
|
||||
{
|
||||
'description': 'Emoji',
|
||||
'decoded': '\uD83D\uDCA9.la',
|
||||
'encoded': 'xn--ls8h.la'
|
||||
},
|
||||
{
|
||||
'description': 'Email address',
|
||||
'decoded': '\u0434\u0436\u0443\u043C\u043B\u0430@\u0434\u0436p\u0443\u043C\u043B\u0430\u0442\u0435\u0441\u0442.b\u0440\u0444a',
|
||||
'encoded': '\u0434\u0436\u0443\u043C\u043B\u0430@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'
|
||||
}
|
||||
],
|
||||
'separators': [
|
||||
{
|
||||
'description': 'Using U+002E as separator',
|
||||
'decoded': 'ma\xF1ana\x2Ecom',
|
||||
'encoded': 'xn--maana-pta.com'
|
||||
},
|
||||
{
|
||||
'description': 'Using U+3002 as separator',
|
||||
'decoded': 'ma\xF1ana\u3002com',
|
||||
'encoded': 'xn--maana-pta.com'
|
||||
},
|
||||
{
|
||||
'description': 'Using U+FF0E as separator',
|
||||
'decoded': 'ma\xF1ana\uFF0Ecom',
|
||||
'encoded': 'xn--maana-pta.com'
|
||||
},
|
||||
{
|
||||
'description': 'Using U+FF61 as separator',
|
||||
'decoded': 'ma\xF1ana\uFF61com',
|
||||
'encoded': 'xn--maana-pta.com'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
// simple `Array#forEach`-like helper function
|
||||
function each(array, fn) {
|
||||
var index = array.length;
|
||||
while (index--) {
|
||||
fn(array[index], index);
|
||||
}
|
||||
}
|
||||
|
||||
// `throws` is a reserved word in ES3; alias it to avoid errors
|
||||
var raises = QUnit.assert['throws'];
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
// Explicitly call `QUnit.module()` instead of `module()` in case we are in
|
||||
// a CLI environment.
|
||||
QUnit.module('punycode');
|
||||
|
||||
test('punycode.ucs2.decode', function() {
|
||||
// Test all Unicode code points separately.
|
||||
runExtendedTests && each(allSymbols, function(string, codePoint) {
|
||||
deepEqual(punycode.ucs2.decode(string), [codePoint], 'Decoding symbol with code point ' + codePoint);
|
||||
});
|
||||
each(testData.ucs2, function(object) {
|
||||
deepEqual(punycode.ucs2.decode(object.encoded), object.decoded, object.description);
|
||||
});
|
||||
raises(
|
||||
function() {
|
||||
punycode.decode('\x81-');
|
||||
},
|
||||
RangeError,
|
||||
'RangeError: Illegal input >= 0x80 (not a basic code point)'
|
||||
);
|
||||
raises(
|
||||
function() {
|
||||
punycode.decode('\x81');
|
||||
},
|
||||
RangeError,
|
||||
'RangeError: Overflow: input needs wider integers to process'
|
||||
);
|
||||
});
|
||||
|
||||
test('punycode.ucs2.encode', function() {
|
||||
// test all Unicode code points separately
|
||||
runExtendedTests && each(allSymbols, function(string, codePoint) {
|
||||
deepEqual(punycode.ucs2.encode([codePoint]), string, 'Encoding code point ' + codePoint);
|
||||
});
|
||||
each(testData.ucs2, function(object) {
|
||||
equal(punycode.ucs2.encode(object.decoded), object.encoded, object.description);
|
||||
});
|
||||
var codePoints = [0x61, 0x62, 0x63];
|
||||
var result = punycode.ucs2.encode(codePoints);
|
||||
equal(result, 'abc');
|
||||
deepEqual(codePoints, [0x61, 0x62, 0x63], 'Do not mutate argument array');
|
||||
});
|
||||
|
||||
test('punycode.decode', function() {
|
||||
each(testData.strings, function(object) {
|
||||
equal(punycode.decode(object.encoded), object.decoded, object.description);
|
||||
});
|
||||
equal(punycode.decode('ZZZ'), '\u7BA5', 'Uppercase Z');
|
||||
});
|
||||
|
||||
test('punycode.encode', function() {
|
||||
each(testData.strings, function(object) {
|
||||
equal(punycode.encode(object.decoded), object.encoded, object.description);
|
||||
});
|
||||
});
|
||||
|
||||
test('punycode.toUnicode', function() {
|
||||
each(testData.domains, function(object) {
|
||||
equal(punycode.toUnicode(object.encoded), object.decoded, object.description);
|
||||
});
|
||||
/**
|
||||
* Domain names (or other strings) that don't start with `xn--` may not be
|
||||
* converted.
|
||||
*/
|
||||
each(testData.strings, function(object) {
|
||||
var message = 'Domain names (or other strings) that don\'t start with `xn--` may not be converted';
|
||||
equal(punycode.toUnicode(object.encoded), object.encoded, message);
|
||||
equal(punycode.toUnicode(object.decoded), object.decoded, message);
|
||||
});
|
||||
});
|
||||
|
||||
test('punycode.toASCII', function() {
|
||||
each(testData.domains, function(object) {
|
||||
equal(punycode.toASCII(object.decoded), object.encoded, object.description);
|
||||
});
|
||||
/**
|
||||
* Domain names (or other strings) that are already in ASCII may not be
|
||||
* converted.
|
||||
*/
|
||||
each(testData.strings, function(object) {
|
||||
equal(punycode.toASCII(object.encoded), object.encoded, 'Domain names (or other strings) that are already in ASCII may not be converted');
|
||||
});
|
||||
/**
|
||||
* IDNA2003 separators must be supported for backwards compatibility.
|
||||
*/
|
||||
each(testData.separators, function(object) {
|
||||
var message = 'IDNA2003 separators must be supported for backwards compatibility';
|
||||
equal(punycode.toASCII(object.decoded), object.encoded, message);
|
||||
});
|
||||
});
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
// configure QUnit and call `QUnit.start()` for
|
||||
// Narwhal, Node.js, PhantomJS, Rhino, and RingoJS
|
||||
if (!root.document || root.phantom) {
|
||||
QUnit.config.noglobals = true;
|
||||
QUnit.start();
|
||||
}
|
||||
|
||||
}(typeof global == 'object' && global || this));
|
||||
Reference in New Issue
Block a user