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 `:${split[0]}:` } 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}
` }) futoji.addTransformer({ name: 'code', symbol: '`', recursive: false, transformer: text => `${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, "'"); }