69 lines
1.3 KiB
JavaScript
69 lines
1.3 KiB
JavaScript
define([], function () {
|
|
function order(c) {
|
|
if (/^\d$/.test(c)) {
|
|
return 0;
|
|
} else if (/^[a-z]$/i.test(c)) {
|
|
return c.charCodeAt(0);
|
|
} else if (c === "~") {
|
|
return -1;
|
|
} else if (c) {
|
|
return c.charCodeAt(0) + 256;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
// Based on dpkg code
|
|
function vercomp(a, b) {
|
|
var apos = 0, bpos = 0;
|
|
while (apos < a.length || bpos < b.length) {
|
|
var firstDiff = 0;
|
|
|
|
while ((apos < a.length && !/^\d$/.test(a[apos])) || (bpos < b.length && !/^\d$/.test(b[bpos]))) {
|
|
var ac = order(a[apos]);
|
|
var bc = order(b[bpos]);
|
|
|
|
if (ac !== bc) {
|
|
return ac - bc;
|
|
}
|
|
|
|
apos++;
|
|
bpos++;
|
|
}
|
|
|
|
while (a[apos] === "0") {
|
|
apos++;
|
|
}
|
|
|
|
while (b[bpos] === "0") {
|
|
bpos++;
|
|
}
|
|
|
|
while (/^\d$/.test(a[apos]) && /^\d$/.test(b[bpos])) {
|
|
if (firstDiff === 0) {
|
|
firstDiff = a.charCodeAt(apos) - b.charCodeAt(bpos);
|
|
}
|
|
|
|
apos++;
|
|
bpos++;
|
|
}
|
|
|
|
if (/^\d$/.test(a[apos])) {
|
|
return 1;
|
|
}
|
|
|
|
if (/^\d$/.test(b[bpos])) {
|
|
return -1;
|
|
}
|
|
|
|
if (firstDiff !== 0) {
|
|
return firstDiff;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
return vercomp;
|
|
});
|