add parser selection

This commit is contained in:
siikamiika 2019-11-12 23:57:21 +02:00
parent 84f30113e4
commit 9dff658640
3 changed files with 95 additions and 28 deletions

View File

@ -313,7 +313,8 @@ function profileOptionsCreateDefaults() {
parsing: { parsing: {
enableScanningParser: true, enableScanningParser: true,
enableMecabParser: false enableMecabParser: false,
selectedParser = null
}, },
anki: { anki: {

View File

@ -23,7 +23,10 @@ class QueryParser {
this.pendingLookup = false; this.pendingLookup = false;
this.clickScanPrevent = false; this.clickScanPrevent = false;
this.parseResults = [];
this.queryParser = document.querySelector('#query-parser'); this.queryParser = document.querySelector('#query-parser');
this.queryParserSelect = document.querySelector('#query-parser-select');
this.queryParser.addEventListener('mousedown', (e) => this.onMouseDown(e)); this.queryParser.addEventListener('mousedown', (e) => this.onMouseDown(e));
this.queryParser.addEventListener('mouseup', (e) => this.onMouseUp(e)); this.queryParser.addEventListener('mouseup', (e) => this.onMouseUp(e));
@ -82,42 +85,55 @@ class QueryParser {
})(); })();
} }
onParserChange(e) {
const selectedParser = e.target.value;
apiOptionsSet({parsing: {selectedParser}}, this.search.getOptionsContext());
this.renderParseResult(this.getParseResult());
}
getParseResult() {
return this.parseResults.find(r => r.id === this.search.options.parsing.selectedParser);
}
async setText(text) { async setText(text) {
this.search.setSpinnerVisible(true); this.search.setSpinnerVisible(true);
await this.setPreview(text); await this.setPreview(text);
const results = {}; this.parseResults = await this.parseText(text);
if (this.parseResults.length > 0) {
if (this.search.options.parsing.selectedParser === null || !this.getParseResult()) {
const selectedParser = this.parseResults[0].id;
apiOptionsSet({parsing: {selectedParser}}, this.search.getOptionsContext());
}
}
this.renderParserSelect();
await this.renderParseResult();
this.search.setSpinnerVisible(false);
}
async parseText(text) {
const results = [];
if (this.search.options.parsing.enableScanningParser) { if (this.search.options.parsing.enableScanningParser) {
results['scan'] = await apiTextParse(text, this.search.getOptionsContext()); results.push({
name: 'Scanning parser',
id: 'scan',
parsedText: await apiTextParse(text, this.search.getOptionsContext())
});
} }
if (this.search.options.parsing.enableMecabParser) { if (this.search.options.parsing.enableMecabParser) {
let mecabResults = await apiTextParseMecab(text, this.search.getOptionsContext()); let mecabResults = await apiTextParseMecab(text, this.search.getOptionsContext());
for (const mecabDictName in mecabResults) { for (const mecabDictName in mecabResults) {
results[`mecab-${mecabDictName}`] = mecabResults[mecabDictName]; results.push({
name: `MeCab: ${mecabDictName}`,
id: `mecab-${mecabDictName}`,
parsedText: mecabResults[mecabDictName]
});
} }
} }
return results;
const contents = await Promise.all(Object.values(results).map(result => {
return apiTemplateRender('query-parser.html', {
terms: result.map((term) => {
return term.filter(part => part.text.trim()).map((part) => {
return {
text: Array.from(part.text),
reading: part.reading,
raw: !part.reading || !part.reading.trim(),
};
});
})
});
}));
this.queryParser.innerHTML = contents.join('<hr>');
for (const charElement of this.queryParser.querySelectorAll('.query-parser-char')) {
this.activateScanning(charElement);
}
this.search.setSpinnerVisible(false);
} }
async setPreview(text) { async setPreview(text) {
@ -127,7 +143,6 @@ class QueryParser {
previewTerms.push([{text: Array.from(tempText)}]); previewTerms.push([{text: Array.from(tempText)}]);
text = text.slice(2); text = text.slice(2);
} }
this.queryParser.innerHTML = await apiTemplateRender('query-parser.html', { this.queryParser.innerHTML = await apiTemplateRender('query-parser.html', {
terms: previewTerms, terms: previewTerms,
preview: true preview: true
@ -138,6 +153,40 @@ class QueryParser {
} }
} }
renderParserSelect() {
this.queryParserSelect.innerHTML = '';
if (this.parseResults.length > 1) {
const select = document.createElement('select');
select.classList.add('form-control');
for (const parseResult of this.parseResults) {
const option = document.createElement('option');
option.value = parseResult.id;
option.innerText = parseResult.name;
option.defaultSelected = this.search.options.parsing.selectedParser === parseResult.id;
select.appendChild(option);
}
select.addEventListener('change', this.onParserChange.bind(this));
this.queryParserSelect.appendChild(select);
}
}
async renderParseResult() {
const parseResult = this.getParseResult();
if (!parseResult) {
this.queryParser.innerHTML = '';
return;
}
this.queryParser.innerHTML = await apiTemplateRender(
'query-parser.html',
{terms: QueryParser.processParseResultForDisplay(parseResult.parsedText)}
);
for (const charElement of this.queryParser.querySelectorAll('.query-parser-char')) {
this.activateScanning(charElement);
}
}
activateScanning(element) { activateScanning(element) {
element.addEventListener('mousemove', (e) => { element.addEventListener('mousemove', (e) => {
clearTimeout(e.target.dataset.timer); clearTimeout(e.target.dataset.timer);
@ -154,4 +203,16 @@ class QueryParser {
this.onMouseLeave(e); this.onMouseLeave(e);
}); });
} }
static processParseResultForDisplay(result) {
return result.map((term) => {
return term.filter(part => part.text.trim()).map((part) => {
return {
text: Array.from(part.text),
reading: part.reading,
raw: !part.reading || !part.reading.trim(),
};
});
});
}
} }

View File

@ -47,7 +47,12 @@
<img src="/mixed/img/spinner.gif"> <img src="/mixed/img/spinner.gif">
</div> </div>
<div id="query-parser" class="scan-disable"></div> <div class="scan-disable">
<div id="query-parser-select" class="input-group"></div>
<div id="query-parser"></div>
</div>
<hr>
<div id="content"></div> <div id="content"></div>
</div> </div>