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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if(results == undefined) return undefined;
|
||||
@@ -883,7 +895,7 @@ function sort_results(text, results)
|
||||
|
||||
let last_lookup = "";
|
||||
let last_time_lookup = Date.now();
|
||||
function lookup_indirect(text, time, divexisted)
|
||||
function lookup_indirect(text, time, divexisted, alternatives_mode, strict_alternatives)
|
||||
{
|
||||
if(text == "")
|
||||
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
|
||||
// build_lookup_comb looks for dictionary definitions matching any deconjugation, returning a list of them
|
||||
//console.log("trying to look up " + text);
|
||||
let forms = deconjugate(text);
|
||||
let result = build_lookup_comb(forms);
|
||||
while(result === undefined && text.length > 0)
|
||||
if(alternatives_mode == 0 || alternatives_mode == 1 || alternatives_mode == 2)
|
||||
{
|
||||
text = text.substring(0, text.length-1);
|
||||
//console.log("trying to look up " + text);
|
||||
forms = deconjugate(text);
|
||||
result = build_lookup_comb(forms);
|
||||
let forms = deconjugate(text);
|
||||
let result = build_lookup_comb(forms);
|
||||
while(result === undefined && text.length > 0)
|
||||
{
|
||||
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");
|
||||
//console.log(text)
|
||||
result = sort_results(text, result);
|
||||
return {text:text, result:result};
|
||||
}
|
||||
else
|
||||
{
|
||||
//console.log("did not find lookup");
|
||||
//console.log(text);
|
||||
let results = [];
|
||||
let first = true;
|
||||
while(text.length > 0)
|
||||
{
|
||||
let forms = deconjugate(text);
|
||||
let result = build_lookup_comb(forms);
|
||||
|
||||
if(!first && strict_alternatives && is_kana(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");
|
||||
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")
|
||||
{
|
||||
|
||||
@@ -24,6 +24,15 @@
|
||||
<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/>
|
||||
<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"/>
|
||||
<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/>
|
||||
|
||||
+10
@@ -15,6 +15,8 @@ function restoreListeners()
|
||||
document.querySelector("#hlcolor").addEventListener("change", setOptions);
|
||||
document.querySelector("#font").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()
|
||||
{
|
||||
@@ -33,6 +35,8 @@ function removeListeners()
|
||||
document.querySelector("#hlcolor").addEventListener("change", setOptions);
|
||||
document.querySelector("#font").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()
|
||||
@@ -61,6 +65,8 @@ async function restoreOptions()
|
||||
let hlcolor = await getvar("hlcolor", "#99DDFF");
|
||||
let font = await getvar("font", "");
|
||||
let hlfont = await getvar("hlfont", "");
|
||||
let alternatives_mode = await getvar("alternatives_mode", 0);
|
||||
let strict_alternatives = await getvar("strict_alternatives", true);
|
||||
removeListeners();
|
||||
document.querySelector("#enabled").checked = enabled?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("#font").value = font?font:"";
|
||||
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) {}
|
||||
removeListeners();
|
||||
restoreListeners();
|
||||
@@ -118,6 +126,8 @@ function setOptions()
|
||||
hlcolor: document.querySelector("#hlcolor").value,
|
||||
font: document.querySelector("#font").value,
|
||||
hlfont: document.querySelector("#hlfont").value,
|
||||
alternatives_mode: document.querySelector("#alternatives_mode").value,
|
||||
strict_alternatives: document.querySelector("#strict_alternatives").checked,
|
||||
}).then(()=>{fixicon();},()=>{});
|
||||
}
|
||||
|
||||
|
||||
+56
-19
@@ -30,6 +30,8 @@ fixedwidth: false,
|
||||
fixedwidthpositioning: false,
|
||||
superborder: false,
|
||||
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,
|
||||
width: 600,
|
||||
lookuprate: 8,
|
||||
@@ -159,14 +161,19 @@ function clip(str)
|
||||
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 (text, result)
|
||||
function build_div_inner (text, result)
|
||||
{
|
||||
//console.log("Displaying:");
|
||||
//print_object(result);
|
||||
let middle = document.createElement("div");
|
||||
console.log("building div for " + text);
|
||||
console.log(result);
|
||||
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");
|
||||
style.type = "text/css";
|
||||
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;}\
|
||||
`;
|
||||
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. する -> 為る, 刷る, 掏る, 剃る, 擦る)
|
||||
// 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.
|
||||
for(let i = 0; i < result.length; i++)
|
||||
{
|
||||
let term = result[i];
|
||||
if(term.deconj.size > 0)
|
||||
if(term.deconj)
|
||||
text = term.deconj.values().next().value.text;
|
||||
//print_object(term);
|
||||
let temptag = document.createElement("span");
|
||||
@@ -561,7 +562,31 @@ function build_div (text, result)
|
||||
if(settings.compact)
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -593,6 +618,9 @@ async function settings_init()
|
||||
getvar("font", "");
|
||||
getvar("hlfont", "");
|
||||
|
||||
getvar("alternatives_mode", 0);
|
||||
getvar("strict_alternatives", true);
|
||||
|
||||
if(!settings.enabled && exists_div())
|
||||
delete_div();
|
||||
} catch(err) {} // options not stored yet
|
||||
@@ -634,13 +662,22 @@ async function lookup_loop()
|
||||
let lookup = lookup_queue.pop();
|
||||
lookup_queue = [];
|
||||
//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");
|
||||
if(response)
|
||||
{
|
||||
let mydiv = build_div(response.text, response.result);
|
||||
if(mydiv)
|
||||
display_div(mydiv, lookup[3], lookup[4]);
|
||||
if(!response.length)
|
||||
{
|
||||
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();
|
||||
|
||||
Reference in new issue
Block a user