Skip to content

Commit b0bed43

Browse files
Merge pull request Expensify#90305 from Expensify/rory/renderhtml-regex-perf
perf(RenderHTML): reduce HTML post-processing from 6 passes to 3
2 parents f6294a9 + ee0a5da commit b0bed43

1 file changed

Lines changed: 10 additions & 6 deletions

File tree

src/components/RenderHTML.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ import ULRenderer from './HTMLEngineProvider/HTMLRenderers/ULRenderer';
1010

1111
type LinkPressHandler = NonNullable<RenderersProps['a']>['onPress'];
1212

13+
// Matches &amp;#91; (→ "[") and &amp;#93; (→ "]"). Index 7 is the distinguishing digit ('1' vs '3').
14+
const RE_BRACKET_ESCAPE = /&amp;#9[13];/g;
15+
// Matches consecutive duplicate <emoji> or </emoji> tags, keeping only the outermost one.
16+
const RE_EMOJI_OPEN_OR_CLOSE = /(<emoji[^>]*>)(?:<emoji[^>]*>)+|(<\/emoji[^>]*>)(?:<\/emoji[^>]*>)+/g;
17+
// Strips orphaned <br/> tags inside <ul> that would render as extra empty bullets.
18+
const RE_BR_CLEANUP = /<br\s*\/?>\s*(<\/ul>)|(<\/li>)\s*<br\s*\/?>\s*(?=<(?:li|\/ul)>)/gi;
19+
1320
type RenderHTMLProps = {
1421
/** HTML string to render */
1522
html: string;
@@ -36,14 +43,11 @@ function RenderHTML({html: htmlParam, onLinkPress, isSelectable}: RenderHTMLProp
3643
return (
3744
Parser.replace(htmlParam, {shouldEscapeText: false, filterRules: ['emoji']})
3845
// Escape brackets when pasting a link, since unescaped [] can break Markdown link syntax
39-
.replaceAll('&amp;#91;', '[')
40-
.replaceAll('&amp;#93;', ']')
46+
.replaceAll(RE_BRACKET_ESCAPE, (m) => (m.at(7) === '1' ? '[' : ']'))
4147
// Remove double <emoji> tag if exists and keep the outermost tag (always the original tag).
42-
.replaceAll(/(<emoji[^>]*>)(?:<emoji[^>]*>)+/g, '$1')
43-
.replaceAll(/(<\/emoji[^>]*>)(?:<\/emoji[^>]*>)+/g, '$1')
48+
.replaceAll(RE_EMOJI_OPEN_OR_CLOSE, '$1$2')
4449
// Strip orphaned <br/> tags inside <ul> that would render as extra empty bullets
45-
.replaceAll(/<br\s*\/?>\s*(<\/ul>)/gi, '$1')
46-
.replaceAll(/(<\/li>)\s*<br\s*\/?>\s*(?=<(?:li|\/ul)>)/gi, '$1')
50+
.replaceAll(RE_BR_CLEANUP, '$1$2')
4751
);
4852
}, [htmlParam]);
4953

0 commit comments

Comments
 (0)