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);
+ });
});
});