Skip to content

Commit

Permalink
Merge 7514324 into 006a2f4
Browse files Browse the repository at this point in the history
  • Loading branch information
TrySound committed Aug 27, 2015
2 parents 006a2f4 + 7514324 commit 77f0da3
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 88 deletions.
73 changes: 40 additions & 33 deletions index.js
Expand Up @@ -9,46 +9,53 @@
* @license MIT License
*/


String.naturalCompare = function(a, b) {
var i, codeA
, codeB = 1
, posA = 0
, posB = 0
, alphabet = String.alphabet

function getCode(str, pos, code) {
if (code) {
for (i = pos; code = getCode(str, i), code < 76 && code > 65;) ++i;
return +str.slice(pos - 1, i)
(function () {
function naturalCompare(a, b) {
var i, codeA
, codeB = 1
, posA = 0
, posB = 0
, alphabet = String.alphabet

function getCode(str, pos, code) {
if (code) {
for (i = pos; code = getCode(str, i), code < 76 && code > 65;) ++i;
return +str.slice(pos - 1, i)
}
code = alphabet && alphabet.indexOf(str.charAt(pos))
return code > -1 ? code + 76 : ((code = str.charCodeAt(pos) || 0), code < 45 || code > 127) ? code
: code < 46 ? 65 // -
: code < 48 ? code - 1
: code < 58 ? code + 18 // 0-9
: code < 65 ? code - 11
: code < 91 ? code + 11 // A-Z
: code < 97 ? code - 37
: code < 123 ? code + 5 // a-z
: code - 63
}
code = alphabet && alphabet.indexOf(str.charAt(pos))
return code > -1 ? code + 76 : ((code = str.charCodeAt(pos) || 0), code < 45 || code > 127) ? code
: code < 46 ? 65 // -
: code < 48 ? code - 1
: code < 58 ? code + 18 // 0-9
: code < 65 ? code - 11
: code < 91 ? code + 11 // A-Z
: code < 97 ? code - 37
: code < 123 ? code + 5 // a-z
: code - 63
}


if ((a+="") != (b+="")) for (;codeB;) {
codeA = getCode(a, posA++)
codeB = getCode(b, posB++)
if ((a+="") != (b+="")) for (;codeB;) {
codeA = getCode(a, posA++)
codeB = getCode(b, posB++)

if (codeA < 76 && codeB < 76 && codeA > 66 && codeB > 66) {
codeA = getCode(a, posA, posA)
codeB = getCode(b, posB, posA = i)
posB = i
if (codeA < 76 && codeB < 76 && codeA > 66 && codeB > 66) {
codeA = getCode(a, posA, posA)
codeB = getCode(b, posB, posA = i)
posB = i
}

if (codeA != codeB) return (codeA < codeB) ? -1 : 1
}
return 0
}

if (codeA != codeB) return (codeA < codeB) ? -1 : 1
if(typeof exports === 'object') {
module.exports = naturalCompare
} else {
String.naturalCompare = naturalCompare
}
return 0
}
} ())



110 changes: 55 additions & 55 deletions tests/index.js
@@ -1,75 +1,75 @@

require("../")
var naturalCompare = require("../");

var arr1 = [1.001, 1.002, 1.010, 1.02, 1.1, 1.3]
, arr2 = [-1.001, -1.002, -1.010, -1.02, -1.1, -1.3]
, arr3 = [0.001, 0.002, 0.010, 0.02, 0.1, 0.3]
, arr4 = [-0.001, -0.002, -0.010, -0.02, -0.1, -0.3]

require("testman").
describe ("String.naturalCompare").
describe ("naturalCompare").
it ( "should compare strings as usual" ).
equal( String.naturalCompare("a", "a"), 0 ).
equal( String.naturalCompare("a", "b"), -1 ).
equal( String.naturalCompare("b", "a"), 1 ).
equal( String.naturalCompare("a", "aa"), -1 ).
equal( String.naturalCompare("aa", "a"), 1 ).
equal( String.naturalCompare("a", "ba"), -1 ).
equal( String.naturalCompare("aa", "b"), -1 ).
equal( String.naturalCompare("aa", "ba"), -1 ).
equal( String.naturalCompare("ba", "a"), 1 ).
equal( String.naturalCompare("b", "aa"), 1 ).
equal( String.naturalCompare("ba", "aa"), 1 ).
equal( ["a", "c", "b", "d"].sort(String.naturalCompare)+"", "a,b,c,d" ).
equal( naturalCompare("a", "a"), 0 ).
equal( naturalCompare("a", "b"), -1 ).
equal( naturalCompare("b", "a"), 1 ).
equal( naturalCompare("a", "aa"), -1 ).
equal( naturalCompare("aa", "a"), 1 ).
equal( naturalCompare("a", "ba"), -1 ).
equal( naturalCompare("aa", "b"), -1 ).
equal( naturalCompare("aa", "ba"), -1 ).
equal( naturalCompare("ba", "a"), 1 ).
equal( naturalCompare("b", "aa"), 1 ).
equal( naturalCompare("ba", "aa"), 1 ).
equal( ["a", "c", "b", "d"].sort(naturalCompare)+"", "a,b,c,d" ).

it ( "should compare decimal integer substrings by their numeric value" ).
equal( String.naturalCompare("a", "a1"), -1 ).
equal( String.naturalCompare("a1", "a"), 1 ).
equal( String.naturalCompare("a", "1"), 1 ).
equal( String.naturalCompare("1", "1"), 0 ).
equal( String.naturalCompare("2", "3"), -1 ).
equal( String.naturalCompare("3", "2"), 1 ).
equal( String.naturalCompare("9", "2"), 1 ).
equal( String.naturalCompare("1", "a"), -1 ).
equal( String.naturalCompare("a1", "a1"), 0 ).
equal( String.naturalCompare("a1", "a2"), -1 ).
equal( String.naturalCompare("a2", "a1"), 1 ).
equal( String.naturalCompare("a1", "a11"), -1 ).
equal( String.naturalCompare("a11","a12"), -1 ).
equal( String.naturalCompare("a12","a11"), 1 ).
equal( String.naturalCompare("a11", "a1"), 1 ).
equal( String.naturalCompare("a1a", "a1"), 1 ).
equal( String.naturalCompare("a1", "a1a"), -1 ).
equal( String.naturalCompare("a1a", "a11"), -1 ).
equal( String.naturalCompare("a11", "a1a"), 1 ).
equal( String.naturalCompare("a11a", "a1a"), 1 ).
equal( String.naturalCompare("a1a", "a11a"), -1 ).
equal( ['file-2.txt', 'file-1.txt', 'file-3.txt'].sort(String.naturalCompare)+"", "file-1.txt,file-2.txt,file-3.txt").
equal( naturalCompare("a", "a1"), -1 ).
equal( naturalCompare("a1", "a"), 1 ).
equal( naturalCompare("a", "1"), 1 ).
equal( naturalCompare("1", "1"), 0 ).
equal( naturalCompare("2", "3"), -1 ).
equal( naturalCompare("3", "2"), 1 ).
equal( naturalCompare("9", "2"), 1 ).
equal( naturalCompare("1", "a"), -1 ).
equal( naturalCompare("a1", "a1"), 0 ).
equal( naturalCompare("a1", "a2"), -1 ).
equal( naturalCompare("a2", "a1"), 1 ).
equal( naturalCompare("a1", "a11"), -1 ).
equal( naturalCompare("a11","a12"), -1 ).
equal( naturalCompare("a12","a11"), 1 ).
equal( naturalCompare("a11", "a1"), 1 ).
equal( naturalCompare("a1a", "a1"), 1 ).
equal( naturalCompare("a1", "a1a"), -1 ).
equal( naturalCompare("a1a", "a11"), -1 ).
equal( naturalCompare("a11", "a1a"), 1 ).
equal( naturalCompare("a11a", "a1a"), 1 ).
equal( naturalCompare("a1a", "a11a"), -1 ).
equal( ['file-2.txt', 'file-1.txt', 'file-3.txt'].sort(naturalCompare)+"", "file-1.txt,file-2.txt,file-3.txt").
it ( "should work with 0 in string" ).
equal( String.naturalCompare("a 0 a", "a 0 b"), -1 ).
equal( String.naturalCompare("a 0 a", "a 00 b"), -1 ).
equal( String.naturalCompare("a 0 b", "a 0 a"), 1 ).
equal( naturalCompare("a 0 a", "a 0 b"), -1 ).
equal( naturalCompare("a 0 a", "a 00 b"), -1 ).
equal( naturalCompare("a 0 b", "a 0 a"), 1 ).
it ( "should compare positive and negative number" ).
equal( String.naturalCompare("a 1", "a -1"), 1 ).
equal( String.naturalCompare("a -1", "a 1"), -1 ).
equal( String.naturalCompare("a 2", "a -1"), 1 ).
equal( String.naturalCompare("a -1", "a 2"), -1 ).
equal( String.naturalCompare("a 1", "a -2"), 1 ).
equal( String.naturalCompare("a -2", "a 1"), -1 ).
equal( String.naturalCompare("a -1", "a -1"), 0 ).
equal( [-1,1,-2,2,-10,10,-11,11,-100,100].sort(String.naturalCompare)+"", "-1,-2,-10,-11,-100,1,2,10,11,100" ).
equal( naturalCompare("a 1", "a -1"), 1 ).
equal( naturalCompare("a -1", "a 1"), -1 ).
equal( naturalCompare("a 2", "a -1"), 1 ).
equal( naturalCompare("a -1", "a 2"), -1 ).
equal( naturalCompare("a 1", "a -2"), 1 ).
equal( naturalCompare("a -2", "a 1"), -1 ).
equal( naturalCompare("a -1", "a -1"), 0 ).
equal( [-1,1,-2,2,-10,10,-11,11,-100,100].sort(naturalCompare)+"", "-1,-2,-10,-11,-100,1,2,10,11,100" ).
it ( "should preserve leading zeros on decimal fractions.").
equal( String.naturalCompare("1.01", "1.001"), 1 ).
equal( String.naturalCompare("1.001", "1.01"), -1 ).
equal(arr1.sort(String.naturalCompare).join(","), "1.001,1.002,1.01,1.02,1.1,1.3").
equal(arr1.reverse().sort(String.naturalCompare).join(","), "1.001,1.002,1.01,1.02,1.1,1.3").
equal(arr2.sort(String.naturalCompare).join(","), "-1.001,-1.002,-1.01,-1.02,-1.1,-1.3").
equal(arr3.sort(String.naturalCompare).join(","), "0.001,0.002,0.01,0.02,0.1,0.3").
equal(arr4.sort(String.naturalCompare).join(","), "-0.001,-0.002,-0.01,-0.02,-0.1,-0.3").
equal( naturalCompare("1.01", "1.001"), 1 ).
equal( naturalCompare("1.001", "1.01"), -1 ).
equal(arr1.sort(naturalCompare).join(","), "1.001,1.002,1.01,1.02,1.1,1.3").
equal(arr1.reverse().sort(naturalCompare).join(","), "1.001,1.002,1.01,1.02,1.1,1.3").
equal(arr2.sort(naturalCompare).join(","), "-1.001,-1.002,-1.01,-1.02,-1.1,-1.3").
equal(arr3.sort(naturalCompare).join(","), "0.001,0.002,0.01,0.02,0.1,0.3").
equal(arr4.sort(naturalCompare).join(","), "-0.001,-0.002,-0.01,-0.02,-0.1,-0.3").
it ( "should accept alphabet.").
run(function() {
String.alphabet = "ABDEFGHIJKLMNOPRSŠZŽTUVÕÄÖÜXYabdefghijklmnoprsšzžtuvõäöüxy"
}).
equal(["a", "ä", "B", "Š", "X", "A", "õ", "z", "1", "2", "9", "10"].sort(String.naturalCompare).join(""), "12910ABŠXazõä").
equal(["a", "ä", "B", "Š", "X", "A", "õ", "z", "1", "2", "9", "10"].sort(naturalCompare).join(""), "12910ABŠXazõä").
done()

0 comments on commit 77f0da3

Please sign in to comment.