IPv6.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /*!
  2. * URI.js - Mutating URLs
  3. * IPv6 Support
  4. *
  5. * Version: 1.19.11
  6. *
  7. * Author: Rodney Rehm
  8. * Web: http://medialize.github.io/URI.js/
  9. *
  10. * Licensed under
  11. * MIT License http://www.opensource.org/licenses/mit-license
  12. *
  13. */
  14. (function (root, factory) {
  15. 'use strict';
  16. // https://github.com/umdjs/umd/blob/master/returnExports.js
  17. if (typeof module === 'object' && module.exports) {
  18. // Node
  19. module.exports = factory();
  20. } else if (typeof define === 'function' && define.amd) {
  21. // AMD. Register as an anonymous module.
  22. define(factory);
  23. } else {
  24. // Browser globals (root is window)
  25. root.IPv6 = factory(root);
  26. }
  27. }(this, function (root) {
  28. 'use strict';
  29. /*
  30. var _in = "fe80:0000:0000:0000:0204:61ff:fe9d:f156";
  31. var _out = IPv6.best(_in);
  32. var _expected = "fe80::204:61ff:fe9d:f156";
  33. console.log(_in, _out, _expected, _out === _expected);
  34. */
  35. // save current IPv6 variable, if any
  36. var _IPv6 = root && root.IPv6;
  37. function bestPresentation(address) {
  38. // based on:
  39. // Javascript to test an IPv6 address for proper format, and to
  40. // present the "best text representation" according to IETF Draft RFC at
  41. // http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04
  42. // 8 Feb 2010 Rich Brown, Dartware, LLC
  43. // Please feel free to use this code as long as you provide a link to
  44. // http://www.intermapper.com
  45. // http://intermapper.com/support/tools/IPV6-Validator.aspx
  46. // http://download.dartware.com/thirdparty/ipv6validator.js
  47. var _address = address.toLowerCase();
  48. var segments = _address.split(':');
  49. var length = segments.length;
  50. var total = 8;
  51. // trim colons (:: or ::a:b:c… or …a:b:c::)
  52. if (segments[0] === '' && segments[1] === '' && segments[2] === '') {
  53. // must have been ::
  54. // remove first two items
  55. segments.shift();
  56. segments.shift();
  57. } else if (segments[0] === '' && segments[1] === '') {
  58. // must have been ::xxxx
  59. // remove the first item
  60. segments.shift();
  61. } else if (segments[length - 1] === '' && segments[length - 2] === '') {
  62. // must have been xxxx::
  63. segments.pop();
  64. }
  65. length = segments.length;
  66. // adjust total segments for IPv4 trailer
  67. if (segments[length - 1].indexOf('.') !== -1) {
  68. // found a "." which means IPv4
  69. total = 7;
  70. }
  71. // fill empty segments them with "0000"
  72. var pos;
  73. for (pos = 0; pos < length; pos++) {
  74. if (segments[pos] === '') {
  75. break;
  76. }
  77. }
  78. if (pos < total) {
  79. segments.splice(pos, 1, '0000');
  80. while (segments.length < total) {
  81. segments.splice(pos, 0, '0000');
  82. }
  83. }
  84. // strip leading zeros
  85. var _segments;
  86. for (var i = 0; i < total; i++) {
  87. _segments = segments[i].split('');
  88. for (var j = 0; j < 3 ; j++) {
  89. if (_segments[0] === '0' && _segments.length > 1) {
  90. _segments.splice(0,1);
  91. } else {
  92. break;
  93. }
  94. }
  95. segments[i] = _segments.join('');
  96. }
  97. // find longest sequence of zeroes and coalesce them into one segment
  98. var best = -1;
  99. var _best = 0;
  100. var _current = 0;
  101. var current = -1;
  102. var inzeroes = false;
  103. // i; already declared
  104. for (i = 0; i < total; i++) {
  105. if (inzeroes) {
  106. if (segments[i] === '0') {
  107. _current += 1;
  108. } else {
  109. inzeroes = false;
  110. if (_current > _best) {
  111. best = current;
  112. _best = _current;
  113. }
  114. }
  115. } else {
  116. if (segments[i] === '0') {
  117. inzeroes = true;
  118. current = i;
  119. _current = 1;
  120. }
  121. }
  122. }
  123. if (_current > _best) {
  124. best = current;
  125. _best = _current;
  126. }
  127. if (_best > 1) {
  128. segments.splice(best, _best, '');
  129. }
  130. length = segments.length;
  131. // assemble remaining segments
  132. var result = '';
  133. if (segments[0] === '') {
  134. result = ':';
  135. }
  136. for (i = 0; i < length; i++) {
  137. result += segments[i];
  138. if (i === length - 1) {
  139. break;
  140. }
  141. result += ':';
  142. }
  143. if (segments[length - 1] === '') {
  144. result += ':';
  145. }
  146. return result;
  147. }
  148. function noConflict() {
  149. /*jshint validthis: true */
  150. if (root.IPv6 === this) {
  151. root.IPv6 = _IPv6;
  152. }
  153. return this;
  154. }
  155. return {
  156. best: bestPresentation,
  157. noConflict: noConflict
  158. };
  159. }));