move QueryParser.parseText to Backend

This commit is contained in:
siikamiika 2020-04-12 03:53:24 +03:00
parent 7f3e272839
commit c613321a73
4 changed files with 90 additions and 84 deletions

View File

@ -85,7 +85,6 @@ class Backend {
['kanjiFind', {handler: this._onApiKanjiFind.bind(this), async: true}], ['kanjiFind', {handler: this._onApiKanjiFind.bind(this), async: true}],
['termsFind', {handler: this._onApiTermsFind.bind(this), async: true}], ['termsFind', {handler: this._onApiTermsFind.bind(this), async: true}],
['textParse', {handler: this._onApiTextParse.bind(this), async: true}], ['textParse', {handler: this._onApiTextParse.bind(this), async: true}],
['textParseMecab', {handler: this._onApiTextParseMecab.bind(this), async: true}],
['definitionAdd', {handler: this._onApiDefinitionAdd.bind(this), async: true}], ['definitionAdd', {handler: this._onApiDefinitionAdd.bind(this), async: true}],
['definitionsAddable', {handler: this._onApiDefinitionsAddable.bind(this), async: true}], ['definitionsAddable', {handler: this._onApiDefinitionsAddable.bind(this), async: true}],
['noteView', {handler: this._onApiNoteView.bind(this), async: true}], ['noteView', {handler: this._onApiNoteView.bind(this), async: true}],
@ -315,6 +314,65 @@ class Backend {
return await this.dictionaryImporter.import(this.database, archiveSource, onProgress, details); return await this.dictionaryImporter.import(this.database, archiveSource, onProgress, details);
} }
async _textParseScanning(text, options) {
const results = [];
while (text.length > 0) {
const term = [];
const [definitions, sourceLength] = await this.translator.findTerms(
'simple',
text.substring(0, options.scanning.length),
{},
options
);
if (definitions.length > 0) {
dictTermsSort(definitions);
const {expression, reading} = definitions[0];
const source = text.substring(0, sourceLength);
for (const {text: text2, furigana} of jp.distributeFuriganaInflected(expression, reading, source)) {
const reading2 = jp.convertReading(text2, furigana, options.parsing.readingMode);
term.push({text: text2, reading: reading2});
}
text = text.substring(source.length);
} else {
const reading = jp.convertReading(text[0], null, options.parsing.readingMode);
term.push({text: text[0], reading});
text = text.substring(1);
}
results.push(term);
}
return results;
}
async _textParseMecab(text, options) {
const results = [];
const rawResults = await this.mecab.parseText(text);
for (const [mecabName, parsedLines] of Object.entries(rawResults)) {
const result = [];
for (const parsedLine of parsedLines) {
for (const {expression, reading, source} of parsedLine) {
const term = [];
if (expression !== null && reading !== null) {
for (const {text: text2, furigana} of jp.distributeFuriganaInflected(
expression,
jp.convertKatakanaToHiragana(reading),
source
)) {
const reading2 = jp.convertReading(text2, furigana, options.parsing.readingMode);
term.push({text: text2, reading: reading2});
}
} else {
const reading2 = jp.convertReading(source, null, options.parsing.readingMode);
term.push({text: source, reading: reading2});
}
result.push(term);
}
result.push([{text: '\n'}]);
}
results.push([mecabName, result]);
}
return results;
}
// Message handlers // Message handlers
_onApiYomichanCoreReady(_params, sender) { _onApiYomichanCoreReady(_params, sender) {
@ -406,61 +464,27 @@ class Backend {
async _onApiTextParse({text, optionsContext}) { async _onApiTextParse({text, optionsContext}) {
const options = this.getOptions(optionsContext); const options = this.getOptions(optionsContext);
const results = []; const results = [];
while (text.length > 0) {
const term = []; if (options.parsing.enableScanningParser) {
const [definitions, sourceLength] = await this.translator.findTerms( results.push({
'simple', source: 'scanning-parser',
text.substring(0, options.scanning.length), id: 'scan',
{}, content: await this._textParseScanning(text, options)
options });
);
if (definitions.length > 0) {
dictTermsSort(definitions);
const {expression, reading} = definitions[0];
const source = text.substring(0, sourceLength);
for (const {text: text2, furigana} of jp.distributeFuriganaInflected(expression, reading, source)) {
const reading2 = jp.convertReading(text2, furigana, options.parsing.readingMode);
term.push({text: text2, reading: reading2});
}
text = text.substring(source.length);
} else {
const reading = jp.convertReading(text[0], null, options.parsing.readingMode);
term.push({text: text[0], reading});
text = text.substring(1);
}
results.push(term);
}
return results;
} }
async _onApiTextParseMecab({text, optionsContext}) { if (options.parsing.enableMecabParser) {
const options = this.getOptions(optionsContext); const mecabResults = await this._textParseMecab(text, options);
const results = []; for (const [mecabDictName, mecabDictResults] of mecabResults) {
const rawResults = await this.mecab.parseText(text); results.push({
for (const [mecabName, parsedLines] of Object.entries(rawResults)) { source: 'mecab',
const result = []; dictionary: mecabDictName,
for (const parsedLine of parsedLines) { id: `mecab-${mecabDictName}`,
for (const {expression, reading, source} of parsedLine) { content: mecabDictResults
const term = []; });
if (expression !== null && reading !== null) {
for (const {text: text2, furigana} of jp.distributeFuriganaInflected(
expression,
jp.convertKatakanaToHiragana(reading),
source
)) {
const reading2 = jp.convertReading(text2, furigana, options.parsing.readingMode);
term.push({text: text2, reading: reading2});
} }
} else {
const reading2 = jp.convertReading(source, null, options.parsing.readingMode);
term.push({text: source, reading: reading2});
}
result.push(term);
}
result.push([{text: '\n'}]);
}
results.push([mecabName, result]);
} }
return results; return results;
} }

View File

@ -71,7 +71,16 @@ class QueryParserGenerator {
for (const parseResult of parseResults) { for (const parseResult of parseResults) {
const optionContainer = this._templateHandler.instantiate('select-option'); const optionContainer = this._templateHandler.instantiate('select-option');
optionContainer.value = parseResult.id; optionContainer.value = parseResult.id;
optionContainer.textContent = parseResult.name; switch (parseResult.source) {
case 'scanning-parser':
optionContainer.textContent = 'Scanning parser';
break;
case 'mecab':
optionContainer.textContent = `MeCab: ${parseResult.dictionary}`;
break;
default:
optionContainer.textContent = 'Unrecognized dictionary';
}
optionContainer.defaultSelected = selectedParser === parseResult.id; optionContainer.defaultSelected = selectedParser === parseResult.id;
selectContainer.appendChild(optionContainer); selectContainer.appendChild(optionContainer);
} }

View File

@ -21,7 +21,6 @@
* apiOptionsSet * apiOptionsSet
* apiTermsFind * apiTermsFind
* apiTextParse * apiTextParse
* apiTextParseMecab
* docSentenceExtract * docSentenceExtract
*/ */
@ -128,7 +127,7 @@ class QueryParser extends TextScanner {
this.setPreview(text); this.setPreview(text);
this.parseResults = await this.parseText(text); this.parseResults = await apiTextParse(text, this.getOptionsContext());
this.refreshSelectedParser(); this.refreshSelectedParser();
this.renderParserSelect(); this.renderParserSelect();
@ -137,28 +136,6 @@ class QueryParser extends TextScanner {
this.setSpinnerVisible(false); this.setSpinnerVisible(false);
} }
async parseText(text) {
const results = [];
if (this.options.parsing.enableScanningParser) {
results.push({
name: 'Scanning parser',
id: 'scan',
parsedText: await apiTextParse(text, this.getOptionsContext())
});
}
if (this.options.parsing.enableMecabParser) {
const mecabResults = await apiTextParseMecab(text, this.getOptionsContext());
for (const [mecabDictName, mecabDictResults] of mecabResults) {
results.push({
name: `MeCab: ${mecabDictName}`,
id: `mecab-${mecabDictName}`,
parsedText: mecabDictResults
});
}
}
return results;
}
setPreview(text) { setPreview(text) {
const previewTerms = []; const previewTerms = [];
for (let i = 0, ii = text.length; i < ii; i += 2) { for (let i = 0, ii = text.length; i < ii; i += 2) {
@ -183,6 +160,6 @@ class QueryParser extends TextScanner {
const parseResult = this.getParseResult(); const parseResult = this.getParseResult();
this.queryParser.textContent = ''; this.queryParser.textContent = '';
if (!parseResult) { return; } if (!parseResult) { return; }
this.queryParser.appendChild(this.queryParserGenerator.createParseResult(parseResult.parsedText)); this.queryParser.appendChild(this.queryParserGenerator.createParseResult(parseResult.content));
} }
} }

View File

@ -44,10 +44,6 @@ function apiTextParse(text, optionsContext) {
return _apiInvoke('textParse', {text, optionsContext}); return _apiInvoke('textParse', {text, optionsContext});
} }
function apiTextParseMecab(text, optionsContext) {
return _apiInvoke('textParseMecab', {text, optionsContext});
}
function apiKanjiFind(text, optionsContext) { function apiKanjiFind(text, optionsContext) {
return _apiInvoke('kanjiFind', {text, optionsContext}); return _apiInvoke('kanjiFind', {text, optionsContext});
} }