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