From af38ad86b62f16897cfd03a447c620b2baff410a Mon Sep 17 00:00:00 2001 From: Alison Woodman Date: Tue, 20 Mar 2018 15:13:43 +0000 Subject: [PATCH 1/2] fix overlapping styles bug --- src/draftjsToMd.js | 8 +++++++- test/draftjsToMd.test.js | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/draftjsToMd.js b/src/draftjsToMd.js index 8f3d1cb..24d32d3 100644 --- a/src/draftjsToMd.js +++ b/src/draftjsToMd.js @@ -97,6 +97,10 @@ function fixWhitespacesInsideStyle(text, style) { `${prefix}${symbol}${bodyTrimmed}${symbol}${postfix}`); } +function getInlineStyleRangesByLength(inlineStyleRanges) { + return [...inlineStyleRanges].sort((a, b) => b.length - a.length); +} + function draftjsToMd(raw, extraMarkdownDict) { const markdownDict = { ...defaultMarkdownDict, ...extraMarkdownDict }; let returnString = ''; @@ -119,8 +123,10 @@ function draftjsToMd(raw, extraMarkdownDict) { returnString += block.text.split('').reduce((text, currentChar, index) => { let newText = text; + const sortedInlineStyleRanges = getInlineStyleRangesByLength(block.inlineStyleRanges); + // find all styled at this character - const stylesStartAtChar = block.inlineStyleRanges + const stylesStartAtChar = sortedInlineStyleRanges .filter(range => range.offset === index) .filter(range => markdownDict[range.style]); // disregard styles not defined in the md dict diff --git a/test/draftjsToMd.test.js b/test/draftjsToMd.test.js index 0607933..b1a7ea6 100644 --- a/test/draftjsToMd.test.js +++ b/test/draftjsToMd.test.js @@ -122,6 +122,31 @@ describe('draftjsToMd', () => { draftjsToMd(raw).should.equal(expectedMarkdown); }); + it('converts overlapping styles correctly, regardless of whether the "longer" one is first', () => { + const raw = { + blocks: [{ + text: 'I start with italic bold and end with only bold.', + type: 'unstyled', + depth: 0, + inlineStyleRanges: [ + { + offset: 0, + length: 24, + style: 'ITALIC' + }, + { + offset: 0, + length: 48, + style: 'BOLD' + }, + ], + entityRanges: [] + }] + }; + const expectedMarkdown = '__*I start with italic bold* and end with only bold.__'; + draftjsToMd(raw).should.equal(expectedMarkdown); + }); + it('converts the last word correctly if it is styled', () => { const raw = { blocks: [{ From 5ba159facb63a14e85536c9441120d37e8d50738 Mon Sep 17 00:00:00 2001 From: Alison Woodman Date: Tue, 20 Mar 2018 17:54:15 +0000 Subject: [PATCH 2/2] shorten test name for linting --- test/draftjsToMd.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/draftjsToMd.test.js b/test/draftjsToMd.test.js index b1a7ea6..01bb77e 100644 --- a/test/draftjsToMd.test.js +++ b/test/draftjsToMd.test.js @@ -122,7 +122,7 @@ describe('draftjsToMd', () => { draftjsToMd(raw).should.equal(expectedMarkdown); }); - it('converts overlapping styles correctly, regardless of whether the "longer" one is first', () => { + it('converts overlapping styles correctly, whether or not the "longer" one is first', () => { const raw = { blocks: [{ text: 'I start with italic bold and end with only bold.',