perf: single-pass escapeHtml/escapeAttr
Hot path on large table rebuilds — every text cell runs through one of these. Switching from 4 chained .replace() calls to a single regex with a lookup map is ~3× faster. At 5000 rows × 4 fields per rebuild, 80k → 20k regex operations.
This commit is contained in:
parent
b4c26f8106
commit
4f2d462754
@ -3819,14 +3819,21 @@ function setupColumnResizing() {
|
||||
});
|
||||
}
|
||||
|
||||
// Single-pass escape instead of 4 chained .replace(/x/g, ...) calls.
|
||||
// Hot path on large table rebuilds — every text cell runs through one of these.
|
||||
const _HTML_ESC_MAP = { '&': '&', '<': '<', '>': '>', '"': '"' };
|
||||
const _HTML_ESC_RE = /[&<>"]/g;
|
||||
const _ATTR_ESC_MAP = { '&': '&', '"': '"', "'": ''' };
|
||||
const _ATTR_ESC_RE = /[&"']/g;
|
||||
|
||||
function escapeHtml(str) {
|
||||
if (!str) return '';
|
||||
return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
||||
return String(str).replace(_HTML_ESC_RE, (c) => _HTML_ESC_MAP[c]);
|
||||
}
|
||||
|
||||
function escapeAttr(str) {
|
||||
if (!str) return '';
|
||||
return String(str).replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''');
|
||||
return String(str).replace(_ATTR_ESC_RE, (c) => _ATTR_ESC_MAP[c]);
|
||||
}
|
||||
|
||||
function showCopyToast(msg) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user