From e984dfeccbb92d338c6d568e682a3e87b268c51f Mon Sep 17 00:00:00 2001 From: Liu Jiangyi Date: Mon, 22 Jun 2020 17:52:52 +0800 Subject: [PATCH] fixed markdown, tested --- src/Common.js | 62 ++++++++++++++++--------------------------------- src/Flows.js | 10 +------- src/Markdown.js | 8 +++++++ 3 files changed, 29 insertions(+), 51 deletions(-) create mode 100644 src/Markdown.js diff --git a/src/Common.js b/src/Common.js index 5a35397..f00b742 100644 --- a/src/Common.js +++ b/src/Common.js @@ -5,11 +5,9 @@ import {THUHOLE_API_ROOT} from './flows_api'; import HtmlToReact from 'html-to-react' import './Common.css'; -import { URL_PID_RE, URL_RE, split_text } from './text_splitter'; -import ProcessNodeDefinitions from 'html-to-react/lib/process-node-definitions'; +import { URL_PID_RE, URL_RE, PID_RE, NICKNAME_RE, split_text } from './text_splitter'; -import ReactMarkdown from 'react-markdown' -import htmlParser from 'react-markdown/plugins/html-parser' +import renderMd from './Markdown' export {format_time,Time,TitleLine}; @@ -61,38 +59,20 @@ export class HighlightedText extends PureComponent { } // props: text, show_pid, color_picker -export class HighlightedMarkdown extends PureComponent { +export class HighlightedMarkdown extends Component { render() { + const props = this.props const processDefs = new HtmlToReact.ProcessNodeDefinitions(React) - const astInst = [ + const processInstructions = [ { shouldProcessNode (node) { - return node.name === 'link' // urls - }, - processNode (node) { - const originalHref = node.attribs.href - if (URL_PID_RE.test(originalHref)) { // url_pid - return ( - /## - ) - } else if (URL_RE.test(originalHref)) { // url - return ( - - {originalHref} - - ) - } else {// other cases are invalid, e.g. javascript:alert, etc - return () - } - } - }, - { - shouldProcessNode (node) { - return node.name === 'text' // pid, nickname, search + return node.type === 'text' // pid, nickname, search }, processNode (node) { const originalText = node.data const splitted = split_text(originalText, [ + ['url_pid', URL_PID_RE], + ['url',URL_RE], ['pid',PID_RE], ['nickname',NICKNAME_RE], ]) @@ -100,12 +80,15 @@ export class HighlightedMarkdown extends PureComponent { return ( <> {splitted.map(([rule, p], idx) => { - - {rule==='pid' ? {e.preventDefault(); this.props.show_pid(p.substring(1));}}>{p} : - rule==='nickname' ? {p} : + return ( + { + rule==='url_pid' ? /## : + rule==='url' ? {p} : + rule==='pid' ? {e.preventDefault(); props.show_pid(p.substring(1));}}>{p} : + rule==='nickname' ? {p} : rule==='search' ? {p} : p} - + ) })} ) @@ -116,16 +99,11 @@ export class HighlightedMarkdown extends PureComponent { processNode: processDefs.processDefaultNode } ] - return ( - - ) + const renderedMarkdown = renderMd(this.props.text) + const parser = new HtmlToReact.Parser() + console.log(`prerender:${renderedMarkdown}`) + + return parser.parseWithInstructions(renderedMarkdown, node => node.type !== 'script', processInstructions) } } diff --git a/src/Flows.js b/src/Flows.js index 04b9e68..39e5674 100644 --- a/src/Flows.js +++ b/src/Flows.js @@ -7,7 +7,6 @@ import './Flows.css'; import LazyLoad from './react-lazyload/src'; import {AudioWidget} from './AudioWidget'; import {TokenCtx, ReplyForm} from './UserAction'; -import renderMd from './Markdown' import {API, THUHOLE_API_ROOT} from './flows_api'; @@ -75,13 +74,6 @@ class Reply extends PureComponent { } render() { - let parts=split_text(this.props.info.text,[ - ['url_pid',URL_PID_RE], - ['url',URL_RE], - ['pid',PID_RE], - ['nickname',NICKNAME_RE], - ]); - return (
- +
); diff --git a/src/Markdown.js b/src/Markdown.js new file mode 100644 index 0000000..d803c66 --- /dev/null +++ b/src/Markdown.js @@ -0,0 +1,8 @@ +import MarkdownIt from 'markdown-it' + +let md = new MarkdownIt({ + html: false, + linkify: false +}) + +export default (text) => md.render(text) \ No newline at end of file