Skip to content

Commit

Permalink
Parser: Network parsers now return a text value. Fixes #1494
Browse files Browse the repository at this point in the history
  • Loading branch information
Mottie committed Jan 10, 2018
1 parent b325235 commit c9e93cc
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 17 deletions.
6 changes: 4 additions & 2 deletions docs/example-parsers-ip-address.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,13 @@ <h3>Flexible client-side table sorting</h3>
<em>NOTE!</em>
</p>
<ul>
<li><span class="label warning">NOTE</span> The default "ipAddress" parser (also named "ipv4Address") is included with the original tablesorter; it was moved to the <code>parser-network.js</code> file in <span class="version">v2.18.0</span>.</li>
<li><span class="label warning">NOTE</span> The default "ipAddress" parser (also named "ipv4Address") is included with the original tablesorter; it was moved to the <code>parser-network.js</code> file in <span class="version">v2.18.0</span>.<br><br></li>

<li>In <span class="version">v2.29.3</span>, all included parsers were changed to return a text representation of the network address. The specific issue was that the parsed IPv6 numerical values were too large for javascript to properly recognize the number.</li>
<li>A parser for IPv6 was added in <span class="version">v2.12</span> and named "ipv6Address":
<ul>
<li>Unlike some other custom parsers, this one will auto-detect &amp; check for a valid IPv6 address since the same address can be represented in many different ways. Some examples are shown in the demo table below.</li>
<li>IPv6 addresses are stored in the cache in their canonical decimal form, without the colons, for faster &amp; easier numerical sorting.</li>
<li>IPv6 addresses are stored in the cache in their canonical decimal form, for faster &amp; easier numerical sorting.</li>
<li><a href="../test.html">Extensive unit tests</a> are included with this parser.</li>
</ul>
</li>
Expand Down
33 changes: 19 additions & 14 deletions js/parsers/parser-network.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/*! Parser: network - updated 5/17/2015 (v2.22.0) */
/*! Parser: network - updated 2018-01-10 (v2.29.3) */
/* IPv4, IPv6 and MAC Addresses */
/*global jQuery: false */
;(function($){
Expand All @@ -23,6 +23,10 @@
ipv6Validate : /^\s*((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/i
});

// used for internal testing; it's not useful to set this to true because the natural sort algorithm
// is set up to only sort solitary hex values ("ffff") vs separated hex values ("ffff.ffff")
ts.defaults.ipv6HexFormat = false;

ts.addParser({
id: 'ipv6Address',
is: function(s) {
Expand Down Expand Up @@ -72,25 +76,26 @@
('00000' + (parseInt(groups[i], 16) || 0)).slice(-5);
expandedAddress += ( i != validGroupCount - 1) ? groups[i] + ':' : groups[i];
}
return hex ? expandedAddress : expandedAddress.replace(/:/g, '');
return expandedAddress;
},
// uses natural sort hex compare
type: 'numeric'
type: 'text'
});

// ipv4 address
// moved here from jquery.tablesorter.js (core file)
ipv4Is = function(s) {
return (/^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/).test(s);
};
ipv4Format = function(s, table) {
var i, a = s ? s.split('.') : '',
r = '',
ipv4Format = function(s) {
var i,
a = s ? s.split('.') : '',
r = [],
l = a.length;
for (i = 0; i < l; i++) {
r += ('000' + a[i]).slice(-3);
r.push(('000' + a[i]).slice(-3));
}
return s ? ts.formatFloat(r, table) : s;
return s ? r.join('.') : s;
};

/*! Parser: ipv4Address (a.k.a. ipAddress) */
Expand All @@ -99,13 +104,13 @@
id: 'ipAddress',
is: ipv4Is,
format: ipv4Format,
type: 'numeric'
type: 'text'
});
ts.addParser({
id: 'ipv4Address',
is: ipv4Is,
format: ipv4Format,
type: 'numeric'
type: 'text'
});

/*! Parser: MAC address */
Expand All @@ -118,21 +123,21 @@
},
format : function( str ) {
var indx, len,
mac = '',
mac = [],
val = ( str || '' ).replace( /[:.-]/g, '' ).match( /\w{2}/g );
if ( val ) {
// not assuming all mac addresses in the column will end up with six
// groups of two to process, so it's not actually validating the address
len = val.length;
for ( indx = 0; indx < len; indx++ ) {
mac += ( '000' + parseInt( val[ indx ], 16 ) ).slice( -3 );
mac.push(( '000' + parseInt( val[ indx ], 16 ) ).slice( -3 ));
}
return mac;
return mac.join('.');
}
return str;
},
// uses natural sort hex compare
type : 'numeric'
type : 'text'
});

})( jQuery );
2 changes: 1 addition & 1 deletion testing/testing.js
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ jQuery(function($){
sample1 = {
'text' : { 'test': 'test', 'TesT': 'test', '\u00e1 test': '\u00e1 test' },
'currency' : { '\u00a31': 1, '($2.23)': -2.23, '5\u20ac': 5, '(11\u00a4)': -11, '500\u00a5': 500, '25\u00a2': 25, '$1,000.50': 1000.5 },
'ipAddress' : { '255.255.255.255': 255255255255, '32.32.32.32': 32032032032, '1.1.1.1': 1001001001 },
'ipAddress' : { '255.255.255.255': '255.255.255.255', '32.32.32.32': '032.032.032.032', '1.1.1.1': '001.001.001.001' },
'url' : { 'http://google.com': 'google.com', 'ftp://fred.com': 'fred.com', 'https://github.com': 'github.com' },
'isoDate' : { '2012/12/12': returnTime('2012/12/12'), '2012-12/12': returnTime('2012/12/12'), '2013-1-1': returnTime('2013/1/1'), '2013/1/1 12:34:56 AM': returnTime('2013/1/1 12:34:56 AM') },
'percent' : { '100%': 100, '22%': 22, '%2': 2, '2 %': 2, '(4%)': -4, '1,234.56 %': 1234.56 },
Expand Down

0 comments on commit c9e93cc

Please sign in to comment.