diff --git a/action16.png b/action16.png new file mode 100644 index 0000000..79e83b7 Binary files /dev/null and b/action16.png differ diff --git a/action32.png b/action32.png new file mode 100644 index 0000000..daa6c05 Binary files /dev/null and b/action32.png differ diff --git a/action512.png b/action512.png new file mode 100644 index 0000000..9a2a5b6 Binary files /dev/null and b/action512.png differ diff --git a/background-script.js b/background-script.js index 94b080d..2f11625 100644 --- a/background-script.js +++ b/background-script.js @@ -3,8 +3,8 @@ 'use strict'; // We use JMdict converted to JSON. It's like 32MB so we don't want to load it for every tab. -// So we need to use a backgroudn script and send messages to it from the content script. -// Unfortunately webextensions don't have an easy way to load files even from in extension. +// So we need to use a background script and send messages to it from the content script. +// Unfortunately webextensions don't have an easy way to load files, even from in the extension. // We have to send an HTTP request and store the result in a string before parsing it into an object. // Seriously. @@ -152,17 +152,58 @@ function search(text) if(ret) return ret; } -browser.runtime.onMessage.addListener((request, sender, sendResponse) => { +browser.runtime.onMessage.addListener((request, sender, sendResponse) => +{ if (request.type == 'search') { - //console.log("running search"); sendResponse(search(request.text)); } else { - //console.log("unhandled request"); - //return; return; } }); +async function update_icon(enabled) +{ + if(enabled) + { + browser.browserAction.setIcon({path:{ + "16": "enabled16.png", + "32": "enabled32.png", + "512": "enabled512.png" + }},) + } + else + { + browser.browserAction.setIcon({path:{ + "16": "action16.png", + "32": "action32.png", + "512": "action512.png" + }},) + } +} + +async function toggle_enabled() +{ + let enabled = (await browser.storage.local.get("enabled")).enabled; + if(enabled == undefined) + enabled = false; + enabled = !enabled; + browser.storage.local.set({enabled: enabled}); + update_icon(enabled); +} + +async function init_icon() +{ + browser.browserAction.onClicked.addListener(toggle_enabled); + let enabled = (await browser.storage.local.get("enabled")).enabled; + if(enabled == undefined) + enabled = false; + update_icon(enabled); +} + +init_icon(); + + + diff --git a/enabled16.png b/enabled16.png new file mode 100644 index 0000000..29e240f Binary files /dev/null and b/enabled16.png differ diff --git a/enabled32.png b/enabled32.png new file mode 100644 index 0000000..59c72b3 Binary files /dev/null and b/enabled32.png differ diff --git a/enabled512.png b/enabled512.png new file mode 100644 index 0000000..90d9269 Binary files /dev/null and b/enabled512.png differ diff --git a/icontest.png b/icontest.png new file mode 100644 index 0000000..654f2f7 Binary files /dev/null and b/icontest.png differ diff --git a/manifest.json b/manifest.json index f8a885b..8e8eba6 100644 --- a/manifest.json +++ b/manifest.json @@ -22,5 +22,21 @@ "js": ["texthook.js"], "all_frames": true } - ] + ], + + "options_ui": { + "browser_style": true, + "page": "options.html" + }, + + "browser_action": { + "browser_style": false, + "default_icon": { + "16": "action16.png", + "32": "action32.png", + "512": "action512.png" + }, + "default_title": "Nazeka (disabled)", + "default_area": "navbar" + } } diff --git a/options.html b/options.html new file mode 100644 index 0000000..6ad21c0 --- /dev/null +++ b/options.html @@ -0,0 +1,23 @@ + + + + + +Nazeka: options + + + +
+
+
+ + + + + + +
+
+
+ + diff --git a/options.js b/options.js new file mode 100644 index 0000000..8ffdb58 --- /dev/null +++ b/options.js @@ -0,0 +1,49 @@ +function restoreListeners() +{ + document.querySelector("#enabled").addEventListener("change", setOptions); + document.querySelector("#compact").addEventListener("change", setOptions); +} +function removeListeners() +{ + document.querySelector("#enabled").removeEventListener("change", setOptions); + document.querySelector("#compact").removeEventListener("change", setOptions); +} + +async function restoreOptions() +{ + restoreListeners(); + try + { + let enabled = (await browser.storage.local.get("enabled")).enabled; + if(enabled == undefined) + enabled = false; + let compact = (await browser.storage.local.get("compact")).compact; + if(compact == undefined) + compact = true; + removeListeners(); + document.querySelector("#enabled").checked = enabled?true:false; + document.querySelector("#compact").checked = compact?true:false; + restoreListeners(); + } + catch (error){} +} + +function setOptions() +{ + browser.storage.local.set( + { + enabled: document.querySelector("#enabled").checked, + compact: document.querySelector("#compact").checked, + }); +} + +if (document.readyState == "complete") +{ + restoreOptions(); + //setOptions(); +} +else +{ + document.addEventListener("DOMContentLoaded", restoreOptions); + //document.addEventListener("DOMContentLoaded", setOptions); +} diff --git a/texthook.js b/texthook.js index dd17fd9..f8fe4fa 100644 --- a/texthook.js +++ b/texthook.js @@ -3,12 +3,11 @@ /* * TODO: * - * ! Toggle button - * ! Fix katakana-hiragana matching (only happens in lookups right now, not display generation) * ! Port all of Spark Reader's deconjugation rules https://github.com/wareya/Spark-Reader/blob/master/preferences/underlay https://github.com/wareya/Spark-Reader/tree/master/src/language/deconjugator * ! Different CSS for different parts of definitions + * - Fix katakana-hiragana matching (only happens in lookups right now, not display generation) * - Definition priority handling (prefer words with any commonness tags, shorter deconjugations, expressions, non-archaic/non-obscure words, high frequencies) - * - Settings + * - More configurability * - VNstats frequency data * - Load deconjugation rules from an advanced setting, with a reset button * - Work with text input fields @@ -26,7 +25,10 @@ function print_object(message) console.log(message); } -let compact = true; +let settings = { +enabled: false, +compact: true, +}; let last_time_display = Date.now(); @@ -46,7 +48,7 @@ function delete_div () function display_div (middle, x, y, time) { middle.style = "background-color: #111; border-radius: 2.5px; border: 1px solid #111;"; - middle.firstChild.style = "border: 1px solid white; border-radius: 2px; padding: 2px; background-color: #111; color: #CCC; font-family: Arial, sans-serif; font-size: 13px;"; + middle.firstChild.style = "border: 1px solid white; border-radius: 2px; padding: 2px; background-color: #111; color: #CCC; font-family: Arial, sans-serif; font-size: 13px; text-align: left;"; let other = document.body.getElementsByClassName(div_class); if(other.length > 0) @@ -318,13 +320,13 @@ function build_div (text, result) parts.push(sense.pos[l]); temptag += parts.join(", "); temptag += ")"; - if(compact) + if(settings.compact) temptag += " "; else temptag += "
"; temp.innerHTML += temptag; } - if(compact) + if(settings.compact) { if(goodsenses.length > 1) temp.innerHTML += " (" + (j+1) + ") "; @@ -347,7 +349,7 @@ function build_div (text, result) temp.innerHTML += temptag; } temp.innerHTML += sense.gloss.join("; "); - if(compact) + if(settings.compact) { if(sense.gloss.length > 1 || j+1 != goodsenses.length) temp.innerHTML += "; "; @@ -357,7 +359,7 @@ function build_div (text, result) temp.innerHTML += "
"; } } - if(compact) + if(settings.compact) temp.innerHTML += "
"; } middle.appendChild(temp); @@ -662,14 +664,43 @@ function lookup_cancel() delete_div(); } +let settings_reload_rate = 200; +let settings_reloader = undefined; +async function settings_reload() +{ + try + { + settings.enabled = (await browser.storage.local.get("enabled")).enabled; + if(settings.enabled == undefined) + settings.enabled = false; + settings.compact = (await browser.storage.local.get("compact")).compact; + if(settings.compact == undefined) + settings.compact = true; + //console.log("set settings"); + //console.log(settings.enabled); + //console.log(settings.compact); + } + catch(error) + { + console.log("failed to set settings, maybe not stored yet?"); + } // not stored yet, probably + + settings_reloader = setTimeout(settings_reload, settings_reload_rate); +} + +settings_reloader = setTimeout(settings_reload, settings_reload_rate); + + let max_search_len = 25; let time_of_last = Date.now(); let throttle = 8; -var seach_x_offset = -3; +let seach_x_offset = -3; window.addEventListener("mousemove", (event)=> { + if(!settings.enabled) return; + if(Date.now() - time_of_last < throttle) { //console.log("too soon, returning"); @@ -696,7 +727,7 @@ window.addEventListener("mousemove", (event)=> } // try without the offset - if (textNode.nodeType != 3) + if (textNode == undefined || textNode.nodeType != 3) { if (document.caretPositionFromPoint) { @@ -712,7 +743,7 @@ window.addEventListener("mousemove", (event)=> } } // if there was text, use it - if (textNode.nodeType == 3) + if (textNode && textNode.nodeType == 3) { //print_object(textNode); //print_object(textNode.parentNode);