From 590819ad9bebf4744d315f73c18f849192751b5a Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Wed, 27 Sep 2017 18:05:12 -0600 Subject: [PATCH 1/2] Fixes swagger-editor/#1502. Change logic for markdown rendering to: 1. Convert source markdown to HTML 2. Sanitize HTML 3. Send sanitized HTML to markdown renderer --- package.json | 2 + src/core/components/providers/markdown.jsx | 39 ++++++++++--------- src/core/components/response.jsx | 2 +- .../plugins/oas3/wrap-components/markdown.js | 27 ++++++++++--- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 576cb335..68bc84a2 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "base64-js": "^1.2.0", "brace": "0.7.0", "classnames": "^2.2.5", + "commonmark": "^0.28.1", "css.escape": "1.5.1", "deep-extend": "0.4.1", "expect": "1.20.2", @@ -72,6 +73,7 @@ "redux": "^3.x.x", "redux-immutable": "3.0.8", "redux-logger": "*", + "remarkable": "^1.7.1", "reselect": "2.5.3", "sanitize-html": "^1.14.1", "scroll-to-element": "^2.0.0", diff --git a/src/core/components/providers/markdown.jsx b/src/core/components/providers/markdown.jsx index 8f303335..2b21c10b 100644 --- a/src/core/components/providers/markdown.jsx +++ b/src/core/components/providers/markdown.jsx @@ -1,37 +1,40 @@ import React from "react" import PropTypes from "prop-types" -import Remarkable from "react-remarkable" +import Remarkable from "remarkable" import sanitize from "sanitize-html" function Markdown({ source }) { - const sanitized = sanitizer(source) + const html = new Remarkable({ + html: true, + typographer: true, + breaks: true, + linkify: true, + linkTarget: "_blank" + }).render(source) + const sanitized = sanitizer(html) - // sometimes the sanitizer returns "undefined" as a string - if(!source || !sanitized || sanitized === "undefined") { - return null - } + if ( !source || !html || !sanitized ) { + return null + } - return
- -
+ return ( +
+ ) } Markdown.propTypes = { - source: PropTypes.string.isRequired + source: PropTypes.string.isRequired } export default Markdown const sanitizeOptions = { - textFilter: function(text) { - return text - .replace(/"/g, "\"") - } + allowedTags: sanitize.defaults.allowedTags.concat([ "img" ]), + textFilter: function(text) { + return text.replace(/"/g, "\"") + } } export function sanitizer(str) { - return sanitize(str, sanitizeOptions) + return sanitize(str, sanitizeOptions) } diff --git a/src/core/components/response.jsx b/src/core/components/response.jsx index 62955f75..5843eb8b 100644 --- a/src/core/components/response.jsx +++ b/src/core/components/response.jsx @@ -111,7 +111,7 @@ export default class Response extends React.Component { if(examples) { examples = examples.map(example => { // Remove unwanted properties from examples - return example.set("$$ref", undefined) + return example.set ? example.set("$$ref", undefined) : example }) } diff --git a/src/core/plugins/oas3/wrap-components/markdown.js b/src/core/plugins/oas3/wrap-components/markdown.js index 9470eaab..103a2801 100644 --- a/src/core/plugins/oas3/wrap-components/markdown.js +++ b/src/core/plugins/oas3/wrap-components/markdown.js @@ -1,11 +1,26 @@ import React from "react" import ReactMarkdown from "react-markdown" +import { Parser, HtmlRenderer } from "commonmark" import { OAS3ComponentWrapFactory } from "../helpers" import { sanitizer } from "core/components/providers/markdown" -export default OAS3ComponentWrapFactory(({ source }) => { return source ? ( - -) : null}) +export default OAS3ComponentWrapFactory(({ source }) => { + if ( source ) { + const parser = new Parser() + const writer = new HtmlRenderer() + const html = writer.render(parser.parse(source || "")) + const sanitized = sanitizer(html) + + if ( !source || !html || !sanitized ) { + return null + } + + return ( + + ) + } + return null +}) \ No newline at end of file From a7acd9e004e4b667f28307decc21b5e99bf1735a Mon Sep 17 00:00:00 2001 From: Kyle Shockey Date: Fri, 29 Sep 2017 12:38:00 -0700 Subject: [PATCH 2/2] Remove react-remarkable from package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 68bc84a2..fdac9997 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,6 @@ "react-motion": "0.4.4", "react-object-inspector": "0.2.1", "react-redux": "^4.x.x", - "react-remarkable": "1.1.1", "react-split-pane": "0.1.57", "redux": "^3.x.x", "redux-immutable": "3.0.8",