diff --git a/package.json b/package.json index 4f6a9dca..72c70902 100644 --- a/package.json +++ b/package.json @@ -82,12 +82,14 @@ "react-dom": "^16.0.0" }, "dependencies": { + "@types/marked": "^0.3.0", "decko": "^1.2.0", "dompurify": "^1.0.2", "eventemitter3": "^3.0.0", "json-pointer": "^0.6.0", "json-schema-ref-parser": "^4.0.4", "lunr": "^2.1.5", + "marked": "^0.3.12", "mobx": "^3.3.0", "mobx-react": "^4.3.3", "openapi-sampler": "1.0.0-beta.8", @@ -98,7 +100,6 @@ "react-hot-loader": "3.1.3", "react-tabs": "^2.0.0", "react-tippy": "^1.2.2", - "remarkable": "^1.7.1", "slugify": "^1.2.1", "stickyfill": "^1.1.1", "styled-components": "^3.1.0", diff --git a/src/services/MarkdownRenderer.ts b/src/services/MarkdownRenderer.ts index 07e2217f..4154b4d7 100644 --- a/src/services/MarkdownRenderer.ts +++ b/src/services/MarkdownRenderer.ts @@ -1,15 +1,14 @@ -import * as Remarkable from 'remarkable'; +import * as marked from 'marked'; import slugify from 'slugify'; import { MDComponent } from '../components/Markdown/Markdown'; import { highlight, html2Str } from '../utils'; import { SECTION_ATTR } from './MenuStore'; -const md = new Remarkable('default', { - html: true, - linkify: true, - breaks: false, - typographer: false, +const renderer = new marked.Renderer(); + +marked.setOptions({ + renderer, highlight: (str, lang) => { return highlight(str, lang); }, @@ -31,16 +30,13 @@ export class MarkdownRenderer { headings: MarkdownHeading[] = []; currentTopHeading: MarkdownHeading; - private _origRules: any = {}; + private headingEnhanceRenderer: marked.Renderer; + private originalHeadingRule: typeof marked.Renderer.prototype.heading; - saveOrigRules() { - this._origRules.open = md.renderer.rules.heading_open; - this._origRules.close = md.renderer.rules.heading_close; - } - - restoreOrigRules() { - md.renderer.rules.heading_open = this._origRules.open; - md.renderer.rules.heading_close = this._origRules.close; + constructor() { + this.headingEnhanceRenderer = new marked.Renderer(); + this.originalHeadingRule = this.headingEnhanceRenderer.heading; + this.headingEnhanceRenderer.heading = this.headingRule; } saveHeading(name: string, container: MarkdownHeading[] = this.headings): MarkdownHeading { @@ -87,53 +83,32 @@ export class MarkdownRenderer { prevHeading.description = html2Str(rawText.substring(prevPos)); } - headingOpenRule = (tokens, idx) => { - if (tokens[idx].hLevel > 2) { - return this._origRules.open(tokens, idx); + headingRule = (text: string, level: number, raw: string) => { + if (level === 1) { + this.currentTopHeading = this.saveHeading(text); + const id = this.currentTopHeading.id; + return ( + `` + + `` + + `${text}` + ); + } else if (level === 2) { + const { id } = this.saveHeading(text, this.currentTopHeading && this.currentTopHeading.items); + return ( + `` + + `` + + `${text}` + ); } else { - const content = tokens[idx + 1].content; - if (tokens[idx].hLevel === 1) { - this.currentTopHeading = this.saveHeading(content); - const id = this.currentTopHeading.id; - return ( - `` + - `` + - `` - ); - } else if (tokens[idx].hLevel === 2) { - const { id } = this.saveHeading( - content, - this.currentTopHeading && this.currentTopHeading.items, - ); - return ( - `` + - `` + - `` - ); - } - } - }; - - headingCloseRule = (tokens, idx) => { - if (tokens[idx].hLevel > 2) { - return this._origRules.close(tokens, idx); - } else { - return `\n`; + return this.originalHeadingRule(text, level, raw); } }; renderMd(rawText: string, raw: boolean = true): string { - if (!raw) { - this.saveOrigRules(); - md.renderer.rules.heading_open = this.headingOpenRule; - md.renderer.rules.heading_close = this.headingCloseRule; - } + const opts = raw ? undefined : { renderer: this.headingEnhanceRenderer }; - const res = md.render(rawText.toString()); + const res = marked(rawText.toString(), opts); - if (!raw) { - this.restoreOrigRules(); - } return res; } diff --git a/yarn.lock b/yarn.lock index c6ce8634..4dfa4e31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -103,6 +103,10 @@ version "2.1.5" resolved "https://registry.yarnpkg.com/@types/lunr/-/lunr-2.1.5.tgz#afb90226a6d2eb472eb1732cef7493a02b0177fd" +"@types/marked@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.3.0.tgz#583c223dd33385a1dda01aaf77b0cd0411c4b524" + "@types/minimatch@3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.1.tgz#b683eb60be358304ef146f5775db4c0e3696a550" @@ -368,13 +372,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -argparse@~0.1.15: - version "0.1.16" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" - dependencies: - underscore "~1.7.0" - underscore.string "~2.4.0" - arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -524,10 +521,6 @@ atob@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" -autolinker@~0.15.0: - version "0.15.3" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.15.3.tgz#342417d8f2f3461b14cf09088d5edf8791dc9832" - autoprefixer@^6.3.1: version "6.7.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" @@ -4634,6 +4627,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +marked@^0.3.12: + version "0.3.12" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.12.tgz#7cf25ff2252632f3fe2406bde258e94eee927519" + math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" @@ -6209,13 +6206,6 @@ relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" -remarkable@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.1.tgz#aaca4972100b66a642a63a1021ca4bac1be3bff6" - dependencies: - argparse "~0.1.15" - autolinker "~0.15.0" - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -7420,18 +7410,10 @@ ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" -underscore.string@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" - underscore@~1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" -underscore@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" - union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"