|
|
@ -81,6 +81,17 @@ export class HighlightedMarkdown extends Component { |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
shouldProcessNode: (node) => node.name === 'a', |
|
|
|
|
|
|
|
processNode (node, children) { |
|
|
|
|
|
|
|
return ( |
|
|
|
|
|
|
|
<a href={normalize_url(node.attribs.href)} target="_blank" rel="noopenner noreferrer" class="ext-link"> |
|
|
|
|
|
|
|
{children} |
|
|
|
|
|
|
|
<span className="icon icon-new-tab" /> |
|
|
|
|
|
|
|
</a> |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
{ |
|
|
|
{ |
|
|
|
shouldProcessNode (node) { |
|
|
|
shouldProcessNode (node) { |
|
|
|
return node.type === 'text' // pid, nickname, search
|
|
|
|
return node.type === 'text' // pid, nickname, search
|
|
|
@ -100,7 +111,10 @@ export class HighlightedMarkdown extends Component { |
|
|
|
return (<span key={idx}> |
|
|
|
return (<span key={idx}> |
|
|
|
{ |
|
|
|
{ |
|
|
|
rule==='url_pid' ? <span className="url-pid-link" title={p}>/##</span> : |
|
|
|
rule==='url_pid' ? <span className="url-pid-link" title={p}>/##</span> : |
|
|
|
rule==='url' ? <a href={normalize_url(p)} target="_blank" rel="noopener">{p}</a> : |
|
|
|
rule==='url' ? <a href={normalize_url(p)} class="ext-link" target="_blank" rel="noopener noreferrer"> |
|
|
|
|
|
|
|
{p} |
|
|
|
|
|
|
|
<span className="icon icon-new-tab" /> |
|
|
|
|
|
|
|
</a> : |
|
|
|
rule==='pid' ? <a href={'#'+p} onClick={(e)=>{e.preventDefault(); props.show_pid(p.substring(1));}}>{p}</a> : |
|
|
|
rule==='pid' ? <a href={'#'+p} onClick={(e)=>{e.preventDefault(); props.show_pid(p.substring(1));}}>{p}</a> : |
|
|
|
rule==='nickname' ? <ColoredSpan colors={props.color_picker.get(p)}>{p}</ColoredSpan> : |
|
|
|
rule==='nickname' ? <ColoredSpan colors={props.color_picker.get(p)}>{p}</ColoredSpan> : |
|
|
|
rule==='search' ? <span className="search-query-highlight">{p}</span> : |
|
|
|
rule==='search' ? <span className="search-query-highlight">{p}</span> : |
|
|
@ -116,12 +130,21 @@ export class HighlightedMarkdown extends Component { |
|
|
|
processNode: processDefs.processDefaultNode |
|
|
|
processNode: processDefs.processDefaultNode |
|
|
|
} |
|
|
|
} |
|
|
|
] |
|
|
|
] |
|
|
|
const renderedMarkdown = renderMd(this.props.text) |
|
|
|
|
|
|
|
const parser = new HtmlToReact.Parser() |
|
|
|
const parser = new HtmlToReact.Parser() |
|
|
|
|
|
|
|
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 { |
|
|
|
|
|
|
|
const renderedMarkdown = renderMd((props.author || '') + props.text) |
|
|
|
return parser.parseWithInstructions(renderedMarkdown, node => node.type !== 'script', processInstructions) |
|
|
|
return parser.parseWithInstructions(renderedMarkdown, node => node.type !== 'script', processInstructions) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
window.TEXTAREA_BACKUP={}; |
|
|
|
window.TEXTAREA_BACKUP={}; |
|
|
|
|
|
|
|
|
|
|
|