start implementing import-based epwing lookups
This commit is contained in:
1 parent
031ae7c5c6
commit
1e8447cda3
4 files changed
+178
-64
No files matched your search
+103
-62
@@ -8,12 +8,26 @@
|
||||
// We have to send an HTTP request and store the result in a string before parsing it into an object.
|
||||
// Seriously.
|
||||
|
||||
let epwing = [
|
||||
// Fill this out with some testing data from a json file generated by zero-epwing so that it looks something like this screenshot: https://i.imgur.com/waTYH1i.png
|
||||
];
|
||||
let epwing = [];
|
||||
let lookup_epwing_kan = new Map();
|
||||
let lookup_epwing_kana = new Map();
|
||||
|
||||
async function refresh_epwing()
|
||||
{
|
||||
epwing = (await browser.storage.local.get("epwing"))["epwing"];
|
||||
lookup_epwing_kan = new Map();
|
||||
lookup_epwing_kana = new Map();
|
||||
for (let i = 1; i < epwing.length; i++)
|
||||
{
|
||||
if(typeof epwing[i] === 'string' || epwing[i] instanceof String)
|
||||
continue;
|
||||
add_epwing_id(epwing[i]["r"], i);
|
||||
for(let spelling of epwing[i]["s"])
|
||||
add_epwing_id(spelling, i);
|
||||
}
|
||||
}
|
||||
refresh_epwing();
|
||||
|
||||
function string_is_kana(str)
|
||||
{
|
||||
for(let i = 0; i < str.length; i++)
|
||||
@@ -22,10 +36,13 @@ function string_is_kana(str)
|
||||
if(!(codepoint >= 0x3040 && codepoint <= 0x30FF))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function add_epwing_id(id, i)
|
||||
{
|
||||
if(id === "")
|
||||
return;
|
||||
if(string_is_kana(id))
|
||||
{
|
||||
if (!lookup_epwing_kana.has(id))
|
||||
@@ -42,45 +59,6 @@ function add_epwing_id(id, i)
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: this is almost certainly only the format of the kenkyuusha epwing dictionary. others might be completely different.
|
||||
for (let i = 0; i < epwing.length; i++)
|
||||
{
|
||||
let heading = epwing[i]["heading"];
|
||||
let text = epwing[i]["text"];
|
||||
if(heading.startsWith("¶"))
|
||||
{
|
||||
let id = heading.match(/¶([^<]*)/)[1].trim();
|
||||
// there's stuff inside the brackets but it doesn't represent this dictionary entry, just another one where it appears
|
||||
add_epwing_id(id, i);
|
||||
}
|
||||
else if(heading.includes("<") && heading.includes("【"))
|
||||
{
|
||||
let useful = heading.match(/<(.*)>/)[1].trim();
|
||||
let kana = useful.match(/([^【]*)/)[1].trim();
|
||||
let kanji = useful.match(/【([^】]*)/)[1].trim();
|
||||
add_epwing_id(kanji, i);
|
||||
add_epwing_id(kana, i);
|
||||
}
|
||||
else if(heading.includes("<") && !heading.includes("【"))
|
||||
{
|
||||
let kana = heading.match(/([^<]*)/)[1].trim();
|
||||
let kanji = heading.match(/<(.*)>/)[1].trim();
|
||||
add_epwing_id(kanji, i);
|
||||
add_epwing_id(kana, i);
|
||||
}
|
||||
else if(text.split(/\\n/)[0].includes("【"))
|
||||
{
|
||||
let useful = text.match(/([^】]*】)/)[1].trim();
|
||||
let kana = useful.match(/([^【]*)/)[1].trim();
|
||||
let kanji = useful.match(/【([^】]*)/)[1].trim();
|
||||
add_epwing_id(kanji, i);
|
||||
add_epwing_id(kana, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
console.log(`Unknown kind of entry at index ${i} in epwing dictionary`);
|
||||
}
|
||||
}
|
||||
|
||||
let dict = [];
|
||||
let lookup_kan = new Map();
|
||||
@@ -851,14 +829,15 @@ function add_epwing_info(lookups)
|
||||
for(let entry of lookup.result)
|
||||
{
|
||||
// look for an epwing entry that matches this lookup and jmdict entry
|
||||
let epwing_data = "";
|
||||
let epwing_data = undefined;
|
||||
let foundtext = undefined;
|
||||
if(entry.orig_found.keb)
|
||||
foundtext = entry.orig_found.keb;
|
||||
else
|
||||
foundtext = entry.orig_found.reb;
|
||||
|
||||
let exact = false;
|
||||
let exact = 0;
|
||||
// TODO: figure out which of these .includes() calls should be equality tests instead. definitely some of them, definitely not all of them.
|
||||
if(entry.k_ele)
|
||||
{
|
||||
for(let spelling of entry.k_ele)
|
||||
@@ -866,48 +845,104 @@ function add_epwing_info(lookups)
|
||||
let text = spelling.keb;
|
||||
if (lookup_epwing_kan.has(text))
|
||||
{
|
||||
console.log("looking for epwing possibilities");
|
||||
let possibilities = lookup_epwing_kan.get(text);
|
||||
// FIXME we want to try epwing matches in the order they match the epwing entry's spellings/readings instead of the order they're in in the map.get() return list
|
||||
for(let wing of possibilities)
|
||||
{
|
||||
if(epwing[wing] && epwing[wing]["text"])
|
||||
console.log("checking an epwing possibility");
|
||||
if(epwing[wing] && epwing[wing]["l"])
|
||||
{
|
||||
if(epwing_data == "")
|
||||
if(epwing_data == undefined)
|
||||
{
|
||||
epwing_data = epwing[wing]["text"];
|
||||
// FIXME: using .includes() is too loose. just simpler than adding real arrays of spellings/readings to the epwing data on load.
|
||||
exact = (epwing[wing]["heading"].includes(foundtext) || epwing[wing]["text"].includes(foundtext));
|
||||
epwing_data = epwing[wing];
|
||||
exact = epwing[wing]["r"].includes(foundtext);
|
||||
for(let spelling of epwing[wing]["s"])
|
||||
exact |= spelling.includes(foundtext);
|
||||
// FIXME duplicated
|
||||
if(exact)
|
||||
{
|
||||
for(let reading of entry.r_ele)
|
||||
{
|
||||
let text = reading.reb;
|
||||
if(epwing[wing]["r"].includes(text))
|
||||
exact = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(!exact && (epwing[wing]["heading"].includes(foundtext) || epwing[wing]["text"].includes(foundtext)))
|
||||
else if(exact == 0)
|
||||
{
|
||||
epwing_data = epwing[wing]["text"];
|
||||
exact = true;
|
||||
exact |= epwing[wing]["r"].includes(foundtext);
|
||||
for(let spelling of epwing[wing]["s"])
|
||||
exact |= spelling.includes(foundtext);
|
||||
if(exact)
|
||||
{
|
||||
for(let reading of entry.r_ele)
|
||||
{
|
||||
let text = reading.reb;
|
||||
if(epwing[wing]["r"].includes(text))
|
||||
exact = 2;
|
||||
}
|
||||
epwing_data = epwing[wing];
|
||||
}
|
||||
}
|
||||
else if(exact == 1)
|
||||
{
|
||||
let maybe_more_exact = epwing[wing]["r"].includes(foundtext);
|
||||
for(let spelling of epwing[wing]["s"])
|
||||
maybe_more_exact |= spelling.includes(foundtext);
|
||||
if(maybe_more_exact)
|
||||
{
|
||||
for(let reading of entry.r_ele)
|
||||
{
|
||||
let text = reading.reb;
|
||||
if(epwing[wing]["r"].includes(text))
|
||||
{
|
||||
exact = 2;
|
||||
epwing_data = epwing[wing];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(epwing_data == "" && entry.r_ele)
|
||||
if(epwing_data == undefined && entry.r_ele)
|
||||
{
|
||||
for(let spelling of entry.r_ele)
|
||||
for(let reading of entry.r_ele)
|
||||
{
|
||||
let text = spelling.reb;
|
||||
let text = reading.reb;
|
||||
|
||||
console.log(`checking if lookup ${text} in structure`);
|
||||
if (lookup_epwing_kana.has(text))
|
||||
{
|
||||
console.log("looking for epwing possibilities");
|
||||
let possibilities = lookup_epwing_kana.get(text);
|
||||
for(let wing of possibilities)
|
||||
{
|
||||
if(epwing[wing] && epwing[wing]["text"])
|
||||
console.log("checking an epwing possibility");
|
||||
if(epwing[wing] && epwing[wing]["l"])
|
||||
{
|
||||
if(epwing_data == "")
|
||||
if(epwing_data == undefined)
|
||||
{
|
||||
epwing_data = epwing[wing]["text"];
|
||||
exact = (epwing[wing]["heading"].includes(foundtext) || epwing[wing]["text"].includes(foundtext));
|
||||
epwing_data = epwing[wing];
|
||||
exact = epwing[wing]["r"].includes(foundtext);
|
||||
}
|
||||
else if(!exact && (epwing[wing]["heading"].includes(foundtext) || epwing[wing]["text"].includes(foundtext)))
|
||||
else if(exact == 0)
|
||||
{
|
||||
epwing_data = epwing[wing]["text"];
|
||||
exact = true;
|
||||
exact |= epwing[wing]["r"].includes(foundtext);
|
||||
if(exact)
|
||||
epwing_data = epwing[wing];
|
||||
}
|
||||
else if(exact == 1)
|
||||
{
|
||||
if(epwing[wing]["s"].length == 1 && epwing[wing]["s"][0] === "" && epwing[wing]["r"].includes(foundtext))
|
||||
{
|
||||
exact = 2;
|
||||
epwing_data = epwing[wing];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -915,6 +950,8 @@ function add_epwing_info(lookups)
|
||||
}
|
||||
}
|
||||
entry.epwing = epwing_data;
|
||||
if(entry.epwing && (typeof epwing[0] === 'string' || epwing[0] instanceof String))
|
||||
entry.epwing["z"] = epwing[0];
|
||||
}
|
||||
}
|
||||
return lookups;
|
||||
@@ -1522,6 +1559,10 @@ browser.runtime.onMessage.addListener((req, sender, sendResponse) =>
|
||||
{
|
||||
clipboard_hook(sender.tab);
|
||||
}
|
||||
else if (req.type == "refreshepwing")
|
||||
{
|
||||
refresh_epwing();
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
</form>
|
||||
|
||||
<div class=dictstuff>
|
||||
<h2>About</h2>
|
||||
<p>This extension uses JMdict, which is Copyright © 2017 The Electronic Dictionary Research and Development Group and licensed under the <a href="https://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA 3.0</a> license.</p>
|
||||
<p>This extension is otherwise licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.</p>
|
||||
<div><p>Meanings of abbreviations follow. From JMdict. Some may be unused. Unsorted.<p>
|
||||
|
||||
+39
-1
@@ -164,6 +164,12 @@ function defaults()
|
||||
default: "",
|
||||
label: "Font override (highlighted text only) (without trailing comma)"
|
||||
});
|
||||
|
||||
// other (added procedurally)
|
||||
settings.push({
|
||||
kind: "dummy",
|
||||
label: "Other"
|
||||
});
|
||||
}
|
||||
defaults();
|
||||
|
||||
@@ -258,7 +264,6 @@ function buildpage()
|
||||
|
||||
let label = document.createElement("label");
|
||||
label.for = option.id;
|
||||
label.className = "panel-formElements-item";
|
||||
let labelText = document.createTextNode(option.label);
|
||||
|
||||
if(option.kind == "checkbox")
|
||||
@@ -281,6 +286,39 @@ function buildpage()
|
||||
container.style.marginBottom = "8px";
|
||||
optionsection.appendChild(container);
|
||||
}
|
||||
let file = document.createElement("input");
|
||||
file.type = "file";
|
||||
file.id = "file";
|
||||
file.addEventListener("change", () =>
|
||||
{
|
||||
let fname = document.querySelector("#file").files[0];
|
||||
let fr = new FileReader();
|
||||
fr.onload = (e) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
document.querySelector("#import_label").textContent = "Importing...";
|
||||
browser.storage.local.set({"epwing":JSON.parse(e.target.result)});
|
||||
browser.runtime.sendMessage({type:"refreshepwing"});
|
||||
document.querySelector("#import_label").textContent = "Imported. Might take a few seconds to apply.";
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
console.log(e);
|
||||
}
|
||||
};
|
||||
fr.readAsText(fname);
|
||||
});
|
||||
let label = document.createElement("label");
|
||||
label.for = file.id;
|
||||
label.id = "import_label";
|
||||
label.textContent = "Import thin dictionary";
|
||||
label.style.display = "block";
|
||||
|
||||
optionsection.appendChild(file);
|
||||
optionsection.appendChild(label);
|
||||
|
||||
optionsection.appendChild(document.createElement("hr"));
|
||||
}
|
||||
|
||||
async function restoreOptions()
|
||||
|
||||
+35
-1
@@ -278,6 +278,8 @@ function build_div_inner (text, result)
|
||||
`.nazeka_main_keb{font-family: ${font}IPAGothic,TakaoGothic,Noto Sans CJK JP Regular,Meiryo,sans-serif;font-size:18px;color:${settings.hlcolor}}\
|
||||
.nazeka_main_reb{font-family: ${font}IPAGothic,TakaoGothic,Noto Sans CJK JP Regular,Meiryo,sans-serif;font-size:18px;color:${settings.hlcolor}}\
|
||||
.nazeka_original{float: right; margin-right: 2px; margin-left:4px; opacity:0.7;}\
|
||||
.epwing_head{margin: 6px 8px 4px;}
|
||||
.epwing_definition{margin: 0 8px;}\
|
||||
`;
|
||||
temp.appendChild(style);
|
||||
|
||||
@@ -593,7 +595,39 @@ function build_div_inner (text, result)
|
||||
if(term.epwing)
|
||||
{
|
||||
definition.appendChild(document.createElement("br"));
|
||||
definition.appendChild(document.createTextNode(term.epwing));
|
||||
let epwing_head = document.createElement("div");
|
||||
epwing_head.appendChild(document.createTextNode("―"+term.epwing["z"]+"―"));
|
||||
epwing_head.appendChild(document.createElement("br"));
|
||||
let epwing_head_text = term.epwing["r"];
|
||||
if(term.epwing["s"] && term.epwing["s"][0] != "")
|
||||
{
|
||||
let isfirst = true;
|
||||
epwing_head_text += "【";
|
||||
for(let spelling of term.epwing["s"])
|
||||
{
|
||||
if(!isfirst)
|
||||
epwing_head_text += "・";
|
||||
epwing_head_text += spelling;
|
||||
isfirst = false;
|
||||
}
|
||||
epwing_head_text += "】";
|
||||
}
|
||||
epwing_head.appendChild(document.createTextNode(epwing_head_text));
|
||||
let epwing_definition = document.createElement("div");
|
||||
let isfirst = true;
|
||||
for(let line of term.epwing["l"])
|
||||
{
|
||||
if(!isfirst)
|
||||
epwing_definition.appendChild(document.createElement("br"));
|
||||
let def_line = document.createElement("span");
|
||||
def_line.textContent = line;
|
||||
epwing_definition.appendChild(def_line);
|
||||
isfirst = false;
|
||||
}
|
||||
epwing_head.className = "epwing_head";
|
||||
epwing_definition.className = "epwing_definition";
|
||||
definition.appendChild(epwing_head);
|
||||
definition.appendChild(epwing_definition);
|
||||
}
|
||||
container.appendChild(definition);
|
||||
if(settings.corner == 2 || settings.corner == 3)
|
||||
|
||||
Reference in new issue
Block a user