fix sorting of japanese folders

directory-tree sidebar did not sort correctly for non-ascii names

also fix a natural-sort bug; it only took effect for the
initial folder load, and not when changing the sort-order

also, natural-sort will now apply to all non-numeric fields,
not just the filename like before
This commit is contained in:
ed 2025-04-13 21:11:07 +00:00
parent 2bd955ba9f
commit 7b2bd6da83
2 changed files with 59 additions and 20 deletions

View file

@ -4433,7 +4433,8 @@ function eval_hash() {
function read_dsort(txt) {
dnsort = dnsort ? 1 : 0;
clmod(ebi('nsort'), 'on', (sread('nsort') || dnsort) == 1);
ENATSORT = NATSORT && (sread('nsort') || dnsort) == 1;
clmod(ebi('nsort'), 'on', ENATSORT);
try {
var zt = (('' + txt).trim() || 'href').split(/,+/g);
dsort = [];
@ -4479,9 +4480,6 @@ function sortfiles(nodes) {
sopts = sopts && sopts.length ? sopts : jcp(dsort);
var collator = !clgot(ebi('nsort'), 'on') ? null :
new Intl.Collator([], {numeric: true});
try {
var is_srch = false;
if (nodes[0]['rp']) {
@ -4533,8 +4531,9 @@ function sortfiles(nodes) {
}
if (v2 === undefined) return 1 * rev;
var ret = rev * (typ == 'int' ? (v1 - v2) : collator ?
collator.compare(v1, v2) : v1.localeCompare(v2));
var ret = rev * (typ == 'int' ? (v1 - v2) :
ENATSORT ? NATSORT.compare(v1, v2) :
v1.localeCompare(v2));
if (ret === 0)
ret = onodes.indexOf(n1) - onodes.indexOf(n2);
@ -7271,6 +7270,7 @@ var treectl = (function () {
treesz = clamp(icfg_get('treesz', 16), 10, 50);
var resort = function () {
ENATSORT = NATSORT && clgot(ebi('nsort'), 'on');
treectl.gentab(get_evpath(), treectl.lsc);
};
bcfg_bind(r, 'ireadme', 'ireadme', true);
@ -8143,9 +8143,16 @@ var treectl = (function () {
}
delete res['a'];
var keys = Object.keys(res);
keys.sort(function (a, b) { return a.localeCompare(b); });
for (var a = 0; a < keys.length; a++)
keys[a] = [uricom_dec(keys[a]), keys[a]];
if (ENATSORT)
keys.sort(function (a, b) { return NATSORT.compare(a[0], b[0]); });
else
keys.sort(function (a, b) { return a[0].localeCompare(b[0]); });
for (var a = 0; a < keys.length; a++) {
var kk = keys[a],
var kk = keys[a][1],
m = /(\?k=[^\n]+)/.exec(kk),
kdk = m ? m[1] : '',
ks = kk.replace(kdk, '').slice(1),

View file

@ -461,6 +461,13 @@ function namesan(txt, win, fslash) {
}
var NATSORT, ENATSORT;
try {
NATSORT = new Intl.Collator([], {numeric: true});
}
catch (ex) { }
var crctab = (function () {
var c, tab = [];
for (var n = 0; n < 256; n++) {
@ -614,6 +621,33 @@ function showsort(tab) {
}
}
}
function st_cmp_num(a, b) {
a = a[0];
b = b[0];
return (
a === null ? -1 :
b === null ? 1 :
(a - b)
);
}
function st_cmp_nat(a, b) {
a = a[0];
b = b[0];
return (
a === null ? -1 :
b === null ? 1 :
NATSORT.compare(a, b)
);
}
function st_cmp_gen(a, b) {
a = a[0];
b = b[0];
return (
a === null ? -1 :
b === null ? 1 :
a.localeCompare(b)
);
}
function sortTable(table, col, cb) {
var tb = table.tBodies[0],
th = table.tHead.rows[0].cells,
@ -659,19 +693,17 @@ function sortTable(table, col, cb) {
}
vl.push([v, a]);
}
vl.sort(function (a, b) {
a = a[0];
b = b[0];
if (a === null)
return -1;
if (b === null)
return 1;
if (stype == 'int') {
return reverse * (a - b);
}
return reverse * (a.localeCompare(b));
});
if (stype == 'int')
vl.sort(st_cmp_num);
else if (ENATSORT)
vl.sort(st_cmp_nat);
else
vl.sort(st_cmp_gen);
if (reverse < 0)
vl.reverse();
if (sread('dir1st') !== '0') {
var r1 = [], r2 = [];
for (var i = 0; i < tr.length; i++) {