Files
nazeka-chromium/livemining.js
T
2026-04-27 16:13:15 +02:00

306 lines
8.6 KiB
JavaScript

'use strict';
if (typeof globalThis.browser === "undefined" && typeof chrome !== "undefined") {
globalThis.browser = {
...chrome,
runtime: {
...chrome.runtime,
sendMessage: function(message) {
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(message, response => {
const err = chrome.runtime.lastError;
if (err) {
reject(err);
} else {
resolve(response);
}
});
});
},
getURL: chrome.runtime.getURL.bind(chrome.runtime),
onMessage: chrome.runtime.onMessage
},
storage: {
...chrome.storage,
local: {
...chrome.storage.local,
get: function(keys) {
return new Promise((resolve, reject) => {
chrome.storage.local.get(keys, result => {
const err = chrome.runtime.lastError;
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
},
set: function(items) {
return new Promise((resolve, reject) => {
chrome.storage.local.set(items, () => {
const err = chrome.runtime.lastError;
if (err) {
reject(err);
} else {
resolve();
}
});
});
},
remove: function(keys) {
return new Promise((resolve, reject) => {
chrome.storage.local.remove(keys, () => {
const err = chrome.runtime.lastError;
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
},
onChanged: chrome.storage.onChanged
},
extension: {
...chrome.extension,
getURL: chrome.runtime.getURL.bind(chrome.runtime)
}
};
}
function reset_fields()
{
document.getElementById("containfields").innerHTML = "";
}
function add_option(input, text, selected=false)
{
let option = document.createElement("option");
option.value = text;
option.innerText = text;
option.selected = selected;
input.appendChild(option);
}
function add_options(input, preselect="")
{
let list = [
"nothing",
"found_spelling",
"readings",
"definitions",
"definitions_raw",
"found_text",
"context",
"context_left",
"context_right",
"audio_anki",
"audio_kanji",
"audio_reading",
"jmdict_id",
"url",
"page_title",
"time_unix",
"time_local",
"readings_raw",
"spellings_raw",
];
for (let ident of list)
{
add_option(input, ident, (ident == preselect));
}
}
function get_fields()
{
let mappings = new Map();
for(let element of document.querySelectorAll("#containfields > div"))
{
console.log(element);
mappings.set(element.querySelector("label").innerText, element.querySelector("select").value);
}
return mappings;
}
function add_field(fieldname, preselect="")
{
let div = document.createElement("div");
let input = document.createElement("select");
input.id = fieldname;
add_options(input, preselect);
let label = document.createElement("label");
label.for = fieldname;
label.innerText = fieldname;
div.appendChild(input);
div.appendChild(label);
document.getElementById("containfields").appendChild(div);
}
var __host = "http://127.0.0.1:8765";
function saveConfig()
{
let mappings = new Array();
for(let element of document.querySelectorAll("#containfields > div"))
{
console.log(element);
mappings.push([element.querySelector("label").innerText, element.querySelector("select").value]);
}
console.log(mappings);
let setstuff =
{
"livemining_deckname": document.querySelector("#deckname").value,
"livemining_modelname": document.querySelector("#modelname").value,
"livemining_fields": mappings,
};
console.log(setstuff);
browser.storage.local.set(setstuff);
}
function loadConfig()
{
let promise = browser.storage.local.get(["livemining_deckname", "livemining_modelname", "livemining_fields"]);
promise.then((storage) =>
{
if(storage["livemining_deckname"] !== undefined)
document.querySelector("#deckname").value = storage["livemining_deckname"];
if(storage["livemining_modelname"] !== undefined)
document.querySelector("#modelname").value = storage["livemining_modelname"];
reset_fields();
if(storage["livemining_fields"] !== undefined)
for(let pair of storage["livemining_fields"])
add_field(pair[0], pair[1]);
}, (e) => {console.log(e);});
}
function buildpage()
{
document.getElementById("autofields").onclick = (e) =>
{
let request = JSON.parse(`
{"action":"modelFieldNames",
"version":6,
"params": {"modelName":"Basic"}
}`);
request["params"]["modelName"] = document.getElementById("modelname").value;
let json = JSON.stringify(request);
console.log(json);
let xhr = new XMLHttpRequest();
xhr.open("POST", __host, true);
//xhr.setRequestHeader('Content-type','application/json; charset=utf-8');
xhr.addEventListener('load', () =>
{
let response = JSON.parse(xhr.responseText);
if (response.result)
{
let old_fields = get_fields();
reset_fields();
for(let fieldname of response.result)
{
let old = old_fields.get(fieldname);
if(old !== undefined)
add_field(fieldname, old);
else
add_field(fieldname);
}
}
else
{
errormessage(response.error);
}
});
xhr.addEventListener('error', () =>
{
errormessage("AnkiConnect messaging failed: unspecified error (Anki is probably not open)");
});
xhr.addEventListener('timeout', () =>
{
errormessage("AnkiConnect messaging failed: timed out");
});
xhr.send(json);
e.preventDefault();
};
document.getElementById("applyfields").onclick = saveConfig;
loadConfig();
document.getElementById("loadfields").onclick = loadConfig;
document.getElementById("upgrade").onclick = (e) =>
{
let json = `
{"action":"upgrade",
"version":6
}`;
let xhr = new XMLHttpRequest();
xhr.open("POST", __host, true);
xhr.send(json);
xhr.addEventListener('load', () =>
{
let response = JSON.parse(xhr.responseText);
if (!response.result)
{
errormessage(response.error);
}
});
xhr.addEventListener('error', () =>
{
errormessage("AnkiConnect messaging failed: unspecified error (Anki is probably not open)");
});
xhr.addEventListener('timeout', () =>
{
errormessage("AnkiConnect messaging failed: timed out");
});
e.preventDefault();
};
}
if (document.readyState == "complete")
{
buildpage();
}
else
{
document.addEventListener("DOMContentLoaded", buildpage);
}
function errormessage(text)
{
if(!text) return;
let mydiv = document.createElement("div");
mydiv.style = "background-color: #111; color: #CCC; font-family: Arial, sans-serif; font-size: 13px; width: 300px; border: 3px double red; position: fixed; right: 25px; top: 25px; z-index: 1000000000000000000000; padding: 5px; border-radius: 3px;"
mydiv.textContent = text;
document.body.appendChild(mydiv);
function delete_later()
{
mydiv.remove();
}
setTimeout(delete_later, 3000);
}