File size: 4,195 Bytes
2b0bc5f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
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.<string, Object.<string, string>>}
*/
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.<string, Object.<string, string>>} 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();
}
}
|