// manifest.json { "manifest_version": 3, "name": "Totally Rad Word Replacer", "version": "1.0", "description": "Changes your words - 90s style!", "permissions": ["activeTab", "storage"], "action": { "default_popup": "popup.html", "default_icon": { "16": "images/icon16.png", "48": "images/icon48.png", "128": "images/icon128.png" } }, "content_scripts": [ { "matches": [""], "js": ["content.js"] } ], "icons": { "16": "images/icon16.png", "48": "images/icon48.png", "128": "images/icon128.png" } } // popup.html Totally Rad Word Replacer

☆ Word Changer 2000 ☆

★★★ WELCOME TO THE COOLEST WORD CHANGER ON THE WEB! REPLACE BORING WORDS WITH RAD ONES! ★★★

// popup.js document.addEventListener('DOMContentLoaded', function() { const findInput = document.getElementById('find-input'); const replaceInput = document.getElementById('replace-input'); const addBtn = document.getElementById('add-btn'); const saveBtn = document.getElementById('save-btn'); const replacementsContainer = document.getElementById('replacements-container'); const statusEl = document.getElementById('status'); // Add some 90s sound effects const clickSound = new Audio('data:audio/wav;base64,UklGRl9JAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAAABMSVNUHAAAAGlOW09Zrk/OT+lPBFAcGAAISFhJTkYeAAAAQ29weXJpZ2h0wqkg'); const saveSound = new Audio('data:audio/wav;base64,UklGRl9JAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAAABMSVNUHAAAAGlOW09Zrk/OT+lPBFAcUklGRl9eAABXQVZF'); // Play click sound for all buttons document.querySelectorAll('button').forEach(btn => { btn.addEventListener('mousedown', function() { clickSound.currentTime = 0; clickSound.play().catch(e => {}); }); }); let replacements = []; // Load saved replacements chrome.storage.sync.get('wordReplacements', function(data) { if (data.wordReplacements) { replacements = data.wordReplacements; displayReplacements(); } else { // Add default replacement pair: bomb -> flower replacements = [{ find: 'bomb', replace: 'flower' }]; saveReplacements(); displayReplacements(); } }); // Add new replacement pair addBtn.addEventListener('click', function() { const findWord = findInput.value.trim(); const replaceWord = replaceInput.value.trim(); if (findWord && replaceWord) { replacements.push({ find: findWord, replace: replaceWord }); findInput.value = ''; replaceInput.value = ''; displayReplacements(); // Flash effect document.body.style.backgroundColor = "#FF00FF"; setTimeout(() => { document.body.style.backgroundColor = "#00BFFF"; }, 100); } }); // Save all replacements saveBtn.addEventListener('click', function() { saveReplacements(); statusEl.textContent = '✓ TOTALLY SAVED, DUDE!'; statusEl.classList.add('blink'); // Play save sound saveSound.currentTime = 0; saveSound.play().catch(e => {}); // Cool flash effect document.body.style.backgroundColor = "#00FF00"; setTimeout(() => { document.body.style.backgroundColor = "#00BFFF"; }, 200); setTimeout(() => { statusEl.textContent = ''; statusEl.classList.remove('blink'); }, 2000); // Refresh all open tabs to apply changes chrome.tabs.query({}, function(tabs) { for (let tab of tabs) { chrome.tabs.reload(tab.id); } }); }); // Display all replacement pairs function displayReplacements() { replacementsContainer.innerHTML = ''; if (replacements.length === 0) { replacementsContainer.innerHTML = '
NO WORDS YET - ADD SOME!
'; return; } replacements.forEach((pair, index) => { const pairDiv = document.createElement('div'); pairDiv.className = 'replacement-pair'; pairDiv.innerHTML = ` `; replacementsContainer.appendChild(pairDiv); }); // Add event listeners for delete buttons document.querySelectorAll('.delete-btn').forEach(btn => { btn.addEventListener('click', function() { const index = parseInt(this.getAttribute('data-index')); replacements.splice(index, 1); displayReplacements(); }); }); } // Save replacements to storage function saveReplacements() { chrome.storage.sync.set({ wordReplacements: replacements }); } }); // content.js // This script runs on every webpage (function() { let replacements = []; // Load replacements from storage chrome.storage.sync.get('wordReplacements', function(data) { if (data.wordReplacements && data.wordReplacements.length > 0) { replacements = data.wordReplacements; replaceWordsInPage(); } }); // Replace words in the current page function replaceWordsInPage() { const textNodes = getTextNodes(document.body); textNodes.forEach(node => { let content = node.nodeValue; let originalContent = content; replacements.forEach(pair => { // Create regex to match whole words only const regex = new RegExp('\\b' + escapeRegExp(pair.find) + '\\b', 'gi'); content = content.replace(regex, pair.replace); }); // Only update if content has changed if (content !== originalContent) { node.nodeValue = content; } }); } // Get all text nodes in a given element function getTextNodes(element) { let textNodes = []; if (element) { for (let node of element.childNodes) { if (node.nodeType === Node.TEXT_NODE) { textNodes.push(node); } else if (node.nodeType === Node.ELEMENT_NODE) { // Skip script and style elements if (node.tagName !== 'SCRIPT' && node.tagName !== 'STYLE') { textNodes = textNodes.concat(getTextNodes(node)); } } } } return textNodes; } // Helper to escape special regex characters function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // Watch for dynamic content changes const observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.addedNodes && mutation.addedNodes.length > 0) { for (let node of mutation.addedNodes) { if (node.nodeType === Node.ELEMENT_NODE) { const textNodes = getTextNodes(node); if (textNodes.length > 0) { replaceWordsInPage(); break; } } } } }); }); // Start observing changes observer.observe(document.body, { childList: true, subtree: true }); })();