import Formatter from 'futoji'
import twemoji from 'twemoji'
import emojiParser from '@/utils/emojiParser';
import config from "@/config.js";
import hljs from 'highlight.js'
import { escape as escapeHTML, unescape as unescapeHTML } from 'validator'
const futoji = new Formatter();
const emojiFormatter = new Formatter();
emojiFormatter.addTransformer({
name:'customEmoji2',
symbol: ':',
padding: false,
recursive: false,
validate: text => /.+?&(.+?)/.test(text),
transformer: owo
})
function owo (text) {
const split = text.split('&');
if (!split || split.length <= 1) return `:${text}:`;
const url = split[split.length - 1].slice(4);
return ``
}
futoji.addTransformer({
name: 'custom emoji',
symbol: ':',
padding: false,
recursive: false,
validate: text => /.+?&(.+?)/.test(text),
transformer: text => {
const formattedInner = emojiFormatter.format(text);
return owo(formattedInner);
}
})
futoji.addTransformer({
name: 'url',
open: 'http',
close: ' ',
recursive: false,
validate: text => /(https?:\/\/[^\s]+)/g.test('http' + text),
transformer: text => 'http' + text + ' '
})
futoji.addTransformer({
name: 'bold-and-italic',
symbol: '***',
transformer: text => `${text}`
})
futoji.addTransformer({
name: 'bold',
symbol: '**',
transformer: text => `${text}`
})
futoji.addTransformer({
name: 'italic',
symbol: '*',
transformer: text => `${text}`
})
futoji.addTransformer({
name: 'underline',
symbol: '__',
transformer: text => `${text}`
})
futoji.addTransformer({
name: 'italic',
symbol: '_',
transformer: text => `${text}`
})
futoji.addTransformer({
name: 'srike',
symbol: '~~',
transformer: text => `
${text.trim()}`
})
futoji.addTransformer({
name: 'code-block',
symbol: '```',
recursive: false,
transformer: text => `
${hljs.highlightAuto(formatCode(unescapeHTML(text)).code).value}${text}`,
})
export default (message) => {
message = futoji.format(escapeHtml(message + ' ')).trim();
message = emojiParser.replaceEmojis(message);
return message;
}
/**
* format code to get language and code
*/
function formatCode(text) {
// matches if word until newline
// if spaces then it won't match
let nameRegex = new RegExp('^(\\w+)\\s')
if (nameRegex.test(text)) {
let language = nameRegex.exec(text)[1]
let newText = text.replace(nameRegex, '')
return {
lang: language,
code: newText
}
}
return {
lang: '',
code: text
}
}
// todo: replace with well tested / faster method
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}