perf(ui): Optimizations in regular expressions to highlight search matches

This commit is contained in:
Linus Lee
2021-07-25 23:46:18 -04:00
parent ef29031e02
commit 5b910b3c2c
3 changed files with 10 additions and 7 deletions

View File

@@ -18,12 +18,13 @@ escapeHTML := s => (
EscapeContainer.innerHTML
)
escapeRegExp := s => (
re := jsnew(RegExp, [str('[-\/\\^$*+?.()|[\]{}]'), str('g')])
bind(s, 'replace')(re, '\\$&')
)
EscapeRE := jsnew(RegExp, [str('[-\/\\^$*+?.()|[\]{}]'), str('g')])
escapeRegExp := s => bind(str(s), 'replace')(EscapeRE, '\\$&')
` TODO: explain why this is needed `
` Ink standard library's std.slice is O(n), which is normally fine because our
constant multiplier is pretty small. But when we're doing it for lots of long
strings as is the case here, we want to get down to native implementations in
the underlying JavaScript engine. `
fastSlice := (s, start, end) => bind(str(s), 'substring')(start, end)
clippedResultsCount := () => (

View File

@@ -560,7 +560,8 @@ Newline = char(10);
querySelector = bind(document, __Ink_String(`querySelector`));
EscapeContainer = bind(document, __Ink_String(`createElement`))(__Ink_String(`div`));
escapeHTML = s => (() => { (() => {let __ink_assgn_trgt = __as_ink_string(EscapeContainer); __is_ink_string(__ink_assgn_trgt) ? __ink_assgn_trgt.assign(textContent, s) : (__ink_assgn_trgt.textContent) = s; return __ink_assgn_trgt})(); return (() => {let __ink_acc_trgt = __as_ink_string(EscapeContainer); return __is_ink_string(__ink_acc_trgt) ? __ink_acc_trgt.valueOf()[innerHTML] || null : (__ink_acc_trgt.innerHTML !== undefined ? __ink_acc_trgt.innerHTML : null)})() })();
escapeRegExp = s => (() => { let re; re = jsnew(RegExp, [str(__Ink_String(`[-/\\^$*+?.()|[]{}]`)), str(__Ink_String(`g`))]); return bind(s, __Ink_String(`replace`))(re, __Ink_String(`\\$&`)) })();
EscapeRE = jsnew(RegExp, [str(__Ink_String(`[-/\\^$*+?.()|[]{}]`)), str(__Ink_String(`g`))]);
escapeRegExp = s => bind(str(s), __Ink_String(`replace`))(EscapeRE, __Ink_String(`\\$&`));
fastSlice = (s, start, end) => bind(str(s), __Ink_String(`substring`))(start, end);
clippedResultsCount = () => (() => { let ResultHeight; ResultHeight = 32; return floor(((() => { return ((() => {let __ink_acc_trgt = __as_ink_string(window); return __is_ink_string(__ink_acc_trgt) ? __ink_acc_trgt.valueOf()[innerHeight] || null : (__ink_acc_trgt.innerHeight !== undefined ? __ink_acc_trgt.innerHeight : null)})() - 96) })() / ResultHeight)) })();
zeroFillTo3Digits = s => __ink_match(len(s), [[() => (0), () => (__Ink_String(`000`))], [() => (1), () => (__as_ink_string(__Ink_String(`00`) + s))], [() => (2), () => (__as_ink_string(__Ink_String(`0`) + s))], [() => (__Ink_Empty), () => (s)]]);

View File

@@ -12,7 +12,8 @@ Newline = char(10);
querySelector = bind(document, __Ink_String(`querySelector`));
EscapeContainer = bind(document, __Ink_String(`createElement`))(__Ink_String(`div`));
escapeHTML = s => (() => { (() => {let __ink_assgn_trgt = __as_ink_string(EscapeContainer); __is_ink_string(__ink_assgn_trgt) ? __ink_assgn_trgt.assign(textContent, s) : (__ink_assgn_trgt.textContent) = s; return __ink_assgn_trgt})(); return (() => {let __ink_acc_trgt = __as_ink_string(EscapeContainer); return __is_ink_string(__ink_acc_trgt) ? __ink_acc_trgt.valueOf()[innerHTML] || null : (__ink_acc_trgt.innerHTML !== undefined ? __ink_acc_trgt.innerHTML : null)})() })();
escapeRegExp = s => (() => { let re; re = jsnew(RegExp, [str(__Ink_String(`[-/\\^$*+?.()|[]{}]`)), str(__Ink_String(`g`))]); return bind(s, __Ink_String(`replace`))(re, __Ink_String(`\\$&`)) })();
EscapeRE = jsnew(RegExp, [str(__Ink_String(`[-/\\^$*+?.()|[]{}]`)), str(__Ink_String(`g`))]);
escapeRegExp = s => bind(str(s), __Ink_String(`replace`))(EscapeRE, __Ink_String(`\\$&`));
fastSlice = (s, start, end) => bind(str(s), __Ink_String(`substring`))(start, end);
clippedResultsCount = () => (() => { let ResultHeight; ResultHeight = 32; return floor(((() => { return ((() => {let __ink_acc_trgt = __as_ink_string(window); return __is_ink_string(__ink_acc_trgt) ? __ink_acc_trgt.valueOf()[innerHeight] || null : (__ink_acc_trgt.innerHeight !== undefined ? __ink_acc_trgt.innerHeight : null)})() - 96) })() / ResultHeight)) })();
zeroFillTo3Digits = s => __ink_match(len(s), [[() => (0), () => (__Ink_String(`000`))], [() => (1), () => (__as_ink_string(__Ink_String(`00`) + s))], [() => (2), () => (__as_ink_string(__Ink_String(`0`) + s))], [() => (__Ink_Empty), () => (s)]]);