Vue.component("keyword", { props: ["v-word"], data: function () { let word = this.vWord if (word == null) { word = "" } else { word = word.replace(/\)/g, "\\)") word = word.replace(/\(/g, "\\(") word = word.replace(/\+/g, "\\+") word = word.replace(/\^/g, "\\^") word = word.replace(/\$/g, "\\$") word = word.replace(/\?/g, "\\?") word = word.replace(/\*/g, "\\*") word = word.replace(/\[/g, "\\[") word = word.replace(/{/g, "\\{") word = word.replace(/\./g, "\\.") } let slot = this.$slots["default"][0] let text = slot.text if (word.length > 0) { let that = this let m = [] // replacement => tmp let tmpIndex = 0 text = text.replaceAll(new RegExp("(" + word + ")", "ig"), function (replacement) { tmpIndex++ let s = "" + that.encodeHTML(replacement) + "" let tmpKey = "$TMP__KEY__" + tmpIndex.toString() + "$" m.push([tmpKey, s]) return tmpKey }) text = this.encodeHTML(text) m.forEach(function (r) { text = text.replace(r[0], r[1]) }) } else { text = this.encodeHTML(text) } return { word: word, text: text } }, methods: { encodeHTML: function (s) { s = s.replace(/&/g, "&") s = s.replace(//g, ">") s = s.replace(/"/g, """) return s } }, template: `` })