diff --git a/app/assets/javascripts/discourse/lib/to-markdown.js.es6 b/app/assets/javascripts/discourse/lib/to-markdown.js.es6 index 8f81536f226..1d2f2cbe250 100644 --- a/app/assets/javascripts/discourse/lib/to-markdown.js.es6 +++ b/app/assets/javascripts/discourse/lib/to-markdown.js.es6 @@ -234,9 +234,20 @@ class Tag { static table() { return class extends Tag.block("table") { decorate(text) { - text = super.decorate(text); - const splitterRow = text.split("|\n")[0].match(/\|/g).map(() => "| --- ").join("") + "|\n"; - text = text.replace("|\n", "|\n" + splitterRow).replace(/\|\n{2,}\|/g, "|\n|"); + text = super.decorate(text).replace(/\|\n{2,}\|/g, "|\n|"); + const rows = text.trim().split("\n"); + const pipes = rows[0].match(/\|/g); + const isValid = rows.length > 1 && + pipes.length > 2 && + rows.reduce((a, c) => a && c.match(/\|/g).length <= pipes.length); + + if (!isValid) { + throw "Unsupported table format for Markdown conversion"; + } + + const splitterRow = pipes.slice(1).map(() => "| --- ").join("") + "|\n"; + text = text.replace("|\n", "|\n" + splitterRow); + return text; } }; diff --git a/test/javascripts/lib/to-markdown-test.js.es6 b/test/javascripts/lib/to-markdown-test.js.es6 index 4ebb94ec9ae..0a33d642b91 100644 --- a/test/javascripts/lib/to-markdown-test.js.es6 +++ b/test/javascripts/lib/to-markdown-test.js.es6 @@ -109,7 +109,7 @@ QUnit.test("converts table tags", assert => { }); QUnit.test("returns empty string if table format not supported", assert => { - const html = `<table> + let html = `<table> <thead> <tr><th>Headi\n\nng 1</th><th>Head 2</th></tr> </thead> <tbody> <tr><td>Lorem</td><td>ipsum</td></tr> @@ -117,6 +117,18 @@ QUnit.test("returns empty string if table format not supported", assert => { </table> `; assert.equal(toMarkdown(html), ""); + + html = `<table> + <thead> <tr><th>Heading 1</th></tr> </thead> + <tbody> + <tr><td>Lorem</td></tr> + <tr><td><i>sit amet</i></td></tr></tbody> +</table> + `; + assert.equal(toMarkdown(html), ""); + + html = `<table><tr><td>Lorem</td><td><i>sit amet</i></td></tr></table>`; + assert.equal(toMarkdown(html), ""); }); QUnit.test("converts img tag", assert => {