Store texts as HTML
This commit is contained in:
83
src/common/text/html.ts
Normal file
83
src/common/text/html.ts
Normal file
@ -0,0 +1,83 @@
|
||||
import { lib as emojilib } from 'emojilib';
|
||||
import { JSDOM } from 'jsdom';
|
||||
|
||||
const handlers = {
|
||||
bold({ document }, { bold }) {
|
||||
const b = document.createElement('b');
|
||||
b.textContent = bold;
|
||||
document.body.appendChild(b);
|
||||
},
|
||||
|
||||
code({ document }, { code }) {
|
||||
const pre = document.createElement('pre');
|
||||
const inner = document.createElement('code');
|
||||
inner.innerHTML = code;
|
||||
pre.appendChild(inner);
|
||||
document.body.appendChild(pre);
|
||||
},
|
||||
|
||||
emoji({ document }, { content, emoji }) {
|
||||
const found = emojilib[emoji];
|
||||
const node = document.createTextNode(found ? found.char : content);
|
||||
document.body.appendChild(node);
|
||||
},
|
||||
|
||||
hashtag({ document }, { hashtag }) {
|
||||
const a = document.createElement('a');
|
||||
a.href = '/search?q=#' + hashtag;
|
||||
a.textContent = hashtag;
|
||||
},
|
||||
|
||||
'inline-code'({ document }, { code }) {
|
||||
const element = document.createElement('code');
|
||||
element.textContent = code;
|
||||
document.body.appendChild(element);
|
||||
},
|
||||
|
||||
link({ document }, { url, title }) {
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.textContent = title;
|
||||
document.body.appendChild(a);
|
||||
},
|
||||
|
||||
mention({ document }, { content }) {
|
||||
const a = document.createElement('a');
|
||||
a.href = '/' + content;
|
||||
a.textContent = content;
|
||||
document.body.appendChild(a);
|
||||
},
|
||||
|
||||
quote({ document }, { quote }) {
|
||||
const blockquote = document.createElement('blockquote');
|
||||
blockquote.textContent = quote;
|
||||
document.body.appendChild(blockquote);
|
||||
},
|
||||
|
||||
text({ document }, { content }) {
|
||||
for (const text of content.split('\n')) {
|
||||
const node = document.createTextNode(text);
|
||||
document.body.appendChild(node);
|
||||
|
||||
const br = document.createElement('br');
|
||||
document.body.appendChild(br);
|
||||
}
|
||||
},
|
||||
|
||||
url({ document }, { url }) {
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.textContent = url;
|
||||
document.body.appendChild(a);
|
||||
}
|
||||
};
|
||||
|
||||
export default tokens => {
|
||||
const { window } = new JSDOM('');
|
||||
|
||||
for (const token of tokens) {
|
||||
handlers[token.type](window, token);
|
||||
}
|
||||
|
||||
return `<p>${window.document.body.innerHTML}</p>`;
|
||||
};
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Mention
|
||||
*/
|
||||
import parseAcct from '../../../common/user/parse-acct';
|
||||
import parseAcct from '../../../../common/user/parse-acct';
|
||||
|
||||
module.exports = text => {
|
||||
const match = text.match(/^(?:@[a-zA-Z0-9\-]+){1,2}/);
|
Reference in New Issue
Block a user