myStorage localstorage
สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/390865/738839/myStorage.js
class myStorage { constructor(version = 1, prefix = "") { this.version = version; this.prefix = prefix; } // Greasemonkey storage API read(key, defaultValue) { const raw = GM_getValue(this._prefix(key), defaultValue); // let str = (this.compress) ? LZString.decompressFromUTF16(raw) : raw; return this._parse(raw); } write(key, value) { const raw = this._stringify(value); // let str = (this.compress) ? LZString.compressToUTF16(raw) : raw; return GM_setValue(this._prefix(key), raw); } delete(key) { return GM_deleteValue(this._prefix(key)); } readKeys() { return GM_listValues(); } // browser localstorage // read(key, defaultValue) { // const raw = localStorage.getItem(this._prefix(key), defaultValue); // const val = raw || defaultValue; // // const str = (this.compress) ? LZString.decompressFromUTF16(val) : val; // // return this._parse(str); // return this._parse(val); // } // write(key, value) { // const raw = this._stringify(value); // // let str = (this.compress) ? LZString.compressToUTF16(raw) : raw; // localStorage.setItem(this._prefix(key), raw); // return; // } // delete(key) { // return localStorage.removeItem(this._prefix(key)); // } // readKeys() { // let keys = []; // for(let i=0, l=localStorage.length; i < l; i++){ // keys.push( localStorage.getItem(localStorage.key(i)) ); // } // return keys; // } // “Set” means “add if absent, replace if present.” set(key, value) { let savedVal = this.read(key); if (typeof savedVal === 'undefined' || !savedVal) { // add if absent return this.add(key, value); } else { // replace if present this.write(key, value); return true; } } // “Add” means “add if absent, do nothing if present” (if a uniquing collection). add(key, value) { let savedVal = this.read(key, false); if (typeof savedVal === 'undefined' || !savedVal) { this.write(key, value); return true; } else { if (this._isArray(savedVal)) { // is array let index = savedVal.indexOf(value); if (index !== -1) { // do nothing if present return false; } else { // add if absent savedVal.push(value); this.write(key, savedVal); return true; } } else if (this._isObject(savedVal)) { // is object // merge obj value on obj let r###lt, objToMerge = value; r###lt = Object.assign(savedVal, objToMerge); this.write(key, r###lt); return false; } return false; } } // “Replace” means “replace if present, do nothing if absent.” replace(key, itemFind, itemReplacement) { let savedVal = this.read(key, false); if (typeof savedVal === 'undefined' || !savedVal) { // do nothing if absent return false; } else { if (this._isArray(savedVal)) { // is Array let index = savedVal.indexOf(itemFind); if (index !== -1) { // replace if present savedVal[index] = itemReplacement; this.write(key, savedVal); return true; } else { // do nothing if absent return false; } } else if (this._isObject(savedVal)) { // is Object // replace property's value savedVal[itemFind] = itemReplacement; this.write(key, savedVal); return true; } return false; } } // “Remove” means “remove if present, do nothing if absent.” remove(key, value) { if (typeof value === 'undefined') { // remove key this.delete(key); return true; } else { // value present let savedVal = this.read(key); if (typeof savedVal === 'undefined' || !savedVal) { return true; } else { if (this._isArray(savedVal)) { // is Array let index = savedVal.indexOf(value); if (index !== -1) { // remove if present savedVal.splice(index, 1); this.write(key, savedVal); return true; } else { // do nothing if absent return false; } } else if (this._isObject(savedVal)) { // is Object let property = value; delete savedVal[property]; this.write(key, savedVal); return true; } return false; } } } get(key, defaultValue) { return this.read(key, defaultValue); } getAll() { const keys = this._listKeys(); let obj = {}; for (let i = 0, len = keys.length; i < len; i++) { obj[keys[i]] = this.read(keys[i]); } return obj; } getKeys() { return this._listKeys(); } getPrefix() { return this.prefix; } empty() { const keys = this._listKeys(); for (let i = 0, len = keys.lenght; i < len; i++) { this.delete(keys[i]); } } has(key) { return this.get(key) !== null; } forEach(callbackFunc) { const allContent = this.getAll(); for (let prop in allContent) { callbackFunc(prop, allContent[prop]); } } _parse(value) { if (this._isJson(value)) { return JSON.parse(value); } return value; } _stringify(value) { if (this._isJson(value)) { return value; } return JSON.stringify(value); } _listKeys(usePrefix = false) { const prefixed = this.readKeys(); let unprefixed = []; if (usePrefix) { return prefixed; } else { for (let i = 0, len = prefixed.length; i < len; i++) { unprefixed[i] = this._unprefix(prefixed[i]); } return unprefixed; } } _prefix(key) { return this.prefix + key; } _unprefix(key) { return key.substring(this.prefix.length); } _isJson(item) { try { JSON.parse(item); } catch (e) { return false; } return true; } _isObject(a) { return (!!a) && (a.constructor === Object); } _isArray(a) { return (!!a) && (a.constructor === Array); } }