List alternative lookups
This commit is contained in:
1 parent
341d187df0
commit
e0635bda14
4 files changed
+178
-38
No files matched your search
+103
-19
@@ -843,6 +843,18 @@ function has_pri(object)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function filter_kana_ish_results(results)
|
||||||
|
{
|
||||||
|
if(results == undefined) return;
|
||||||
|
let newresults = [];
|
||||||
|
for(let entry of results)
|
||||||
|
{
|
||||||
|
if(is_kana(entry) || prefers_kana(entry))
|
||||||
|
newresults.push(entry);
|
||||||
|
}
|
||||||
|
return newresults;
|
||||||
|
}
|
||||||
|
|
||||||
function sort_results(text, results)
|
function sort_results(text, results)
|
||||||
{
|
{
|
||||||
if(results == undefined) return undefined;
|
if(results == undefined) return undefined;
|
||||||
@@ -883,7 +895,7 @@ function sort_results(text, results)
|
|||||||
|
|
||||||
let last_lookup = "";
|
let last_lookup = "";
|
||||||
let last_time_lookup = Date.now();
|
let last_time_lookup = Date.now();
|
||||||
function lookup_indirect(text, time, divexisted)
|
function lookup_indirect(text, time, divexisted, alternatives_mode, strict_alternatives)
|
||||||
{
|
{
|
||||||
if(text == "")
|
if(text == "")
|
||||||
return;
|
return;
|
||||||
@@ -898,26 +910,98 @@ function lookup_indirect(text, time, divexisted)
|
|||||||
// deconjugate() returns possible deconjugations, one of which has zero deconjugations, i.e. the plain text
|
// deconjugate() returns possible deconjugations, one of which has zero deconjugations, i.e. the plain text
|
||||||
// build_lookup_comb looks for dictionary definitions matching any deconjugation, returning a list of them
|
// build_lookup_comb looks for dictionary definitions matching any deconjugation, returning a list of them
|
||||||
//console.log("trying to look up " + text);
|
//console.log("trying to look up " + text);
|
||||||
let forms = deconjugate(text);
|
if(alternatives_mode == 0 || alternatives_mode == 1 || alternatives_mode == 2)
|
||||||
let result = build_lookup_comb(forms);
|
|
||||||
while(result === undefined && text.length > 0)
|
|
||||||
{
|
{
|
||||||
text = text.substring(0, text.length-1);
|
let forms = deconjugate(text);
|
||||||
//console.log("trying to look up " + text);
|
let result = build_lookup_comb(forms);
|
||||||
forms = deconjugate(text);
|
while(result === undefined && text.length > 0)
|
||||||
result = build_lookup_comb(forms);
|
{
|
||||||
|
text = text.substring(0, text.length-1);
|
||||||
|
//console.log("trying to look up " + text);
|
||||||
|
forms = deconjugate(text);
|
||||||
|
result = build_lookup_comb(forms);
|
||||||
|
}
|
||||||
|
if(result !== undefined && result.length > 0)
|
||||||
|
{
|
||||||
|
//console.log("found lookup");
|
||||||
|
//console.log(text)
|
||||||
|
result = sort_results(text, result);
|
||||||
|
if(alternatives_mode == 0 || text.length <= 1)
|
||||||
|
return {text:text, result:result};
|
||||||
|
else if(alternatives_mode == 1) // second longest too
|
||||||
|
{
|
||||||
|
let len = text.length-1;
|
||||||
|
let short_text = text.substring(0, len);
|
||||||
|
let short_forms = deconjugate(short_text);
|
||||||
|
let short_result = build_lookup_comb(short_forms);
|
||||||
|
|
||||||
|
while(short_result === undefined && len > 0)
|
||||||
|
{
|
||||||
|
len--;
|
||||||
|
short_text = text.substring(0, len);
|
||||||
|
short_forms = deconjugate(short_text);
|
||||||
|
short_result = build_lookup_comb(short_forms);
|
||||||
|
}
|
||||||
|
if(strict_alternatives && is_kana(short_text))
|
||||||
|
short_result = filter_kana_ish_results(short_result);
|
||||||
|
if(short_result !== undefined && short_result.length > 0)
|
||||||
|
{
|
||||||
|
short_result = sort_results(short_text, short_result);
|
||||||
|
return [{text:text, result:result}, {text:short_text, result:short_result}];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return {text:text, result:result};
|
||||||
|
}
|
||||||
|
else if(alternatives_mode == 2) // shortest too
|
||||||
|
{
|
||||||
|
let len = 1;
|
||||||
|
let short_text = text.substring(0, len);
|
||||||
|
let short_forms = deconjugate(short_text);
|
||||||
|
let short_result = build_lookup_comb(short_forms);
|
||||||
|
|
||||||
|
while(short_result === undefined && short_text.length+1 < text.length)
|
||||||
|
{
|
||||||
|
len++;
|
||||||
|
short_text = text.substring(0, len);
|
||||||
|
short_forms = deconjugate(short_text);
|
||||||
|
short_result = build_lookup_comb(short_forms);
|
||||||
|
}
|
||||||
|
if(strict_alternatives && is_kana(short_text))
|
||||||
|
short_result = filter_kana_ish_results(short_result);
|
||||||
|
if(short_result !== undefined && short_result.length > 0)
|
||||||
|
{
|
||||||
|
short_result = sort_results(short_text, short_result);
|
||||||
|
return [{text:text, result:result}, {text:short_text, result:short_result}];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return {text:text, result:result};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(result !== undefined)
|
else if(alternatives_mode == 3)
|
||||||
{
|
{
|
||||||
//console.log("found lookup");
|
let results = [];
|
||||||
//console.log(text)
|
let first = true;
|
||||||
result = sort_results(text, result);
|
while(text.length > 0)
|
||||||
return {text:text, result:result};
|
{
|
||||||
}
|
let forms = deconjugate(text);
|
||||||
else
|
let result = build_lookup_comb(forms);
|
||||||
{
|
|
||||||
//console.log("did not find lookup");
|
if(!first && strict_alternatives && is_kana(text))
|
||||||
//console.log(text);
|
result = filter_kana_ish_results(result);
|
||||||
|
|
||||||
|
if(result !== undefined && result.length > 0)
|
||||||
|
{
|
||||||
|
result = sort_results(text, result);
|
||||||
|
results.push({text:text, result:result});
|
||||||
|
}
|
||||||
|
text = text.substring(0, text.length-1);
|
||||||
|
if(results.length > 0)
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
console.log(results);
|
||||||
|
if(results.length > 0)
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1036,7 +1120,7 @@ browser.runtime.onMessage.addListener((req, sender, sendResponse) =>
|
|||||||
//console.log("received message to background script");
|
//console.log("received message to background script");
|
||||||
if (req.type == "search")
|
if (req.type == "search")
|
||||||
{
|
{
|
||||||
sendResponse(lookup_indirect(req.text, req.time, req.divexisted));
|
sendResponse(lookup_indirect(req.text, req.time, req.divexisted, req.alternatives_mode, req.strict_alternatives));
|
||||||
}
|
}
|
||||||
else if (req.type == "fixicon")
|
else if (req.type == "fixicon")
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,15 @@
|
|||||||
<label for=fixedwidthpositioning class=panel-formElements-item>Position as though fixed width</label><br>
|
<label for=fixedwidthpositioning class=panel-formElements-item>Position as though fixed width</label><br>
|
||||||
<input id="length" type="number" min="6" max="100" value="25" name=length/>
|
<input id="length" type="number" min="6" max="100" value="25" name=length/>
|
||||||
<label for=length class=panel-formElements-item>Search length (characters) (default 25, sane values are from 25 to 50)</label><br>
|
<label for=length class=panel-formElements-item>Search length (characters) (default 25, sane values are from 25 to 50)</label><br>
|
||||||
|
<select id="alternatives_mode" type="checkbox" name=alternatives_mode>
|
||||||
|
<option value=0>Longest match only</option>
|
||||||
|
<option value=1>Longest and shortest match</option>
|
||||||
|
<option value=2>Longest and second longest match</option>
|
||||||
|
<option value=3>All matches</option>
|
||||||
|
</select>
|
||||||
|
<label for=alternatives_mode class=panel-formElements-item>Matching mode</label><br>
|
||||||
|
<input id="strict_alternatives" type="checkbox" name=strict_alternatives/>
|
||||||
|
<label for=strict_alternatives class=panel-formElements-item>Strict matching for alternative matches</label><br>
|
||||||
<input id="scale" type="number" min="0.1" max="64" value="1" name=scale step="0.1"/>
|
<input id="scale" type="number" min="0.1" max="64" value="1" name=scale step="0.1"/>
|
||||||
<label for=scale class=panel-formElements-item>Lookup popup scale</label><br>
|
<label for=scale class=panel-formElements-item>Lookup popup scale</label><br>
|
||||||
<input id="width" type="number" min="100" max="10000" value="600" name=width/>
|
<input id="width" type="number" min="100" max="10000" value="600" name=width/>
|
||||||
|
|||||||
+10
@@ -15,6 +15,8 @@ function restoreListeners()
|
|||||||
document.querySelector("#hlcolor").addEventListener("change", setOptions);
|
document.querySelector("#hlcolor").addEventListener("change", setOptions);
|
||||||
document.querySelector("#font").addEventListener("change", setOptions);
|
document.querySelector("#font").addEventListener("change", setOptions);
|
||||||
document.querySelector("#hlfont").addEventListener("change", setOptions);
|
document.querySelector("#hlfont").addEventListener("change", setOptions);
|
||||||
|
document.querySelector("#alternatives_mode").addEventListener("change", setOptions);
|
||||||
|
document.querySelector("#strict_alternatives").addEventListener("change", setOptions);
|
||||||
}
|
}
|
||||||
function removeListeners()
|
function removeListeners()
|
||||||
{
|
{
|
||||||
@@ -33,6 +35,8 @@ function removeListeners()
|
|||||||
document.querySelector("#hlcolor").addEventListener("change", setOptions);
|
document.querySelector("#hlcolor").addEventListener("change", setOptions);
|
||||||
document.querySelector("#font").addEventListener("change", setOptions);
|
document.querySelector("#font").addEventListener("change", setOptions);
|
||||||
document.querySelector("#hlfont").addEventListener("change", setOptions);
|
document.querySelector("#hlfont").addEventListener("change", setOptions);
|
||||||
|
document.querySelector("#alternatives_mode").addEventListener("change", setOptions);
|
||||||
|
document.querySelector("#strict_alternatives").addEventListener("change", setOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function restoreOptions()
|
async function restoreOptions()
|
||||||
@@ -61,6 +65,8 @@ async function restoreOptions()
|
|||||||
let hlcolor = await getvar("hlcolor", "#99DDFF");
|
let hlcolor = await getvar("hlcolor", "#99DDFF");
|
||||||
let font = await getvar("font", "");
|
let font = await getvar("font", "");
|
||||||
let hlfont = await getvar("hlfont", "");
|
let hlfont = await getvar("hlfont", "");
|
||||||
|
let alternatives_mode = await getvar("alternatives_mode", 0);
|
||||||
|
let strict_alternatives = await getvar("strict_alternatives", true);
|
||||||
removeListeners();
|
removeListeners();
|
||||||
document.querySelector("#enabled").checked = enabled?true:false;
|
document.querySelector("#enabled").checked = enabled?true:false;
|
||||||
document.querySelector("#compact").checked = compact?true:false;
|
document.querySelector("#compact").checked = compact?true:false;
|
||||||
@@ -77,6 +83,8 @@ async function restoreOptions()
|
|||||||
document.querySelector("#hlcolor").value = hlcolor?hlcolor:"#99DDFF";
|
document.querySelector("#hlcolor").value = hlcolor?hlcolor:"#99DDFF";
|
||||||
document.querySelector("#font").value = font?font:"";
|
document.querySelector("#font").value = font?font:"";
|
||||||
document.querySelector("#hlfont").value = hlfont?hlfont:"";
|
document.querySelector("#hlfont").value = hlfont?hlfont:"";
|
||||||
|
document.querySelector("#alternatives_mode").value = alternatives_mode?alternatives_mode:0;
|
||||||
|
document.querySelector("#strict_alternatives").checked = strict_alternatives?strict_alternatives:true;
|
||||||
} catch (error) {}
|
} catch (error) {}
|
||||||
removeListeners();
|
removeListeners();
|
||||||
restoreListeners();
|
restoreListeners();
|
||||||
@@ -118,6 +126,8 @@ function setOptions()
|
|||||||
hlcolor: document.querySelector("#hlcolor").value,
|
hlcolor: document.querySelector("#hlcolor").value,
|
||||||
font: document.querySelector("#font").value,
|
font: document.querySelector("#font").value,
|
||||||
hlfont: document.querySelector("#hlfont").value,
|
hlfont: document.querySelector("#hlfont").value,
|
||||||
|
alternatives_mode: document.querySelector("#alternatives_mode").value,
|
||||||
|
strict_alternatives: document.querySelector("#strict_alternatives").checked,
|
||||||
}).then(()=>{fixicon();},()=>{});
|
}).then(()=>{fixicon();},()=>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+56
-19
@@ -30,6 +30,8 @@ fixedwidth: false,
|
|||||||
fixedwidthpositioning: false,
|
fixedwidthpositioning: false,
|
||||||
superborder: false,
|
superborder: false,
|
||||||
showoriginal: true,
|
showoriginal: true,
|
||||||
|
alternatives_mode: 0, // 0: longest only; 1: longest and shortest; 2: longest and second longest; 3: all matches
|
||||||
|
strict_alternatives: true, // if true, alternatives looked up in all kana can not return results with kanji glosses that don't have any usually/exclusively kana info
|
||||||
scale: 1,
|
scale: 1,
|
||||||
width: 600,
|
width: 600,
|
||||||
lookuprate: 8,
|
lookuprate: 8,
|
||||||
@@ -159,14 +161,19 @@ function clip(str)
|
|||||||
return str.substring(1, str.length-1);
|
return str.substring(1, str.length-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: redundant garbage, find a way to deduplicate a lot of the logical parts of this
|
function build_div_inner (text, result)
|
||||||
function build_div (text, result)
|
|
||||||
{
|
{
|
||||||
//console.log("Displaying:");
|
console.log("building div for " + text);
|
||||||
//print_object(result);
|
console.log(result);
|
||||||
let middle = document.createElement("div");
|
|
||||||
let temp = document.createElement("div");
|
let temp = document.createElement("div");
|
||||||
// TODO: link to this instead of hardcoding it; work on unhardcoding other CSS too
|
if(settings.showoriginal)
|
||||||
|
{
|
||||||
|
let original = document.createElement("div");
|
||||||
|
original.className = "nazeka_original";
|
||||||
|
original.textContent = "Looked up " + text;
|
||||||
|
temp.appendChild(original);
|
||||||
|
}
|
||||||
|
|
||||||
let style = document.createElement("style");
|
let style = document.createElement("style");
|
||||||
style.type = "text/css";
|
style.type = "text/css";
|
||||||
let font = settings.hlfont.trim();
|
let font = settings.hlfont.trim();
|
||||||
@@ -180,20 +187,14 @@ function build_div (text, result)
|
|||||||
.nazeka_original{float: right; margin-right: 2px; margin-left:4px; opacity:0.7;}\
|
.nazeka_original{float: right; margin-right: 2px; margin-left:4px; opacity:0.7;}\
|
||||||
`;
|
`;
|
||||||
temp.appendChild(style);
|
temp.appendChild(style);
|
||||||
if(settings.showoriginal)
|
|
||||||
{
|
|
||||||
let original = document.createElement("div");
|
|
||||||
original.className = "nazeka_original";
|
|
||||||
original.textContent = "Looked up " + text;
|
|
||||||
temp.appendChild(original);
|
|
||||||
}
|
|
||||||
// lookups can have multiple results (e.g. する -> 為る, 刷る, 掏る, 剃る, 擦る)
|
// lookups can have multiple results (e.g. する -> 為る, 刷る, 掏る, 剃る, 擦る)
|
||||||
// FIXME: A bunch of code here depends on the literal text used to run the search instead of the text with which the search succeeded.
|
// FIXME: A bunch of code here depends on the literal text used to run the search instead of the text with which the search succeeded.
|
||||||
// The search can convert between hiragana and katakana to find a valid match, so we should know what text it actually used.
|
// The search can convert between hiragana and katakana to find a valid match, so we should know what text it actually used.
|
||||||
for(let i = 0; i < result.length; i++)
|
for(let i = 0; i < result.length; i++)
|
||||||
{
|
{
|
||||||
let term = result[i];
|
let term = result[i];
|
||||||
if(term.deconj.size > 0)
|
if(term.deconj)
|
||||||
text = term.deconj.values().next().value.text;
|
text = term.deconj.values().next().value.text;
|
||||||
//print_object(term);
|
//print_object(term);
|
||||||
let temptag = document.createElement("span");
|
let temptag = document.createElement("span");
|
||||||
@@ -561,7 +562,31 @@ function build_div (text, result)
|
|||||||
if(settings.compact)
|
if(settings.compact)
|
||||||
temp.appendChild(document.createElement("br"));
|
temp.appendChild(document.createElement("br"));
|
||||||
}
|
}
|
||||||
middle.appendChild(temp);
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_div_intermediary()
|
||||||
|
{
|
||||||
|
let middle = document.createElement("div");
|
||||||
|
let inner = document.createElement("div");
|
||||||
|
middle.appendChild(inner);
|
||||||
|
return middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: redundant garbage, find a way to deduplicate a lot of the logical parts of this
|
||||||
|
function build_div (text, result)
|
||||||
|
{
|
||||||
|
let middle = build_div_intermediary();
|
||||||
|
middle.firstChild.appendChild(build_div_inner(text, result));
|
||||||
|
return middle;
|
||||||
|
}
|
||||||
|
function build_div_compound (results)
|
||||||
|
{
|
||||||
|
//console.log("Displaying:");
|
||||||
|
//print_object(result);
|
||||||
|
let middle = build_div_intermediary();
|
||||||
|
for(let lookup of results)
|
||||||
|
middle.firstChild.appendChild(build_div_inner(lookup.text, lookup.result));
|
||||||
return middle;
|
return middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -593,6 +618,9 @@ async function settings_init()
|
|||||||
getvar("font", "");
|
getvar("font", "");
|
||||||
getvar("hlfont", "");
|
getvar("hlfont", "");
|
||||||
|
|
||||||
|
getvar("alternatives_mode", 0);
|
||||||
|
getvar("strict_alternatives", true);
|
||||||
|
|
||||||
if(!settings.enabled && exists_div())
|
if(!settings.enabled && exists_div())
|
||||||
delete_div();
|
delete_div();
|
||||||
} catch(err) {} // options not stored yet
|
} catch(err) {} // options not stored yet
|
||||||
@@ -634,13 +662,22 @@ async function lookup_loop()
|
|||||||
let lookup = lookup_queue.pop();
|
let lookup = lookup_queue.pop();
|
||||||
lookup_queue = [];
|
lookup_queue = [];
|
||||||
//console.log("asking background to search the dictionary");
|
//console.log("asking background to search the dictionary");
|
||||||
let response = await browser.runtime.sendMessage({type:"search", text:lookup[0], time:Date.now(), divexisted:exists_div()});
|
let response = await browser.runtime.sendMessage({type:"search", text:lookup[0], time:Date.now(), divexisted:exists_div(), alternatives_mode:settings.alternatives_mode, strict_alternatives:settings.strict_alternatives});
|
||||||
//console.log("got response");
|
//console.log("got response");
|
||||||
if(response)
|
if(response)
|
||||||
{
|
{
|
||||||
let mydiv = build_div(response.text, response.result);
|
if(!response.length)
|
||||||
if(mydiv)
|
{
|
||||||
display_div(mydiv, lookup[3], lookup[4]);
|
let mydiv = build_div(response.text, response.result);
|
||||||
|
if(mydiv)
|
||||||
|
display_div(mydiv, lookup[3], lookup[4]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
let mydiv = build_div_compound(response);
|
||||||
|
if(mydiv)
|
||||||
|
display_div(mydiv, lookup[3], lookup[4]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let t_end = Date.now();
|
let t_end = Date.now();
|
||||||
|
|||||||
Reference in new issue
Block a user