Merge pull request #358 from toasted-nutbread/general-refactoring

General refactoring
This commit is contained in:
toasted-nutbread 2020-02-14 21:25:25 -05:00 committed by GitHub
commit 853faaf48c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 50 additions and 56 deletions

View File

@ -17,26 +17,18 @@
*/
function apiTemplateRender(template, data, dynamic) {
return _apiInvoke('templateRender', {data, template, dynamic});
function apiTemplateRender(template, data) {
return _apiInvoke('templateRender', {data, template});
}
function apiAudioGetUrl(definition, source, optionsContext) {
return _apiInvoke('audioGetUrl', {definition, source, optionsContext});
}
function apiGetDisplayTemplatesHtml() {
return _apiInvoke('getDisplayTemplatesHtml');
}
function apiClipboardGet() {
return _apiInvoke('clipboardGet');
}
function apiGetQueryParserTemplatesHtml() {
return _apiInvoke('getQueryParserTemplatesHtml');
}
function _apiInvoke(action, params={}) {
const data = {action, params};
return new Promise((resolve, reject) => {

View File

@ -18,7 +18,7 @@
/*global optionsSave, utilIsolate
conditionsTestValue, profileConditionsDescriptor, profileOptionsGetDefaultFieldTemplates
handlebarsRenderDynamic, handlebarsRenderStatic
handlebarsRenderDynamic
requestText, requestJson, optionsLoad
dictConfigured, dictTermsSort, dictEnabledSet, dictNoteFormat
audioGetUrl, audioInject
@ -459,12 +459,8 @@ class Backend {
return this.anki.guiBrowse(`nid:${noteId}`);
}
async _onApiTemplateRender({template, data, dynamic}) {
return (
dynamic ?
handlebarsRenderDynamic(template, data) :
handlebarsRenderStatic(template, data)
);
async _onApiTemplateRender({template, data}) {
return handlebarsRenderDynamic(template, data);
}
async _onApiCommandExec({command, params}) {

View File

@ -335,7 +335,7 @@ async function dictFieldFormat(field, definition, mode, options, templates, exce
}
data.marker = marker;
try {
return await apiTemplateRender(templates, data, true);
return await apiTemplateRender(templates, data);
} catch (e) {
if (exceptions) { exceptions.push(e); }
return `{${marker}-render-error}`;

View File

@ -135,11 +135,6 @@ function handlebarsRegisterHelpers() {
}
}
function handlebarsRenderStatic(name, data) {
handlebarsRegisterHelpers();
return Handlebars.templates[name](data).trim();
}
function handlebarsRenderDynamic(template, data) {
handlebarsRegisterHelpers();
const cache = handlebarsRenderDynamic._cache;

View File

@ -27,7 +27,7 @@ class Translator {
constructor() {
this.database = null;
this.deinflector = null;
this.tagCache = {};
this.tagCache = new Map();
}
async prepare() {
@ -44,12 +44,12 @@ class Translator {
}
async purgeDatabase() {
this.tagCache = {};
this.tagCache.clear();
await this.database.purge();
}
async deleteDictionary(dictionaryName) {
this.tagCache = {};
this.tagCache.clear();
await this.database.deleteDictionary(dictionaryName);
}
@ -537,22 +537,22 @@ class Translator {
async getTagMetaList(names, title) {
const tagMetaList = [];
const cache = (
hasOwn(this.tagCache, title) ?
this.tagCache[title] :
(this.tagCache[title] = {})
);
let cache = this.tagCache.get(title);
if (typeof cache === 'undefined') {
cache = new Map();
this.tagCache.set(title, cache);
}
for (const name of names) {
const base = Translator.getNameBase(name);
if (hasOwn(cache, base)) {
tagMetaList.push(cache[base]);
} else {
const tagMeta = await this.database.findTagForTitle(base, title);
cache[base] = tagMeta;
tagMetaList.push(tagMeta);
let tagMeta = cache.get(base);
if (typeof tagMeta === 'undefined') {
tagMeta = await this.database.findTagForTitle(base, title);
cache.set(base, tagMeta);
}
tagMetaList.push(tagMeta);
}
return tagMetaList;

View File

@ -35,7 +35,7 @@
<h1>Yomichan Updated!</h1>
<p>
The Yomichan extension has been updated to a new version! In order to continue
viewing definitions on this page you must reload this tab or restart your browser.
viewing definitions on this page, you must reload this tab or restart your browser.
</p>
</div>
</div>

View File

@ -65,8 +65,8 @@ function apiNoteView(noteId) {
return _apiInvoke('noteView', {noteId});
}
function apiTemplateRender(template, data, dynamic) {
return _apiInvoke('templateRender', {data, template, dynamic});
function apiTemplateRender(template, data) {
return _apiInvoke('templateRender', {data, template});
}
function apiAudioGetUrl(definition, source, optionsContext) {

View File

@ -114,8 +114,11 @@ function audioGetFromUrl(url, willDownload) {
async function audioGetFromSources(expression, sources, optionsContext, willDownload, cache=null) {
const key = `${expression.expression}:${expression.reading}`;
if (cache !== null && hasOwn(cache, expression)) {
return cache[key];
if (cache !== null) {
const cacheValue = cache.get(expression);
if (typeof cacheValue !== 'undefined') {
return cacheValue;
}
}
for (let i = 0, ii = sources.length; i < ii; ++i) {
@ -133,7 +136,7 @@ async function audioGetFromSources(expression, sources, optionsContext, willDown
}
const result = {audio, url, source};
if (cache !== null) {
cache[key] = result;
cache.set(key, result);
}
return result;
} catch (e) {

View File

@ -113,11 +113,7 @@ function toIterable(value) {
if (value !== null && typeof value === 'object') {
const length = value.length;
if (typeof length === 'number' && Number.isFinite(length)) {
const array = [];
for (let i = 0; i < length; ++i) {
array.push(value[i]);
}
return array;
return Array.from(value);
}
}

View File

@ -32,7 +32,7 @@ class Display {
this.index = 0;
this.audioPlaying = null;
this.audioFallback = null;
this.audioCache = {};
this.audioCache = new Map();
this.styleNode = null;
this.eventListeners = [];
@ -186,13 +186,15 @@ class Display {
e.preventDefault();
const link = e.currentTarget;
const entry = link.closest('.entry');
const definitionIndex = this.entryIndexFind(entry);
const index = this.entryIndexFind(entry);
if (index < 0 || index >= this.definitions.length) { return; }
const expressionIndex = Display.indexOf(entry.querySelectorAll('.term-expression .action-play-audio'), link);
this.audioPlay(
this.definitions[definitionIndex],
this.definitions[index],
// expressionIndex is used in audioPlay to detect result output mode
Math.max(expressionIndex, this.options.general.resultOutputMode === 'merge' ? 0 : -1),
definitionIndex
index
);
}
@ -200,6 +202,8 @@ class Display {
e.preventDefault();
const link = e.currentTarget;
const index = this.entryIndexFind(link);
if (index < 0 || index >= this.definitions.length) { return; }
this.noteAdd(this.definitions[index], link.dataset.mode);
}
@ -498,6 +502,8 @@ class Display {
}
autoPlayAudio() {
if (this.definitions.length === 0) { return; }
this.audioPlay(this.definitions[0], this.firstExpressionIndex, 0);
}
@ -597,9 +603,12 @@ class Display {
}
noteTryAdd(mode) {
const button = this.adderButtonFind(this.index, mode);
const index = this.index;
if (index < 0 || index >= this.definitions.length) { return; }
const button = this.adderButtonFind(index, mode);
if (button !== null && !button.classList.contains('disabled')) {
this.noteAdd(this.definitions[this.index], mode);
this.noteAdd(this.definitions[index], mode);
}
}
@ -901,9 +910,12 @@ Display._onKeyDownHandlers = new Map([
['P', (self, e) => {
if (e.altKey) {
const entry = self.getEntry(self.index);
const index = self.index;
if (index < 0 || index >= self.definitions.length) { return; }
const entry = self.getEntry(index);
if (entry !== null && entry.dataset.type === 'term') {
self.audioPlay(self.definitions[self.index], self.firstExpressionIndex, self.index);
self.audioPlay(self.definitions[index], self.firstExpressionIndex, index);
}
return true;
}