Fix escaping markdown by rendering plaintext

We still need to parse "plaintext" messages through the markdown
renderer so that escappes are rendered properly.

Fixes vector-im/riot-web#2870.

Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
This commit is contained in:
Johannes Löthberg 2016-12-02 19:58:35 +01:00
parent fcb1d7a664
commit 893a5c971f
2 changed files with 25 additions and 15 deletions

View file

@ -56,11 +56,12 @@ export default class Markdown {
return is_plain; return is_plain;
} }
toHTML() { render(html) {
const parser = new commonmark.Parser(); const parser = new commonmark.Parser();
const renderer = new commonmark.HtmlRenderer({safe: true}); const renderer = new commonmark.HtmlRenderer({safe: true});
const real_paragraph = renderer.paragraph; const real_paragraph = renderer.paragraph;
if (html) {
renderer.paragraph = function(node, entering) { renderer.paragraph = function(node, entering) {
// If there is only one top level node, just return the // If there is only one top level node, just return the
// bare text: it's a single line of text and so should be // bare text: it's a single line of text and so should be
@ -75,6 +76,13 @@ export default class Markdown {
real_paragraph.call(this, node, entering); real_paragraph.call(this, node, entering);
} }
} }
} else {
renderer.paragraph = function(node, entering) {
if (entering) {
this.lit('\n\n');
}
}
}
var parsed = parser.parse(this.input); var parsed = parser.parse(this.input);
return renderer.render(parsed); return renderer.render(parsed);

View file

@ -401,7 +401,7 @@ export default class MessageComposerInput extends React.Component {
let contentState = null; let contentState = null;
if (enabled) { if (enabled) {
const md = new Markdown(this.state.editorState.getCurrentContent().getPlainText()); const md = new Markdown(this.state.editorState.getCurrentContent().getPlainText());
contentState = RichText.HTMLtoContentState(md.toHTML()); contentState = RichText.HTMLtoContentState(md.render(true));
} else { } else {
let markdown = stateToMarkdown(this.state.editorState.getCurrentContent()); let markdown = stateToMarkdown(this.state.editorState.getCurrentContent());
if (markdown[markdown.length - 1] === '\n') { if (markdown[markdown.length - 1] === '\n') {
@ -523,8 +523,10 @@ export default class MessageComposerInput extends React.Component {
); );
} else { } else {
const md = new Markdown(contentText); const md = new Markdown(contentText);
if (!md.isPlainText()) { if (md.isPlainText()) {
contentHTML = md.toHTML(); contentText = md.render(false);
} else {
contentHTML = md.render(true);
} }
} }