102 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 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 `<span style="color: rgb(${this.color[0]}, ${this.color[1]}, ${this.color[2]})">${str}</span>`
 | |
|     },
 | |
|     colorize(str: string): string {
 | |
|       let s = "<span>" + colorTrans(str) + "</span>";
 | |
| 
 | |
|       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) => `<em style="${styleDict[style]}">${inner}</em>`)
 | |
|       }
 | |
|       return s.replace(/<span[^>]*><\/span[^>]*>/g, '');
 | |
| 
 | |
|       function colorTrans(str: string) {
 | |
|         return str
 | |
|           .replace(/\^([0-9])/g, (str, color) => `</span><span class="color-${color}">`)
 | |
|           .replace(/\^#([0-9A-F]{3,6})/gi, (str, color) => `</span><span class="color" style="color: #${color}">`)
 | |
|           .replace(/~([a-z])~/g, (str, color) => `</span><span class="gameColor-${color}">`);
 | |
|       }
 | |
|     },
 | |
|     escape(unsafe: string): string {
 | |
|       return String(unsafe)
 | |
|        .replace(/&/g, '&')
 | |
|        .replace(/</g, '<')
 | |
|        .replace(/>/g, '>')
 | |
|        .replace(/"/g, '"')
 | |
|        .replace(/'/g, ''');
 | |
|     },
 | |
|   },
 | |
|   props: {
 | |
|     templates: {
 | |
|       type: Object as PropType<{ [key: string]: string }>,
 | |
|     },
 | |
|     args: {
 | |
|       type: Array as PropType<string[]>,
 | |
|     },
 | |
|     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<number[]>,
 | |
|       default: null,
 | |
|     },
 | |
|   },
 | |
| });
 | 
