2022-12-10 12:14:48 +03:00
|
|
|
import emojifyText from './emojify-text';
|
|
|
|
|
2022-12-10 14:16:11 +03:00
|
|
|
export default (content, opts = {}) => {
|
2022-12-11 04:28:02 +03:00
|
|
|
const { emojis, postEnhanceDOM = () => {} } = opts;
|
2022-12-10 12:14:48 +03:00
|
|
|
let enhancedContent = content;
|
2022-12-10 14:16:11 +03:00
|
|
|
const dom = document.createElement('div');
|
|
|
|
dom.innerHTML = enhancedContent;
|
2022-12-10 12:14:48 +03:00
|
|
|
|
2022-12-10 14:16:11 +03:00
|
|
|
// 1. Emojis
|
2022-12-10 12:14:48 +03:00
|
|
|
if (emojis) {
|
|
|
|
enhancedContent = emojifyText(enhancedContent, emojis);
|
|
|
|
}
|
|
|
|
|
2022-12-10 14:16:11 +03:00
|
|
|
// 2. Add target="_blank" to all links with no target="_blank"
|
|
|
|
// E.g. `note` in `account`
|
|
|
|
const links = Array.from(dom.querySelectorAll('a:not([target="_blank"])'));
|
|
|
|
links.forEach((link) => {
|
|
|
|
link.setAttribute('target', '_blank');
|
|
|
|
});
|
|
|
|
|
|
|
|
// 3. Code blocks
|
2022-12-10 12:14:48 +03:00
|
|
|
// Check for <p> with markdown-like content "```"
|
|
|
|
const blocks = Array.from(dom.querySelectorAll('p')).filter((p) =>
|
|
|
|
/^```[^]+```$/g.test(p.innerText.trim()),
|
|
|
|
);
|
|
|
|
blocks.forEach((block) => {
|
|
|
|
const pre = document.createElement('pre');
|
|
|
|
const code = document.createElement('code');
|
|
|
|
const breaks = block.querySelectorAll('br');
|
2022-12-11 04:28:02 +03:00
|
|
|
breaks.forEach((br) => br.replaceWith('\n'));
|
2022-12-10 12:14:48 +03:00
|
|
|
code.innerHTML = block.innerText
|
|
|
|
.trim()
|
|
|
|
// .replace(/^```/g, '')
|
|
|
|
// .replace(/```$/g, '')
|
|
|
|
.replace(/^[\n\r]+/, '');
|
|
|
|
pre.appendChild(code);
|
|
|
|
block.replaceWith(pre);
|
|
|
|
});
|
|
|
|
|
2022-12-11 04:28:02 +03:00
|
|
|
if (postEnhanceDOM) {
|
|
|
|
postEnhanceDOM(dom); // mutate dom
|
|
|
|
}
|
|
|
|
|
2022-12-10 14:16:11 +03:00
|
|
|
enhancedContent = dom.innerHTML;
|
2022-12-11 04:28:02 +03:00
|
|
|
|
2022-12-10 12:14:48 +03:00
|
|
|
return enhancedContent;
|
|
|
|
};
|