List alternative lookups

This commit is contained in:
wareya committed 2017-12-17 21:55:31 -05:00
1 parent 341d187df0
commit e0635bda14
4 files changed
+178 -38

No files matched your search

+103 -19
View File
@@ -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")
{
+9
View File
@@ -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
View File
@@ -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
View File
@@ -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();