diff --git a/gui/default/syncthing/core/uncamelFilter.js b/gui/default/syncthing/core/uncamelFilter.js index 269a42e90..97689f140 100644 --- a/gui/default/syncthing/core/uncamelFilter.js +++ b/gui/default/syncthing/core/uncamelFilter.js @@ -1,27 +1,39 @@ angular.module('syncthing.core') .filter('uncamel', function () { + const reservedStrings = [ + 'IDs', 'ID', // substrings must come AFTER longer keywords containing them + 'URL', 'UR', + 'API', 'QUIC', 'TCP', 'UDP', 'NAT', 'LAN', 'WAN', + 'KiB', 'MiB', 'GiB', 'TiB' + ]; return function (input) { - input = input.replace(/(.)([A-Z][a-z]+)/g, '$1 $2').replace(/([a-z0-9])([A-Z])/g, '$1 $2'); - var parts = input.split(' '); - var lastPart = parts.splice(-1)[0]; + if (!input || typeof input !== 'string') return ''; + const placeholders = {}; + let counter = 0; + reservedStrings.forEach(word => { + const placeholder = `__RSV${counter}__`; + const re = new RegExp(word, 'g'); + input = input.replace(re, placeholder); + placeholders[placeholder] = word; + counter++; + }); + input = input.replace(/([a-z0-9])([A-Z])/g, '$1 $2'); + Object.entries(placeholders).forEach(([ph, word]) => { + input = input.replace(new RegExp(ph, 'g'), ` ${word} `); + }); + let parts = input.split(' '); + const lastPart = parts.pop(); switch (lastPart) { - case "S": - parts.push('(seconds)'); - break; - case "M": - parts.push('(minutes)'); - break; - case "H": - parts.push('(hours)'); - break; - case "Ms": - parts.push('(milliseconds)'); - break; - default: - parts.push(lastPart); - break; + case 'S': parts.push('(seconds)'); break; + case 'M': parts.push('(minutes)'); break; + case 'H': parts.push('(hours)'); break; + case 'Ms': parts.push('(milliseconds)'); break; + default: parts.push(lastPart); break; } - input = parts.join(' '); - return input.charAt(0).toUpperCase() + input.slice(1); + parts = parts.map(part => { + const match = reservedStrings.find(w => w.toUpperCase() === part.toUpperCase()); + return match || part.charAt(0).toUpperCase() + part.slice(1); + }); + return parts.join(' ').replace(/\s+/g, ' ').trim(); }; });