class TabsExtensionConfigs { #settings = {}; /** @returns {boolean} */ get container() { return this.#settings.container; } /** @returns {boolean} */ get forge() { return this.#settings.forge; } /** @returns {boolean} */ get open() { return this.#settings.open; } /** @returns {boolean} */ get sort() { return this.#settings.sort; } /** @returns {boolean} */ get toggle() { return this.#settings.toggle; } /** @returns {boolean} */ get scripts_toggle() { return this.#settings.scripts_toggle; } /** @returns {boolean} */ get rmb() { return this.#settings.rmb; } /** @returns {boolean} */ get version() { return this.#settings.version; } constructor() { const settingsIDs = [ ['container', 'checkbox'], ['forge', 'checkbox'], ['open', 'checkbox'], ['sort', 'checkbox'], ['toggle', 'checkbox'], ['scripts_toggle', 'checkbox'], ['rmb', 'checkbox'], ['version', 'checkbox'] ]; for (const [key, type] of settingsIDs) { const wrapper = document.getElementById(`setting_tabs_ex_${key}`); const element = wrapper?.querySelector(`input[type=${type}]`); this.#settings[key] = (type === 'checkbox') ? !!element?.checked : (element?.value ?? ""); } } /** @param {string} name @param {string} mode @return {string} */ #validateMode(name, mode) { const availableModes = (name === "tabs") ? ["left", "right"] : ["left", "right", "above", "below", "hide", "keep"]; return availableModes.includes(mode) ? mode : availableModes[0]; } /** * CSV -> Dict * @return {Object.>} */ parseConfigs() { try { const config = { "txt": {}, "img": {} }; const holder = document.getElementById('TABSEX_LBL'); const textarea = holder?.querySelector('textarea'); const raw = textarea?.value ?? ""; const lines = raw.trim().split('\n').slice(1).filter(Boolean); for (const line of lines) { const [ext, t, i] = line.split(',').map(col => (col ?? '').trim()); if (!ext) continue; config["txt"][ext] = this.#validateMode(ext, t); config["img"][ext] = this.#validateMode(ext, i); } // пусто? вернём дефолт if (Object.keys(config.txt ?? {}).length === 0) { return { "txt": { 'tabs': 'left', 'default': 'left' }, "img": { 'tabs': 'right', 'default': 'right' } }; } return config; } catch (_e) { alert(`[Tabs Extension]: Something went wrong while parsing the configs... Using defaults.`); return { "txt": { 'tabs': 'left', 'default': 'left' }, "img": { 'tabs': 'right', 'default': 'right' } }; } } /** * Dict -> CSV (фиксированный порядок) * @param {Object.>} config */ saveConfigs(config) { const holder = document.getElementById('TABSEX_LBL'); const textarea = holder?.querySelector('textarea'); if (!textarea) return; const data = [",txt,img"]; const keys = Array.from(new Set([ ...Object.keys(config["txt"] || {}), ...Object.keys(config["img"] || {}) ])).sort((a, b) => { const aHead = (a === 'tabs' || a === 'default'); const bHead = (b === 'tabs' || b === 'default'); if (aHead && !bHead) return -1; if (!aHead && bHead) return 1; return a.localeCompare(b); }); for (const key of keys) { data.push([key, config["txt"][key] ?? "", config["img"][key] ?? ""].join(",")); } textarea.value = data.join("\n"); if (typeof updateInput === 'function') updateInput(textarea); const btn = document.getElementById('TABSEX_BTN'); btn?.click(); } }