-
Notifications
You must be signed in to change notification settings - Fork 98
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
19 changed files
with
4,579 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,185 @@ | ||
/*! | ||
* URI.js - Mutating URLs | ||
* IPv6 Support | ||
* | ||
* Version: 1.19.0 | ||
* | ||
* Author: Rodney Rehm | ||
* Web: http://medialize.github.io/URI.js/ | ||
* | ||
* Licensed under | ||
* MIT License http://www.opensource.org/licenses/mit-license | ||
* | ||
*/ | ||
|
||
(function (root, factory) { | ||
'use strict'; | ||
// https://github.com/umdjs/umd/blob/master/returnExports.js | ||
if (typeof module === 'object' && module.exports) { | ||
// Node | ||
module.exports = factory(); | ||
} else if (typeof define === 'function' && define.amd) { | ||
// AMD. Register as an anonymous module. | ||
define(factory); | ||
} else { | ||
// Browser globals (root is window) | ||
root.IPv6 = factory(root); | ||
} | ||
}(this, function (root) { | ||
'use strict'; | ||
|
||
/* | ||
var _in = "fe80:0000:0000:0000:0204:61ff:fe9d:f156"; | ||
var _out = IPv6.best(_in); | ||
var _expected = "fe80::204:61ff:fe9d:f156"; | ||
console.log(_in, _out, _expected, _out === _expected); | ||
*/ | ||
|
||
// save current IPv6 variable, if any | ||
var _IPv6 = root && root.IPv6; | ||
|
||
function bestPresentation(address) { | ||
// based on: | ||
// Javascript to test an IPv6 address for proper format, and to | ||
// present the "best text representation" according to IETF Draft RFC at | ||
// http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04 | ||
// 8 Feb 2010 Rich Brown, Dartware, LLC | ||
// Please feel free to use this code as long as you provide a link to | ||
// http://www.intermapper.com | ||
// http://intermapper.com/support/tools/IPV6-Validator.aspx | ||
// http://download.dartware.com/thirdparty/ipv6validator.js | ||
|
||
var _address = address.toLowerCase(); | ||
var segments = _address.split(':'); | ||
var length = segments.length; | ||
var total = 8; | ||
|
||
// trim colons (:: or ::a:b:c… or …a:b:c::) | ||
if (segments[0] === '' && segments[1] === '' && segments[2] === '') { | ||
// must have been :: | ||
// remove first two items | ||
segments.shift(); | ||
segments.shift(); | ||
} else if (segments[0] === '' && segments[1] === '') { | ||
// must have been ::xxxx | ||
// remove the first item | ||
segments.shift(); | ||
} else if (segments[length - 1] === '' && segments[length - 2] === '') { | ||
// must have been xxxx:: | ||
segments.pop(); | ||
} | ||
|
||
length = segments.length; | ||
|
||
// adjust total segments for IPv4 trailer | ||
if (segments[length - 1].indexOf('.') !== -1) { | ||
// found a "." which means IPv4 | ||
total = 7; | ||
} | ||
|
||
// fill empty segments them with "0000" | ||
var pos; | ||
for (pos = 0; pos < length; pos++) { | ||
if (segments[pos] === '') { | ||
break; | ||
} | ||
} | ||
|
||
if (pos < total) { | ||
segments.splice(pos, 1, '0000'); | ||
while (segments.length < total) { | ||
segments.splice(pos, 0, '0000'); | ||
} | ||
} | ||
|
||
// strip leading zeros | ||
var _segments; | ||
for (var i = 0; i < total; i++) { | ||
_segments = segments[i].split(''); | ||
for (var j = 0; j < 3 ; j++) { | ||
if (_segments[0] === '0' && _segments.length > 1) { | ||
_segments.splice(0,1); | ||
} else { | ||
break; | ||
} | ||
} | ||
|
||
segments[i] = _segments.join(''); | ||
} | ||
|
||
// find longest sequence of zeroes and coalesce them into one segment | ||
var best = -1; | ||
var _best = 0; | ||
var _current = 0; | ||
var current = -1; | ||
var inzeroes = false; | ||
// i; already declared | ||
|
||
for (i = 0; i < total; i++) { | ||
if (inzeroes) { | ||
if (segments[i] === '0') { | ||
_current += 1; | ||
} else { | ||
inzeroes = false; | ||
if (_current > _best) { | ||
best = current; | ||
_best = _current; | ||
} | ||
} | ||
} else { | ||
if (segments[i] === '0') { | ||
inzeroes = true; | ||
current = i; | ||
_current = 1; | ||
} | ||
} | ||
} | ||
|
||
if (_current > _best) { | ||
best = current; | ||
_best = _current; | ||
} | ||
|
||
if (_best > 1) { | ||
segments.splice(best, _best, ''); | ||
} | ||
|
||
length = segments.length; | ||
|
||
// assemble remaining segments | ||
var result = ''; | ||
if (segments[0] === '') { | ||
result = ':'; | ||
} | ||
|
||
for (i = 0; i < length; i++) { | ||
result += segments[i]; | ||
if (i === length - 1) { | ||
break; | ||
} | ||
|
||
result += ':'; | ||
} | ||
|
||
if (segments[length - 1] === '') { | ||
result += ':'; | ||
} | ||
|
||
return result; | ||
} | ||
|
||
function noConflict() { | ||
/*jshint validthis: true */ | ||
if (root.IPv6 === this) { | ||
root.IPv6 = _IPv6; | ||
} | ||
|
||
return this; | ||
} | ||
|
||
return { | ||
best: bestPresentation, | ||
noConflict: noConflict | ||
}; | ||
})); |
Oops, something went wrong.