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);