diff options
Diffstat (limited to 'ext/js/settings/sentence-termination-characters-controller.js')
| -rw-r--r-- | ext/js/settings/sentence-termination-characters-controller.js | 243 | 
1 files changed, 0 insertions, 243 deletions
| diff --git a/ext/js/settings/sentence-termination-characters-controller.js b/ext/js/settings/sentence-termination-characters-controller.js deleted file mode 100644 index d62771ec..00000000 --- a/ext/js/settings/sentence-termination-characters-controller.js +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (C) 2021  Yomichan Authors - * - * 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 <https://www.gnu.org/licenses/>. - */ - -class SentenceTerminationCharactersController { -    constructor(settingsController) { -        this._settingsController = settingsController; -        this._entries = []; -        this._addButton = null; -        this._resetButton = null; -        this._listTable = null; -        this._listContainer = null; -        this._emptyIndicator = null; -    } - -    get settingsController() { -        return this._settingsController; -    } - -    async prepare() { -        this._addButton = document.querySelector('#sentence-termination-character-list-add'); -        this._resetButton = document.querySelector('#sentence-termination-character-list-reset'); -        this._listTable = document.querySelector('#sentence-termination-character-list-table'); -        this._listContainer = document.querySelector('#sentence-termination-character-list'); -        this._emptyIndicator = document.querySelector('#sentence-termination-character-list-empty'); - -        this._addButton.addEventListener('click', this._onAddClick.bind(this)); -        this._resetButton.addEventListener('click', this._onResetClick.bind(this)); -        this._settingsController.on('optionsChanged', this._onOptionsChanged.bind(this)); - -        await this._updateOptions(); -    } - -    async addEntry(terminationCharacterEntry) { -        const options = await this._settingsController.getOptions(); -        const {sentenceParsing: {terminationCharacters}} = options; - -        await this._settingsController.modifyProfileSettings([{ -            action: 'splice', -            path: 'sentenceParsing.terminationCharacters', -            start: terminationCharacters.length, -            deleteCount: 0, -            items: [terminationCharacterEntry] -        }]); - -        await this._updateOptions(); -    } - -    async deleteEntry(index) { -        const options = await this._settingsController.getOptions(); -        const {sentenceParsing: {terminationCharacters}} = options; - -        if (index < 0 || index >= terminationCharacters.length) { return false; } - -        await this._settingsController.modifyProfileSettings([{ -            action: 'splice', -            path: 'sentenceParsing.terminationCharacters', -            start: index, -            deleteCount: 1, -            items: [] -        }]); - -        await this._updateOptions(); -        return true; -    } - -    async modifyProfileSettings(targets) { -        return await this._settingsController.modifyProfileSettings(targets); -    } - -    // Private - -    _onOptionsChanged({options}) { -        for (const entry of this._entries) { -            entry.cleanup(); -        } - -        this._entries = []; -        const {sentenceParsing: {terminationCharacters}} = options; - -        for (let i = 0, ii = terminationCharacters.length; i < ii; ++i) { -            const terminationCharacterEntry = terminationCharacters[i]; -            const node = this._settingsController.instantiateTemplate('sentence-termination-character-entry'); -            this._listContainer.appendChild(node); -            const entry = new SentenceTerminationCharacterEntry(this, terminationCharacterEntry, i, node); -            this._entries.push(entry); -            entry.prepare(); -        } - -        this._listTable.hidden = (terminationCharacters.length === 0); -        this._emptyIndicator.hidden = (terminationCharacters.length !== 0); -    } - -    _onAddClick(e) { -        e.preventDefault(); -        this._addNewEntry(); -    } - -    _onResetClick(e) { -        e.preventDefault(); -        this._reset(); -    } - -    async _addNewEntry() { -        const newEntry = { -            enabled: true, -            character1: '"', -            character2: '"', -            includeCharacterAtStart: false, -            includeCharacterAtEnd: false -        }; -        return await this.addEntry(newEntry); -    } - -    async _updateOptions() { -        const options = await this._settingsController.getOptions(); -        this._onOptionsChanged({options}); -    } - -    async _reset() { -        const defaultOptions = await this._settingsController.getDefaultOptions(); -        const value = defaultOptions.profiles[0].options.sentenceParsing.terminationCharacters; -        await this._settingsController.setProfileSetting('sentenceParsing.terminationCharacters', value); -        await this._updateOptions(); -    } -} - -class SentenceTerminationCharacterEntry { -    constructor(parent, data, index, node) { -        this._parent = parent; -        this._data = data; -        this._index = index; -        this._node = node; -        this._eventListeners = new EventListenerCollection(); -        this._character1Input = null; -        this._character2Input = null; -        this._basePath = `sentenceParsing.terminationCharacters[${this._index}]`; -    } - -    prepare() { -        const {enabled, character1, character2, includeCharacterAtStart, includeCharacterAtEnd} = this._data; -        const node = this._node; - -        const enabledToggle = node.querySelector('.sentence-termination-character-enabled'); -        const typeSelect = node.querySelector('.sentence-termination-character-type'); -        const character1Input = node.querySelector('.sentence-termination-character-input1'); -        const character2Input = node.querySelector('.sentence-termination-character-input2'); -        const includeAtStartCheckbox = node.querySelector('.sentence-termination-character-include-at-start'); -        const includeAtEndheckbox = node.querySelector('.sentence-termination-character-include-at-end'); -        const menuButton = node.querySelector('.sentence-termination-character-entry-button'); - -        this._character1Input = character1Input; -        this._character2Input = character2Input; - -        const type = (character2 === null ? 'terminator' : 'quote'); -        node.dataset.type = type; - -        enabledToggle.checked = enabled; -        typeSelect.value = type; -        character1Input.value = character1; -        character2Input.value = (character2 !== null ? character2 : ''); -        includeAtStartCheckbox.checked = includeCharacterAtStart; -        includeAtEndheckbox.checked = includeCharacterAtEnd; - -        enabledToggle.dataset.setting = `${this._basePath}.enabled`; -        includeAtStartCheckbox.dataset.setting = `${this._basePath}.includeCharacterAtStart`; -        includeAtEndheckbox.dataset.setting = `${this._basePath}.includeCharacterAtEnd`; - -        this._eventListeners.addEventListener(typeSelect, 'change', this._onTypeSelectChange.bind(this), false); -        this._eventListeners.addEventListener(character1Input, 'change', this._onCharacterChange.bind(this, 1), false); -        this._eventListeners.addEventListener(character2Input, 'change', this._onCharacterChange.bind(this, 2), false); -        this._eventListeners.addEventListener(menuButton, 'menuClose', this._onMenuClose.bind(this), false); -    } - -    cleanup() { -        this._eventListeners.removeAllEventListeners(); -        if (this._node.parentNode !== null) { -            this._node.parentNode.removeChild(this._node); -        } -    } - -    // Private - -    _onTypeSelectChange(e) { -        this._setHasCharacter2(e.currentTarget.value === 'quote'); -    } - -    _onCharacterChange(characterNumber, e) { -        const node = e.currentTarget; -        if (characterNumber === 2 && this._data.character2 === null) { -            node.value = ''; -        } - -        const value = node.value.substring(0, 1); -        this._setCharacterValue(node, characterNumber, value); -    } - -    _onMenuClose(e) { -        switch (e.detail.action) { -            case 'delete': -                this._delete(); -                break; -        } -    } - -    async _delete() { -        this._parent.deleteEntry(this._index); -    } - -    async _setHasCharacter2(has) { -        const okay = await this._setCharacterValue(this._character2Input, 2, has ? this._data.character1 : null); -        if (okay) { -            const type = (!has ? 'terminator' : 'quote'); -            this._node.dataset.type = type; -        } -    } - -    async _setCharacterValue(inputNode, characterNumber, value) { -        const pathEnd = `character${characterNumber}`; -        const r = await this._parent.settingsController.setProfileSetting(`${this._basePath}.${pathEnd}`, value); -        const okay = !r[0].error; -        if (okay) { -            this._data[pathEnd] = value; -        } else { -            value = this._data[pathEnd]; -        } -        inputNode.value = (value !== null ? value : ''); -        return okay; -    } -} |