From 64948175273cf74ccbf896109d3f6380d1ec63de Mon Sep 17 00:00:00 2001 From: Pranshu Chittora Date: Sat, 29 May 2021 20:11:37 +0530 Subject: [PATCH 1/3] feat: HTML to markdown parser --- __tests__/ExpensiMark-test.js | 21 ++++++++++++++++++++ lib/ExpensiMark.js | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/__tests__/ExpensiMark-test.js b/__tests__/ExpensiMark-test.js index e4bffea3..78f97aa0 100644 --- a/__tests__/ExpensiMark-test.js +++ b/__tests__/ExpensiMark-test.js @@ -338,3 +338,24 @@ test('Test markdown and url links with inconsistent starting and closing parens' expect(parser.replace(testString)).toBe(resultString); }); + +test('Test HTML string with
tags to markdown ', () => { + const testString = 'Hello
World,
Welcome
To
Expensify'; + const resultString = 'Hello\nWorld,\nWelcome\nTo\nExpensify'; + + expect(parser.htmlToMarkdown(testString)).toBe(resultString); +}); + +test('Test HTML string with inconsistent
closing tags to markdown ', () => { + const testString = 'Hello
World,
Welcome
To
Expensify'; + const resultString = 'Hello\nWorld,\nWelcome\nTo\nExpensify'; + + expect(parser.htmlToMarkdown(testString)).toBe(resultString); +}); + +test('Test HTML string with seperate closing tags (

) to markdown ', () => { + const testString = 'Hello
World,

Welcome
To
Expensify'; + const resultString = 'Hello\nWorld,\nWelcome\nTo\nExpensify'; + + expect(parser.htmlToMarkdown(testString)).toBe(resultString); +}); diff --git a/lib/ExpensiMark.js b/lib/ExpensiMark.js index 78d1ff7c..297912bd 100644 --- a/lib/ExpensiMark.js +++ b/lib/ExpensiMark.js @@ -157,6 +157,23 @@ export default class ExpensiMark { replacement: '
', }, ]; + + /** + * The list of regex replacements to do on a HTML comment for converting it to markdown. + * + * @type {Object[]} + */ + this.htmlToMarkdownRules = [ + { + name: 'newline', + + // Replaces open and closing

tags with a single
+ pre: inputString => inputString.replace('

', '
'), + regex: //gi, + replacement: '\n' + }, + + ]; } /** @@ -250,4 +267,23 @@ export default class ExpensiMark { return replacedText; } + + /** + * Replaces html with elements + * + * @param {String} htmlString + * + * @returns {String} + */ + htmlToMarkdown(htmlString) { + let generatedMarkdown = htmlString; + this.htmlToMarkdownRules.forEach((rule) => { + // Pre-processes input HTML before applying regex + if (rule.pre) { + generatedMarkdown = rule.pre(generatedMarkdown); + } + generatedMarkdown = generatedMarkdown.replace(rule.regex, rule.replacement); + }); + return generatedMarkdown; + } } From 265e00efa79ddd6d8426828754213b09447f8721 Mon Sep 17 00:00:00 2001 From: Pranshu Chittora Date: Wed, 2 Jun 2021 22:11:36 +0530 Subject: [PATCH 2/3] fix: Eslint fixes --- lib/ExpensiMark.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ExpensiMark.js b/lib/ExpensiMark.js index 297912bd..4444075f 100644 --- a/lib/ExpensiMark.js +++ b/lib/ExpensiMark.js @@ -169,7 +169,7 @@ export default class ExpensiMark { // Replaces open and closing

tags with a single
pre: inputString => inputString.replace('

', '
'), - regex: //gi, + regex: //gi, replacement: '\n' }, From e7e70d0bcb987e4928b7087e8cd3347bb0dce932 Mon Sep 17 00:00:00 2001 From: Pranshu Chittora Date: Sat, 5 Jun 2021 20:53:53 +0530 Subject: [PATCH 3/3] fix: PR review fixes --- __tests__/ExpensiMark-test.js | 6 ++++++ lib/ExpensiMark.js | 7 +++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/__tests__/ExpensiMark-test.js b/__tests__/ExpensiMark-test.js index 78f97aa0..af3a7740 100644 --- a/__tests__/ExpensiMark-test.js +++ b/__tests__/ExpensiMark-test.js @@ -359,3 +359,9 @@ test('Test HTML string with seperate closing tags (

) to markdown ', () expect(parser.htmlToMarkdown(testString)).toBe(resultString); }); + +test('Test HTML string with seperate closing tags (

) to markdown ', () => { + const testString = 'Hello
World,

Welcome
To
Expensify'; + const resultString = 'Hello\nWorld,\nWelcome\nTo\nExpensify'; + expect(parser.htmlToMarkdown(testString)).toBe(resultString); +}); diff --git a/lib/ExpensiMark.js b/lib/ExpensiMark.js index 4444075f..1382d543 100644 --- a/lib/ExpensiMark.js +++ b/lib/ExpensiMark.js @@ -168,11 +168,10 @@ export default class ExpensiMark { name: 'newline', // Replaces open and closing

tags with a single
- pre: inputString => inputString.replace('

', '
'), - regex: //gi, + pre: inputString => inputString.replace('

', '
').replace('

', '
'), + regex: //gi, replacement: '\n' }, - ]; } @@ -269,7 +268,7 @@ export default class ExpensiMark { } /** - * Replaces html with elements + * Replaces HTML with markdown * * @param {String} htmlString *