diff --git a/src/Markdown.ts b/src/Markdown.ts index e24c9b72870..9f88fbe41f1 100644 --- a/src/Markdown.ts +++ b/src/Markdown.ts @@ -153,10 +153,27 @@ export default class Markdown { (node.type === 'text' && node.literal === ' ') ) { text = ''; + continue; } + + // Break up text nodes on spaces, so that we don't shoot past them without resetting if (node.type === 'text') { - text += node.literal; + const [thisPart, ...nextParts] = node.literal.split(/( )/); + node.literal = thisPart; + text += thisPart; + + // Add the remaining parts as siblings + nextParts.reverse().forEach(part => { + if (part) { + const nextNode = new commonmark.Node('text'); + nextNode.literal = part; + node.insertAfter(nextNode); + // Make the iterator aware of the newly inserted node + walker.resumeAt(nextNode, true); + } + }); } + // We should not do this if previous node was not a textnode, as we can't combine it then. if ((node.type === 'emph' || node.type === 'strong') && previousNode.type === 'text') { if (event.entering) { diff --git a/test/Markdown-test.ts b/test/Markdown-test.ts index d5f38dbb9f9..c1b4b31a298 100644 --- a/test/Markdown-test.ts +++ b/test/Markdown-test.ts @@ -157,5 +157,12 @@ describe("Markdown parser test", () => { const md = new Markdown(testString); expect(md.toHTML()).toEqual(expectedResult); }); + + it('resumes applying formatting to the rest of a message after a link', () => { + const testString = 'http://google.com/_thing_ *does* __not__ exist'; + const expectedResult = 'http://google.com/_thing_ does not exist'; + const md = new Markdown(testString); + expect(md.toHTML()).toEqual(expectedResult); + }); }); });