DEACTIVATE_KEY = 'deactivate-this-extension-pls-interactive-fics-yalla-bina'; chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if ('input_word' in message){ escapeAndReplace(message.input_word, message.replace_value, message.case_sensitive) } else { replaceAll() } }); const replaceAll = () => { chrome.storage.sync.get(null, items => { if (!items[DEACTIVATE_KEY]) { for (var key in items) { if (key == 'person') { const regexp_y_n = /\by\/n\b|\(y\/n\)|\[y\/n\]/ig replace(regexp_y_n, items[key]) } else if (key !== DEACTIVATE_KEY && !key.endsWith('_case_sensitive')) { escapeAndReplace(key, items[key], items[`${key}_case_sensitive`]) } } } }) } const escapeAndReplace = (input_word, replace_value, case_sensitive) => { let input_word_escaped = escapeRegExp(input_word.trim()) const flags = case_sensitive ? "g" : "ig" if (!input_word_escaped.startsWith('\\')) { input_word_escaped = `\\b${input_word_escaped}\\b` } const regexp_input_word = new RegExp(input_word_escaped, flags) replace(regexp_input_word, replace_value) } const escapeRegExp = (str) => str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") const replace = (input_word, replace_value) => { chrome.storage.sync.get(DEACTIVATE_KEY, obj => { if (replace_value && !obj[DEACTIVATE_KEY]) { walk(document.body, input_word, replace_value) } }) } const replaceText = (textNode, input_word, replace_value) => { let node_value = textNode.nodeValue node_value = node_value.replace(input_word, replace_value) textNode.nodeValue = node_value } function walk(node, v, p){ // I stole this function from here: // http://is.gd/mwZp7E var child, next; switch (node.nodeType){ case 1: // Element case 9: // Document case 11: // Document fragment child = node.firstChild; while (child){ next = child.nextSibling; walk(child, v, p); child = next; } break; case 3: // Text node replaceText(node, v, p); break; } } replaceAll()