From ae5a477695c45c546485a541838ebc10bbf894fa Mon Sep 17 00:00:00 2001 From: chee Date: Sat, 9 Jun 2018 23:04:02 +0100 Subject: [PATCH] You'll take care of her, I know it, you will do a better job --- .gitignore | 1 + .web-extension-id | 3 ++ STYLE.css | 33 +++++++++++++++ background.js | 97 +++++++++++++++++++++++++++++++++++++++++++ browser-action.js | 70 +++++++++++++++++++++++++++++++ content.js | 44 ++++++++++++++++++++ icon.png | Bin 0 -> 7803 bytes manifest.json | 35 ++++++++++++++++ the-replacements.htm | 20 +++++++++ 9 files changed, 303 insertions(+) create mode 100644 .gitignore create mode 100644 .web-extension-id create mode 100644 STYLE.css create mode 100644 background.js create mode 100644 browser-action.js create mode 100644 content.js create mode 100644 icon.png create mode 100644 manifest.json create mode 100644 the-replacements.htm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6311779 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +web-ext-artifacts/ diff --git a/.web-extension-id b/.web-extension-id new file mode 100644 index 0000000..4e1d7a5 --- /dev/null +++ b/.web-extension-id @@ -0,0 +1,3 @@ +# This file was created by https://github.com/mozilla/web-ext +# Your auto-generated extension ID for addons.mozilla.org is: +anything_to_anything@snake.dog \ No newline at end of file diff --git a/STYLE.css b/STYLE.css new file mode 100644 index 0000000..3dbd8a8 --- /dev/null +++ b/STYLE.css @@ -0,0 +1,33 @@ +body { + background: #ff2a50; + color: white; + font-size: 5vw; + display: flex; + justify-content: center; + align-items: center; +} + +input { + border: none; + border-radius: 2px; + padding: .5em; + font-size: .4em; +} + +input[type="text"] { + width: 9em; +} + +input:focus { + outline: 5px solid #33ffcc; + border: 2px solid black; + box-shadow: 0 0 2px 5px rgba(40, 60, 120, 0.5); +} + +th { + text-align: left; +} + +th, td { + padding: .2em .4em; +} diff --git a/background.js b/background.js new file mode 100644 index 0000000..f496dc7 --- /dev/null +++ b/background.js @@ -0,0 +1,97 @@ +var escape = char => `\\${char}` + +var special = new RegExp('[' + + '()}{[]|\\^$*+?.'.split`` + .map(escape) + .join`|` + + ']', 'g' +) + +var escapeRegex = string => string.replace(special, '\\$&') + +var wordStartRegex = /((?:^|\s|[-_])\w)/g + +String.prototype.toTitleCase = function () { + return this.toLowerCase().replace(wordStartRegex, $1 => $1.toUpperCase()) +} + +function createInsensitiveReplacements ({from, to}) { + var replacements = [] + replacements.push({from, to}) + + replacements.push({ + from: from.toUpperCase(), + to: to.toUpperCase() + }) + + replacements.push({ + from: from.toLowerCase(), + to: to.toLowerCase() + }) + + replacements.push({ + from: from.toTitleCase(), + to: to.toTitleCase() + }) + + return replacements +} + +var build = items => items.reduce((map, item) => { + var { + from = '', + to = '', + sensitive = false, + isRegex = false + } = item + + if (!from) return map + + var replacements = sensitive + ? [{from, to}] + : createInsensitiveReplacements({from, to}) + + return replacements.reduce((map, {from, to}) => ( + map[isRegex + ? from + : escapeRegex(from) + ] = to, map + ), map) + +}, {}) + +var currentData = {} + +browser.storage.local.get('map').then(results => { + currentData = results +}) + +browser.tabs.onUpdated.addListener = (tabId, changeInfo, tab) => { + browsers.tabs.sendMessage(tabId, currentData) +} + +function handleBrowserActionMessage ({type, value}) { + if (type === 'items:change') { + currentData.map = build(value) + browser.storage.local.set(currentData) + } +} + +browser.runtime.onMessage.addListener((message, sender) => { + if (sender.tab && sender.url.endsWith('the-replacements.htm')) { + // we are getting messages from our special tab + handleBrowserActionMessage(message) + } +}) + +browser.browserAction.onClicked.addListener(() => { + browser.tabs.create({ + active: true, + url: './the-replacements.htm' + }).then(() => { + setTimeout(() => { + browser.runtime.sendMessage('hello m8') + browser.runtime.sendMessage(['like this', '?']) + }, 4000) + }) +}) diff --git a/browser-action.js b/browser-action.js new file mode 100644 index 0000000..b23f567 --- /dev/null +++ b/browser-action.js @@ -0,0 +1,70 @@ +var dom = 'tr td input'.split` `.reduce((dom, nodename) => { + dom[nodename] = (attrs = {}, children = '') => { + var node = document.createElement(nodename) + + Object.entries(attrs).forEach(([key, value]) => { + value != null && value !== false && node.setAttribute(key, value) + }) + + if (typeof children === 'string') { + node.textContent = children + } else if (Array.isArray(children)) { + node.append(...children) + } else { + node.append(children) + } + + return node + } + return dom +}, {}) + +function createRow ({from = '', to = '', sensitive = false, isRegex = false} = {}) { + return dom.tr({class: 'js-row'}, [ + dom.td({}, dom.input({class: 'js-from', type: 'text', value: from})), + dom.td({}, dom.input({class: 'js-to', type: 'text', value: to})), + dom.td({}, dom.input({class: 'js-sensitive', type: 'checkbox', checked: sensitive})), + dom.td({}, dom.input({class: 'js-isRegex', type: 'checkbox', checked: isRegex})) + ]) +} + +var table = document.getElementById('table') +var body = document.getElementById('body') + +function serialise () { + return [].reduce.call(table.querySelectorAll('.js-row'), (items, row) => items.concat({ + from: row.querySelector('.js-from').value || '', + to: row.querySelector('.js-to').value || '', + sensitive: !!row.querySelector('.js-sensitive').checked, + isRegex: !!row.querySelector('.js-isRegex').checked + }), []) +} + +Array.prototype.last = function () { + return this[Math.max(this.length - 1, 0)] +} + +function appendRow ({from, to, sensitive, isRegex} = {}) { + return body.append(createRow({from, to, sensitive, isRegex})) +} + +function handleKeyDown () { + var items = serialise() + + browser.storage.local.set({items}).then(() => browser.runtime.sendMessage({ + type: 'items:change', + value: items + })) + + var last = items.last() + + if (last.from && last.to) appendRow() +} + +document.addEventListener('keydown', handleKeyDown) + +browser.storage.local.get('items').then(({items}) => { + if (!Array.isArray(items) || !items.length) return + body.textContent = '' + items.forEach(appendRow) +}) diff --git a/content.js b/content.js new file mode 100644 index 0000000..4c105bc --- /dev/null +++ b/content.js @@ -0,0 +1,44 @@ +var escape = char => `\\${char}` + +var special = new RegExp('[' + + '()}{[]|\\^$*+?.'.split`` + .map(escape) + .join`|` + + ']', 'g' +) + +var escapeRegex = string => string.replace(special, '\\$&') + +var createReplace = replacements => match => { + var straightMatch = replacements[match] + if (straightMatch) return straightMatch + + // else find gay match + var demiMatch = replacements[escapeRegex(match)] + if (demiMatch) return demiMatch + + var [, okcupidMatch] = (Object.entries(replacements).find(([from]) => + RegExp(escapeRegex(from)).test(match) + ) || []) + if (okcupidMatch) return okcupidMatch + + var [, tinderFuck] = (Object.entries(replacements).find(([from]) => + RegExp(from).test(match) + ) || []) + if (tinderFuck) return tinderFuck +} + +var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT) + +browser.storage.local.get('map').then(results => { + var {map} = results + var keys = Object.keys(map) + if (!keys.length) return + var regex = RegExp(`\\b(${keys.join('|')})\\b`, 'g') + var replace = createReplace(map) + var text + while (text = walker.nextNode()) { + text.textContent = text.textContent.replace(regex, replace) + } +}) + diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f491851bbc6c0409ed2047d9cca8fc4dd1a82261 GIT binary patch literal 7803 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..b37510c --- /dev/null +++ b/manifest.json @@ -0,0 +1,35 @@ +{ + "manifest_version": 2, + "name": "anything-to-anything", + "version": "0.0.17", + "description": "replace any term with anything, everywhere. cloud->butt millenial->snake peopel, blockchain->slow database", + "background": { + "scripts": ["background.js"] + }, + "content_scripts": [ + { + "matches": [ + "*://*/*" + ], + "js": [ + "content.js" + ] + } + ], + "permissions": ["storage"], + "icons": { + "64": "icon.png" + }, + "browser_action": { + "browser_style": true, + "default_title": "Anything to Anything", + "default_icon": { + "64": "icon.png" + } + }, + "applications": { + "gecko": { + "id": "anything_to_anything@snake.dog" + } + } +} diff --git a/the-replacements.htm b/the-replacements.htm new file mode 100644 index 0000000..7de8bd3 --- /dev/null +++ b/the-replacements.htm @@ -0,0 +1,20 @@ + + +the replacements + + + + + + + +
from + to + sensitive + regex +
+ + + +
+