Skip to content

Commit e28642d

Browse files
authored
Merge pull request #904 from Expensify/jsenyitko-optimize-expensimark-replace
2 parents 847d242 + f7c8e56 commit e28642d

1 file changed

Lines changed: 20 additions & 2 deletions

File tree

lib/ExpensiMark.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type CommonRule = {
4646
rawInputReplacement?: Replacement;
4747
pre?: (input: string) => string;
4848
post?: (input: string) => string;
49+
shouldSkipProcessing?: (textToCheck: string) => boolean;
4950
};
5051

5152
type RuleWithRegex = CommonRule & {
@@ -75,7 +76,6 @@ type TruncateOptions = {
7576

7677
const MARKDOWN_LINK_REGEX = new RegExp(`\\[((?:[^\\[\\]\\r\\n]*(?:\\[[^\\[\\]\\r\\n]*][^\\[\\]\\r\\n]*)*))]\\(${UrlPatterns.MARKDOWN_URL_REGEX}\\)(?![^<]*(<\\/pre>|<\\/code>))`, 'gi');
7778
const MARKDOWN_IMAGE_REGEX = new RegExp(`\\!(?:\\[([^\\][]*(?:\\[[^\\][]*][^\\][]*)*)])?\\(${UrlPatterns.MARKDOWN_URL_REGEX}\\)(?![^<]*(<\\/pre>|<\\/code>))`, 'gi');
78-
7979
const MARKDOWN_VIDEO_REGEX = new RegExp(
8080
`\\!(?:\\[([^\\][]*(?:\\[[^\\][]*][^\\][]*)*)])?\\(((${UrlPatterns.MARKDOWN_URL_REGEX})\\.(?:${Constants.CONST.VIDEO_EXTENSIONS.join('|')}))\\)(?![^<]*(<\\/pre>|<\\/code>))`,
8181
'gi',
@@ -213,6 +213,11 @@ export default class ExpensiMark {
213213
const extraAttrs = attrCache && attrCache[videoSource];
214214
return `<video data-expensify-source="${Str.sanitizeURL(videoSource)}" data-raw-href="${videoSource}" data-link-variant="${typeof videoName === 'string' ? 'labeled' : 'auto'}" ${extraAttrs || ''}>${videoName ? `${videoName}` : ''}</video>`;
215215
},
216+
shouldSkipProcessing: (textToCheck) => {
217+
const missingSpecialCharacters = !textToCheck.includes('!') || !textToCheck.includes('(') || !textToCheck.includes(')');
218+
const missingVideoExtension = !Constants.CONST.VIDEO_EXTENSIONS.some((extension) => textToCheck.includes(`.${extension}`));
219+
return missingSpecialCharacters || missingVideoExtension;
220+
},
216221
},
217222

218223
/**
@@ -299,6 +304,9 @@ export default class ExpensiMark {
299304
const extraAttrs = attrCache && attrCache[imgSource];
300305
return `<img src="${Str.sanitizeURL(imgSource)}"${imgAlt ? ` alt="${this.escapeAttributeContent(imgAlt)}"` : ''} data-raw-href="${imgSource}" data-link-variant="${typeof imgAlt === 'string' ? 'labeled' : 'auto'}" ${extraAttrs || ''}/>`;
301306
},
307+
shouldSkipProcessing: (textToCheck) => {
308+
return !textToCheck.includes('!') || !textToCheck.includes('(') || !textToCheck.includes(')');
309+
},
302310
},
303311

304312
/**
@@ -321,6 +329,9 @@ export default class ExpensiMark {
321329
}
322330
return `<a href="${Str.sanitizeURL(g2)}" data-raw-href="${g2}" data-link-variant="labeled" target="_blank" rel="noreferrer noopener">${g1}</a>`;
323331
},
332+
shouldSkipProcessing: (textToCheck) => {
333+
return !textToCheck.includes('.');
334+
},
324335
},
325336

326337
/**
@@ -349,7 +360,6 @@ export default class ExpensiMark {
349360
*/
350361
{
351362
name: 'reportMentions',
352-
353363
regex: /(?<=^[*~_:]?|[ \n][*~_:]?|[:#])(#[\p{Ll}0-9-]{1,99})(?![^<]*(?:<\/pre>|<\/code>|<\/a>))/gimu,
354364
replacement: '<mention-report>$1</mention-report>',
355365
},
@@ -416,6 +426,9 @@ export default class ExpensiMark {
416426
const href = Str.sanitizeURL(g2);
417427
return `${g1}<a href="${href}" data-raw-href="${g2}" data-link-variant="auto" target="_blank" rel="noreferrer noopener">${g2}</a>${g1}`;
418428
},
429+
shouldSkipProcessing: (textToCheck) => {
430+
return !textToCheck.includes('.');
431+
},
419432
},
420433

421434
{
@@ -964,6 +977,11 @@ export default class ExpensiMark {
964977
if (rule.pre) {
965978
replacedText = rule.pre(replacedText);
966979
}
980+
981+
if (rule.shouldSkipProcessing && rule.shouldSkipProcessing(replacedText)) {
982+
return;
983+
}
984+
967985
const replacement = shouldKeepRawInput && rule.rawInputReplacement ? rule.rawInputReplacement : rule.replacement;
968986
if ('process' in rule) {
969987
replacedText = rule.process(replacedText, replacement, shouldKeepRawInput);

0 commit comments

Comments
 (0)