import CONFIG from './config'; import Vue, { PropType } from 'vue'; export default Vue.component('message', { data() { return {}; }, computed: { textEscaped(): string { let s = this.template ? this.template : this.templates[this.templateId]; //This hack is required to preserve backwards compatability if (!this.template && this.templateId == CONFIG.defaultTemplateId && this.args.length == 1) { s = this.templates[CONFIG.defaultAltTemplateId] //Swap out default template :/ } s = s.replace(`@default`, this.templates[this.templateId]); s = s.replace(/{(\d+)}/g, (match, number) => { const argEscaped = this.args[number] != undefined ? this.escape(this.args[number]) : match; if (number == 0 && this.color) { //color is deprecated, use templates or ^1 etc. return this.colorizeOld(argEscaped); } return argEscaped; }); // format variant args s = s.replace(/\{\{([a-zA-Z0-9_\-]+?)\}\}/g, (match, id) => { const argEscaped = this.params[id] != undefined ? this.escape(this.params[id]) : match; return argEscaped; }); return this.colorize(s); }, }, methods: { colorizeOld(str: string): string { return `${str}` }, colorize(str: string): string { let s = "" + colorTrans(str) + ""; const styleDict: {[ key: string ]: string} = { '*': 'font-weight: bold;', '_': 'text-decoration: underline;', '~': 'text-decoration: line-through;', '=': 'text-decoration: underline line-through;', 'r': 'text-decoration: none;font-weight: normal;', }; const styleRegex = /\^(\_|\*|\=|\~|\/|r)(.*?)(?=$|\^r|<\/em>)/; while (s.match(styleRegex)) { //Any better solution would be appreciated :P s = s.replace(styleRegex, (str, style, inner) => `${inner}`) } return s.replace(/]*><\/span[^>]*>/g, ''); function colorTrans(str: string) { return str .replace(/\^([0-9])/g, (str, color) => ``) .replace(/\^#([0-9A-F]{3,6})/gi, (str, color) => ``) .replace(/~([a-z])~/g, (str, color) => ``); } }, escape(unsafe: string): string { return String(unsafe) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }, }, props: { templates: { type: Object as PropType<{ [key: string]: string }>, }, args: { type: Array as PropType, }, params: { type: Object as PropType<{ [ key: string]: string }>, }, template: { type: String, default: null, }, templateId: { type: String, default: CONFIG.defaultTemplateId, }, multiline: { type: Boolean, default: false, }, color: { //deprecated type: Array as PropType, default: null, }, }, });