From 4b2c5a437c38da7a9d0d788783decedb65166693 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Fri, 9 Apr 2021 07:05:55 +0530 Subject: [PATCH 1/6] fix ending bracket problem --- __tests__/ExpensiMark-test.js | 11 +++++++++++ lib/ExpensiMark.js | 25 +++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/__tests__/ExpensiMark-test.js b/__tests__/ExpensiMark-test.js index f2207aa0..d32c301c 100644 --- a/__tests__/ExpensiMark-test.js +++ b/__tests__/ExpensiMark-test.js @@ -283,3 +283,14 @@ test('Test general email link with various styles', () => { expect(parser.replace(testString)).toBe(resultString); }); + +test('Test link with brackets', () => { + const testString = '[google](http://google.com/(something)?after=parens) ' + + '([google](http://google.com/(something)?after=parens)) ' + + '([google](https://google.com/)) '; + + const resultString = 'google ' + + '(google) ' + + '(google) '; + expect(parser.replace(testString)).toBe(resultString); +}); diff --git a/lib/ExpensiMark.js b/lib/ExpensiMark.js index fb9d23f1..76da811a 100644 --- a/lib/ExpensiMark.js +++ b/lib/ExpensiMark.js @@ -80,7 +80,7 @@ export default class ExpensiMark { `\\[((?:[\\w\\s\\d!?&#;:\\/\\-\\.\\+=<>,@\\[\\]]|(?:.+<\\/code>))+)\\]\\(${URL_REGEX}\\)(?![^<]*(<\\/pre>|<\\/code>))`, 'gi' ); - return this.modifyTextForUrlLinks(regex, textToProcess, replacement); + return this.modifyTextForUrlLinks('link',regex, textToProcess, replacement); }, // We use a function here to check if there is already a https:// on the link. @@ -97,7 +97,7 @@ export default class ExpensiMark { `(?![^<]*>|[^<>]*<\\/)([_*~]*?)${URL_REGEX}\\1(?![^<]*(<\\/pre>|<\\/code>))`, 'gi' ); - return this.modifyTextForUrlLinks(regex, textToProcess, replacement); + return this.modifyTextForUrlLinks('autolink', regex, textToProcess, replacement); }, // We use a function here to check if there is already a https:// on the link. @@ -190,7 +190,7 @@ export default class ExpensiMark { * * @returns {String} */ - modifyTextForUrlLinks(regex, textToCheck, replacement) { + modifyTextForUrlLinks(type, regex, textToCheck, replacement) { let match = regex.exec(textToCheck); let replacedText = ''; let startIndex = 0; @@ -207,7 +207,24 @@ export default class ExpensiMark { match[0] = match[0].substr(0, match[0].length - 1); match[2] = match[2].substr(0, match[2].length - 1); } - + if(type === 'link'){ + // remove extra brace + let brace = 0; + if (match[2][match[2].length - 1] === ')') { + for (let i = 0; i < match[2].length; i++) { + if (match[2][i] === '(') { + brace++; + } + if (match[2][i] === ')') { + brace--; + } + } + if (brace) { + match[0] = match[0].substr(0, match[0].length - 1); + match[2] = match[2].substr(0, match[2].length - 1); + } + } + } replacedText = replacedText.concat(textToCheck.substr(startIndex, (match.index - startIndex))); if (abort) { From 4039852474d4ec6a2783975234652f4bee2a6492 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Sat, 10 Apr 2021 02:46:40 +0530 Subject: [PATCH 2/6] fix: url with brackets & added more tests --- __tests__/ExpensiMark-test.js | 14 +++++++++++--- lib/ExpensiMark.js | 32 +++++++++++++++----------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/__tests__/ExpensiMark-test.js b/__tests__/ExpensiMark-test.js index d32c301c..218e7f94 100644 --- a/__tests__/ExpensiMark-test.js +++ b/__tests__/ExpensiMark-test.js @@ -189,7 +189,7 @@ test('Test url replacements', () => { + 'testRareTLDs.beer ' + 'test@expensify.com ' + 'test.completelyFakeTLD ' - + 'https://www.expensify.com/_devportal/tools/logSearch/#query=request_id:(%22Ufjjim%22)+AND+timestamp:[2021-01-08T03:48:10.389Z+TO+2021-01-08T05:48:10.389Z]&index=logs_expensify-008878) ' + + 'https://www.expensify.com/_devportal/tools/logSearch/#query=request_id:(%22Ufjjim%22)+AND+timestamp:[2021-01-08T03:48:10.389Z+TO+2021-01-08T05:48:10.389Z]&index=logs_expensify-008878) ' + 'http://necolas.github.io/react-native-web/docs/?path=/docs/components-pressable--disabled ' + 'https://github.com/Expensify/Expensify.cash/issues/123#:~:text=Please%20work/Expensify.cash ' + 'https://github.com/Expensify/Expensify.cash/issues/123#:~:text=Please%20work/Expensify.cash ' @@ -287,10 +287,18 @@ test('Test general email link with various styles', () => { test('Test link with brackets', () => { const testString = '[google](http://google.com/(something)?after=parens) ' + '([google](http://google.com/(something)?after=parens)) ' - + '([google](https://google.com/)) '; + + '([google](https://google.com/)) ' + + '([google](http://google.com/(something)?after=parens)))) ' + + '(http://foo.com/(something)?after=parens) ' + + '(((http://foo.com/(something)?after=parens))) ' + + 'http://foo.com/(something)?after=parens))) '; const resultString = 'google ' + '(google) ' - + '(google) '; + + '(google) ' + + '(google))) ' + + '(http://foo.com/(something)?after=parens) ' + + '(((http://foo.com/(something)?after=parens))) ' + + 'http://foo.com/(something)?after=parens))) '; expect(parser.replace(testString)).toBe(resultString); }); diff --git a/lib/ExpensiMark.js b/lib/ExpensiMark.js index 76da811a..9d26fecb 100644 --- a/lib/ExpensiMark.js +++ b/lib/ExpensiMark.js @@ -80,7 +80,7 @@ export default class ExpensiMark { `\\[((?:[\\w\\s\\d!?&#;:\\/\\-\\.\\+=<>,@\\[\\]]|(?:.+<\\/code>))+)\\]\\(${URL_REGEX}\\)(?![^<]*(<\\/pre>|<\\/code>))`, 'gi' ); - return this.modifyTextForUrlLinks('link',regex, textToProcess, replacement); + return this.modifyTextForUrlLinks(regex, textToProcess, replacement); }, // We use a function here to check if there is already a https:// on the link. @@ -97,7 +97,7 @@ export default class ExpensiMark { `(?![^<]*>|[^<>]*<\\/)([_*~]*?)${URL_REGEX}\\1(?![^<]*(<\\/pre>|<\\/code>))`, 'gi' ); - return this.modifyTextForUrlLinks('autolink', regex, textToProcess, replacement); + return this.modifyTextForUrlLinks(regex, textToProcess, replacement); }, // We use a function here to check if there is already a https:// on the link. @@ -190,7 +190,7 @@ export default class ExpensiMark { * * @returns {String} */ - modifyTextForUrlLinks(type, regex, textToCheck, replacement) { + modifyTextForUrlLinks(regex, textToCheck, replacement) { let match = regex.exec(textToCheck); let replacedText = ''; let startIndex = 0; @@ -207,23 +207,21 @@ export default class ExpensiMark { match[0] = match[0].substr(0, match[0].length - 1); match[2] = match[2].substr(0, match[2].length - 1); } - if(type === 'link'){ - // remove extra brace - let brace = 0; - if (match[2][match[2].length - 1] === ')') { - for (let i = 0; i < match[2].length; i++) { - if (match[2][i] === '(') { - brace++; - } - if (match[2][i] === ')') { - brace--; - } + // remove extra brace + let brace = 0; + if (match[2][match[2].length - 1] === ')') { + for (let i = 0; i < match[2].length; i++) { + if (match[2][i] === '(') { + brace++; } - if (brace) { - match[0] = match[0].substr(0, match[0].length - 1); - match[2] = match[2].substr(0, match[2].length - 1); + if (match[2][i] === ')') { + brace--; } } + if (brace) { + match[0] = match[0].substr(0, match[0].length + brace); + match[2] = match[2].substr(0, match[2].length + brace); + } } replacedText = replacedText.concat(textToCheck.substr(startIndex, (match.index - startIndex))); From 6aca4ccae9df157ef1d192347286cac22622b715 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Sun, 11 Apr 2021 23:28:18 +0530 Subject: [PATCH 3/6] new: more tests added for expensiMark --- __tests__/ExpensiMark-test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/__tests__/ExpensiMark-test.js b/__tests__/ExpensiMark-test.js index 218e7f94..84d80dad 100644 --- a/__tests__/ExpensiMark-test.js +++ b/__tests__/ExpensiMark-test.js @@ -289,7 +289,9 @@ test('Test link with brackets', () => { + '([google](http://google.com/(something)?after=parens)) ' + '([google](https://google.com/)) ' + '([google](http://google.com/(something)?after=parens)))) ' + + '((([google](http://google.com/(something)?after=parens) ' + '(http://foo.com/(something)?after=parens) ' + + '(((http://foo.com/(something)?after=parens ' + '(((http://foo.com/(something)?after=parens))) ' + 'http://foo.com/(something)?after=parens))) '; @@ -297,7 +299,9 @@ test('Test link with brackets', () => { + '(google) ' + '(google) ' + '(google))) ' + + '(((google ' + '(http://foo.com/(something)?after=parens) ' + + '(((http://foo.com/(something)?after=parens ' + '(((http://foo.com/(something)?after=parens))) ' + 'http://foo.com/(something)?after=parens))) '; expect(parser.replace(testString)).toBe(resultString); From f7483301de8d0f017e7613f203561f592ff4bf7a Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Sun, 11 Apr 2021 23:43:30 +0530 Subject: [PATCH 4/6] fix lint issue --- lib/ExpensiMark.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ExpensiMark.js b/lib/ExpensiMark.js index 9d26fecb..91d5a6d5 100644 --- a/lib/ExpensiMark.js +++ b/lib/ExpensiMark.js @@ -207,7 +207,8 @@ export default class ExpensiMark { match[0] = match[0].substr(0, match[0].length - 1); match[2] = match[2].substr(0, match[2].length - 1); } - // remove extra brace + + // remove extra ) parentheses let brace = 0; if (match[2][match[2].length - 1] === ')') { for (let i = 0; i < match[2].length; i++) { From 6a9d250b546b11f13cdd5db94acb0261a012ed40 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Mon, 12 Apr 2021 18:08:02 +0530 Subject: [PATCH 5/6] Update __tests__/ExpensiMark-test.js Co-authored-by: Alex Beaman --- __tests__/ExpensiMark-test.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/__tests__/ExpensiMark-test.js b/__tests__/ExpensiMark-test.js index 84d80dad..ad62433c 100644 --- a/__tests__/ExpensiMark-test.js +++ b/__tests__/ExpensiMark-test.js @@ -296,13 +296,14 @@ test('Test link with brackets', () => { + 'http://foo.com/(something)?after=parens))) '; const resultString = 'google ' - + '(google) ' - + '(google) ' - + '(google))) ' - + '(((google ' - + '(http://foo.com/(something)?after=parens) ' - + '(((http://foo.com/(something)?after=parens ' - + '(((http://foo.com/(something)?after=parens))) ' - + 'http://foo.com/(something)?after=parens))) '; + + '(google) ' + + '(google) ' + + '(google))) ' + + '(((google ' + + '(http://foo.com/(something)?after=parens) ' + + '(((http://foo.com/(something)?after=parens ' + + '(((http://foo.com/(something)?after=parens))) ' + + 'http://foo.com/(something)?after=parens))) '; + expect(parser.replace(testString)).toBe(resultString); }); From dfe547cac0f1f43ba69fcbbe6c8ddb70f8c0b22d Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Mon, 12 Apr 2021 18:12:19 +0530 Subject: [PATCH 6/6] Update ExpensiMark test --- __tests__/ExpensiMark-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/__tests__/ExpensiMark-test.js b/__tests__/ExpensiMark-test.js index ad62433c..4eeea5fb 100644 --- a/__tests__/ExpensiMark-test.js +++ b/__tests__/ExpensiMark-test.js @@ -284,7 +284,7 @@ test('Test general email link with various styles', () => { expect(parser.replace(testString)).toBe(resultString); }); -test('Test link with brackets', () => { +test('Test markdown and url links with inconsistent starting and closing parens', () => { const testString = '[google](http://google.com/(something)?after=parens) ' + '([google](http://google.com/(something)?after=parens)) ' + '([google](https://google.com/)) ' @@ -304,6 +304,6 @@ test('Test link with brackets', () => { + '(((http://foo.com/(something)?after=parens ' + '(((http://foo.com/(something)?after=parens))) ' + 'http://foo.com/(something)?after=parens))) '; - + expect(parser.replace(testString)).toBe(resultString); });