diff --git a/package-lock.json b/package-lock.json index 93faca6..b430e76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5996,6 +5996,11 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "highlight.js": { + "version": "10.1.1", + "resolved": "https://r.cnpmjs.org/highlight.js/download/highlight.js-10.1.1.tgz", + "integrity": "sha1-aRohSKjZIr8S5SopRWag2ZO5TFc=" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", diff --git a/package.json b/package.json index f92322b..54221ec 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "copy-to-clipboard": "^3.0.8", "fix-orientation": "^1.1.0", "gh-pages": "^3.0.0", + "highlight.js": "^10.1.1", "html-to-react": "^1.4.3", "load-script": "^1.0.0", "markdown-it": "^11.0.0", diff --git a/public/static/fonts_7/icomoon.css b/public/static/fonts_7/icomoon.css index 5004159..4e7fc21 100644 --- a/public/static/fonts_7/icomoon.css +++ b/public/static/fonts_7/icomoon.css @@ -99,3 +99,7 @@ .icon-github:before { content: "\eab0"; } + +.icon-new-tab:before { + content: "\ea7e"; +} \ No newline at end of file diff --git a/public/static/fonts_7/icomoon.svg b/public/static/fonts_7/icomoon.svg index 2482297..1400c3b 100644 --- a/public/static/fonts_7/icomoon.svg +++ b/public/static/fonts_7/icomoon.svg @@ -31,4 +31,6 @@ + + \ No newline at end of file diff --git a/public/static/fonts_7/icomoon.ttf b/public/static/fonts_7/icomoon.ttf index 20a0e38..cce7337 100644 Binary files a/public/static/fonts_7/icomoon.ttf and b/public/static/fonts_7/icomoon.ttf differ diff --git a/public/static/fonts_7/icomoon.woff b/public/static/fonts_7/icomoon.woff index 1b7a936..8827eb2 100644 Binary files a/public/static/fonts_7/icomoon.woff and b/public/static/fonts_7/icomoon.woff differ diff --git a/src/Common.js b/src/Common.js index f41ec39..aa6e593 100644 --- a/src/Common.js +++ b/src/Common.js @@ -81,6 +81,17 @@ export class HighlightedMarkdown extends Component { ) } }, + { + shouldProcessNode: (node) => node.name === 'a', + processNode (node, children) { + return ( + + {children} + + + ) + } + }, { shouldProcessNode (node) { return node.type === 'text' // pid, nickname, search @@ -100,7 +111,10 @@ export class HighlightedMarkdown extends Component { return ( { rule==='url_pid' ? /## : - rule==='url' ? {p} : + rule==='url' ? + {p} + + : rule==='pid' ? {e.preventDefault(); props.show_pid(p.substring(1));}}>{p} : rule==='nickname' ? {p} : rule==='search' ? {p} : @@ -116,13 +130,21 @@ export class HighlightedMarkdown extends Component { processNode: processDefs.processDefaultNode } ] - const renderedMarkdown = renderMd(this.props.text) const parser = new HtmlToReact.Parser() - - let rtn = parser.parseWithInstructions(renderedMarkdown, node => node.type !== 'script', processInstructions) - if(rtn === undefined) - return null - return rtn; + if (props.author && props.text.match(/^(?:#+ |>|```|\t|\s*-|\s*\d+\.)/)) { + const renderedMarkdown = renderMd(props.text) + return ( + <> + {props.author} + {parser.parseWithInstructions(renderedMarkdown, node => node.type !== 'script', processInstructions) || ''} + + ) + } else { + let rawMd = props.text + if (props.author) rawMd = props.author + ' ' + rawMd + const renderedMarkdown = renderMd(rawMd) + return (parser.parseWithInstructions(renderedMarkdown, node => node.type !== 'script', processInstructions) || null) + } } } @@ -285,4 +307,4 @@ export class ClickHandler extends PureComponent { ) } -} \ No newline at end of file +} diff --git a/src/Flows.js b/src/Flows.js index 39e5674..74d0864 100644 --- a/src/Flows.js +++ b/src/Flows.js @@ -74,6 +74,11 @@ class Reply extends PureComponent { } render() { + const replyContent = (this.props.info.text) + const splitIdx = replyContent.indexOf(']') + + const author = replyContent.substr(0, splitIdx + 1), + replyText = replyContent.substr(splitIdx + 2) return (
- +
); diff --git a/src/Markdown.css b/src/Markdown.css new file mode 100644 index 0000000..5739246 --- /dev/null +++ b/src/Markdown.css @@ -0,0 +1,3 @@ +.hljs { + white-space: pre-wrap; +} \ No newline at end of file diff --git a/src/Markdown.js b/src/Markdown.js index d689a03..ef3d7be 100644 --- a/src/Markdown.js +++ b/src/Markdown.js @@ -1,12 +1,26 @@ import MarkdownIt from 'markdown-it' import MarkdownItKaTeX from 'markdown-it-katex' +import hljs from 'highlight.js' +import 'highlight.js/styles/atom-one-dark.css' +import './Markdown.css' import 'katex/dist/katex.min.css' let md = new MarkdownIt({ html: false, linkify: false, - breaks: true + breaks: true, + inline: true, + highlight (str, lang) { + if (lang && hljs.getLanguage(lang)) { + try { + return '
' +
+               hljs.highlight(lang, str, true).value +
+               '
'; + } catch (__) {} + } + return '
' + md.utils.escapeHtml(str) + '
'; + } }).use(MarkdownItKaTeX, { "throwOnError" : false, "errorColor" : "#aa0000"