diff --git a/package.json b/package.json
index 576cb335..fdac9997 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",
@@ -67,11 +68,11 @@
"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",
"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