Optimize dictFieldFormat

This commit is contained in:
toasted-nutbread 2019-11-08 22:08:11 -05:00
parent fa963722a7
commit 4d7940e8e4
2 changed files with 58 additions and 38 deletions

View File

@ -327,7 +327,31 @@ function dictFieldSplit(field) {
} }
async function dictFieldFormat(field, definition, mode, options) { async function dictFieldFormat(field, definition, mode, options) {
const markers = [ const data = {
marker: null,
definition,
group: options.general.resultOutputMode === 'group',
merge: options.general.resultOutputMode === 'merge',
modeTermKanji: mode === 'term-kanji',
modeTermKana: mode === 'term-kana',
modeKanji: mode === 'kanji',
compactGlossaries: options.general.compactGlossaries
};
const markers = dictFieldFormat.markers;
const pattern = /\{([\w\-]+)\}/g;
return await stringReplaceAsync(field, pattern, async (g0, marker) => {
if (!markers.has(marker)) {
return g0;
}
data.marker = marker;
try {
return await apiTemplateRender(options.anki.fieldTemplates, data, true);
} catch (e) {
return `{${marker}-render-error}`;
}
});
}
dictFieldFormat.markers = new Set([
'audio', 'audio',
'character', 'character',
'cloze-body', 'cloze-body',
@ -346,26 +370,7 @@ async function dictFieldFormat(field, definition, mode, options) {
'sentence', 'sentence',
'tags', 'tags',
'url' 'url'
]; ]);
for (const marker of markers) {
const data = {
marker,
definition,
group: options.general.resultOutputMode === 'group',
merge: options.general.resultOutputMode === 'merge',
modeTermKanji: mode === 'term-kanji',
modeTermKana: mode === 'term-kana',
modeKanji: mode === 'kanji',
compactGlossaries: options.general.compactGlossaries
};
const html = await apiTemplateRender(options.anki.fieldTemplates, data, true);
field = field.replace(`{${marker}}`, html);
}
return field;
}
async function dictNoteFormat(definition, mode, options) { async function dictNoteFormat(definition, mode, options) {
const note = {fields: {}, tags: options.anki.tags}; const note = {fields: {}, tags: options.anki.tags};

View File

@ -133,3 +133,18 @@ function promiseTimeout(delay, resolveValue) {
return promise; return promise;
} }
function stringReplaceAsync(str, regex, replacer) {
let match;
let index = 0;
const parts = [];
while ((match = regex.exec(str)) !== null) {
parts.push(str.substring(index, match.index), replacer(...match, match.index, str));
index = regex.lastIndex;
}
if (parts.length === 0) {
return Promise.resolve(str);
}
parts.push(str.substring(index));
return Promise.all(parts).then(v => v.join(''));
}