diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index c162f9a8..891b8b52 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -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), diff --git a/copyparty/web/util.js b/copyparty/web/util.js index 389593b4..17fb1943 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -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++) {