diff options
| -rw-r--r-- | ext/bg/js/settings/anki-templates.js | 117 | ||||
| -rw-r--r-- | ext/bg/js/settings/anki.js | 99 | ||||
| -rw-r--r-- | ext/bg/settings.html | 1 | 
3 files changed, 118 insertions, 99 deletions
| diff --git a/ext/bg/js/settings/anki-templates.js b/ext/bg/js/settings/anki-templates.js new file mode 100644 index 00000000..6ba20040 --- /dev/null +++ b/ext/bg/js/settings/anki-templates.js @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2019  Alex Yatskov <alex@foosoft.net> + * Author: Alex Yatskov <alex@foosoft.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + + +function onAnkiFieldTemplatesReset(e) { +    e.preventDefault(); +    $('#field-template-reset-modal').modal('show'); +} + +async function onAnkiFieldTemplatesResetConfirm(e) { +    try { +        e.preventDefault(); + +        $('#field-template-reset-modal').modal('hide'); + +        const optionsContext = getOptionsContext(); +        const options = await apiOptionsGet(optionsContext); +        const fieldTemplates = profileOptionsGetDefaultFieldTemplates(); +        options.anki.fieldTemplates = fieldTemplates; +        $('#field-templates').val(fieldTemplates); +        onAnkiTemplatesValidateCompile(); +        await settingsSaveOptions(); +    } catch (error) { +        ankiErrorShow(error); +    } +} + +function ankiTemplatesInitialize() { +    const markers = new Set(ankiGetFieldMarkers('terms').concat(ankiGetFieldMarkers('kanji'))); +    const fragment = ankiGetFieldMarkersHtml(markers); + +    const list = document.querySelector('#field-templates-list'); +    list.appendChild(fragment); +    for (const node of list.querySelectorAll('.marker-link')) { +        node.addEventListener('click', onAnkiTemplateMarkerClicked, false); +    } + +    $('#field-templates').on('change', (e) => onAnkiTemplatesValidateCompile(e)); +    $('#field-template-render').on('click', (e) => onAnkiTemplateRender(e)); +    $('#field-templates-reset').on('click', (e) => onAnkiFieldTemplatesReset(e)); +    $('#field-templates-reset-confirm').on('click', (e) => onAnkiFieldTemplatesResetConfirm(e)); +} + +const ankiTemplatesValidateGetDefinition = (() => { +    let cachedValue = null; +    let cachedText = null; + +    return async (text, optionsContext) => { +        if (cachedText !== text) { +            const {definitions} = await apiTermsFind(text, {}, optionsContext); +            if (definitions.length === 0) { return null; } + +            cachedValue = definitions[0]; +            cachedText = text; +        } +        return cachedValue; +    }; +})(); + +async function ankiTemplatesValidate(infoNode, field, mode, showSuccessResult, invalidateInput) { +    const text = document.querySelector('#field-templates-preview-text').value || ''; +    const exceptions = []; +    let result = `No definition found for ${text}`; +    try { +        const optionsContext = getOptionsContext(); +        const definition = await ankiTemplatesValidateGetDefinition(text, optionsContext); +        if (definition !== null) { +            const options = await apiOptionsGet(optionsContext); +            result = await dictFieldFormat(field, definition, mode, options, exceptions); +        } +    } catch (e) { +        exceptions.push(e); +    } + +    const hasException = exceptions.length > 0; +    infoNode.hidden = !(showSuccessResult || hasException); +    infoNode.textContent = hasException ? exceptions.map((e) => `${e}`).join('\n') : (showSuccessResult ? result : ''); +    infoNode.classList.toggle('text-danger', hasException); +    if (invalidateInput) { +        const input = document.querySelector('#field-templates'); +        input.classList.toggle('is-invalid', hasException); +    } +} + +function onAnkiTemplatesValidateCompile() { +    const infoNode = document.querySelector('#field-template-compile-result'); +    ankiTemplatesValidate(infoNode, '{expression}', 'term-kanji', false, true); +} + +function onAnkiTemplateMarkerClicked(e) { +    e.preventDefault(); +    document.querySelector('#field-template-render-text').value = `{${e.target.textContent}}`; +} + +function onAnkiTemplateRender(e) { +    e.preventDefault(); + +    const field = document.querySelector('#field-template-render-text').value; +    const infoNode = document.querySelector('#field-template-render-result'); +    infoNode.hidden = true; +    ankiTemplatesValidate(infoNode, field, 'term-kanji', true, false); +} diff --git a/ext/bg/js/settings/anki.js b/ext/bg/js/settings/anki.js index 5b8e5eec..ae380fdb 100644 --- a/ext/bg/js/settings/anki.js +++ b/ext/bg/js/settings/anki.js @@ -188,102 +188,3 @@ async function onAnkiModelChanged(e) {          ankiSpinnerShow(false);      }  } - -function onAnkiFieldTemplatesReset(e) { -    e.preventDefault(); -    $('#field-template-reset-modal').modal('show'); -} - -async function onAnkiFieldTemplatesResetConfirm(e) { -    try { -        e.preventDefault(); - -        $('#field-template-reset-modal').modal('hide'); - -        const optionsContext = getOptionsContext(); -        const options = await apiOptionsGet(optionsContext); -        const fieldTemplates = profileOptionsGetDefaultFieldTemplates(); -        options.anki.fieldTemplates = fieldTemplates; -        $('#field-templates').val(fieldTemplates); -        onAnkiTemplatesValidateCompile(); -        await settingsSaveOptions(); -    } catch (error) { -        ankiErrorShow(error); -    } -} - -function ankiTemplatesInitialize() { -    const markers = new Set(ankiGetFieldMarkers('terms').concat(ankiGetFieldMarkers('kanji'))); -    const fragment = ankiGetFieldMarkersHtml(markers); - -    const list = document.querySelector('#field-templates-list'); -    list.appendChild(fragment); -    for (const node of list.querySelectorAll('.marker-link')) { -        node.addEventListener('click', onAnkiTemplateMarkerClicked, false); -    } - -    $('#field-templates').on('change', (e) => onAnkiTemplatesValidateCompile(e)); -    $('#field-template-render').on('click', (e) => onAnkiTemplateRender(e)); -    $('#field-templates-reset').on('click', (e) => onAnkiFieldTemplatesReset(e)); -    $('#field-templates-reset-confirm').on('click', (e) => onAnkiFieldTemplatesResetConfirm(e)); -} - -const ankiTemplatesValidateGetDefinition = (() => { -    let cachedValue = null; -    let cachedText = null; - -    return async (text, optionsContext) => { -        if (cachedText !== text) { -            const {definitions} = await apiTermsFind(text, {}, optionsContext); -            if (definitions.length === 0) { return null; } - -            cachedValue = definitions[0]; -            cachedText = text; -        } -        return cachedValue; -    }; -})(); - -async function ankiTemplatesValidate(infoNode, field, mode, showSuccessResult, invalidateInput) { -    const text = document.querySelector('#field-templates-preview-text').value || ''; -    const exceptions = []; -    let result = `No definition found for ${text}`; -    try { -        const optionsContext = getOptionsContext(); -        const definition = await ankiTemplatesValidateGetDefinition(text, optionsContext); -        if (definition !== null) { -            const options = await apiOptionsGet(optionsContext); -            result = await dictFieldFormat(field, definition, mode, options, exceptions); -        } -    } catch (e) { -        exceptions.push(e); -    } - -    const hasException = exceptions.length > 0; -    infoNode.hidden = !(showSuccessResult || hasException); -    infoNode.textContent = hasException ? exceptions.map((e) => `${e}`).join('\n') : (showSuccessResult ? result : ''); -    infoNode.classList.toggle('text-danger', hasException); -    if (invalidateInput) { -        const input = document.querySelector('#field-templates'); -        input.classList.toggle('is-invalid', hasException); -    } -} - -function onAnkiTemplatesValidateCompile() { -    const infoNode = document.querySelector('#field-template-compile-result'); -    ankiTemplatesValidate(infoNode, '{expression}', 'term-kanji', false, true); -} - -function onAnkiTemplateMarkerClicked(e) { -    e.preventDefault(); -    document.querySelector('#field-template-render-text').value = `{${e.target.textContent}}`; -} - -function onAnkiTemplateRender(e) { -    e.preventDefault(); - -    const field = document.querySelector('#field-template-render-text').value; -    const infoNode = document.querySelector('#field-template-render-result'); -    infoNode.hidden = true; -    ankiTemplatesValidate(infoNode, field, 'term-kanji', true, false); -} diff --git a/ext/bg/settings.html b/ext/bg/settings.html index 03046e5f..5539b1b9 100644 --- a/ext/bg/settings.html +++ b/ext/bg/settings.html @@ -883,6 +883,7 @@          <script src="/mixed/js/audio.js"></script>          <script src="/bg/js/settings/anki.js"></script> +        <script src="/bg/js/settings/anki-templates.js"></script>          <script src="/bg/js/settings/audio.js"></script>          <script src="/bg/js/settings/dictionaries.js"></script>          <script src="/bg/js/settings/profiles.js"></script> |