simple wrapper for GM_storage with added functions
สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/38717/253024/GM%20storage%20wrapper.js
/*jshint esversion: 6 */ // ==UserScript== // @name GM storage wrapper // @version 1.0 // @description simple wrapper for GM_storage with added functions // ==/UserScript== var gmStorageWrapper = { options : { prefix : '' }, // “Set” means “add if absent, replace if present.” set : function(key, value) { let storageVals = this.read(key); if (typeof storageVals === 'undefined' || !storageVals) { // 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 : function(key, value) { let storageVals = this.read(key, false); if (typeof storageVals === 'undefined' || !storageVals) { this.write(key, value); return true; } else { if (this._isArray(storageVals)) { // is array let index = storageVals.indexOf(value); if (index !== -1) { // do nothing if present return false; } else { // add if absent storageVals.push(value); this.write(key, storageVals); return true; } } else if (this._isObject(storageVals)) { // is object // merge obj value on obj let r###lt, objToMerge = value; r###lt = Object.assign(storageVals, objToMerge); this.write(key, r###lt); return false; } return false; } }, // “Replace” means “replace if present, do nothing if absent.” replace : function(key, itemFind, itemReplacement) { let storageVals = this.read(key, false); if (typeof storageVals === 'undefined' || !storageVals) { // do nothing if absent return false; } else { if (this._isArray(storageVals)) { // is Array let index = storageVals.indexOf(itemFind); if (index !== -1) { // replace if present storageVals[index] = itemReplacement; this.write(key, storageVals); return true; } else { // do nothing if absent return false; } } else if (this._isObject(storageVals)) { // is Object // replace property's value storageVals[itemFind] = itemReplacement; this.write(key, storageVals); return true; } return false; } }, // “Remove” means “remove if present, do nothing if absent.” remove : function(key, value) { if (typeof value === 'undefined') { // remove key this.delete(key); return true; } else { // value present let storageVals = this.read(key); if (typeof storageVals === 'undefined' || !storageVals) { return true; } else { if (this._isArray(storageVals)) { // is Array let index = storageVals.indexOf(value); if (index !== -1) { // remove if present storageVals.splice(index, 1); this.write(key, storageVals); return true; } else { // do nothing if absent return false; } } else if (this._isObject(storageVals)) { // is Object let property = value; delete storageVals[property]; this.write(key, storageVals); return true; } return false; } } }, get : function(key, defaultValue) { return this.read(key, defaultValue); }, // GM storage API read : function(key, defaultValue) { return this.unserialize(GM_getValue(this._prefix(key), defaultValue)); }, write : function(key, value) { return GM_setValue(this._prefix(key), this.serialize(value)); }, delete : function(key) { return GM_deleteValue(this._prefix(key)); }, readKeys : function() { return GM_listValues(); }, // /GM Storage API getAll : function() { 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 : function() { return this._listKeys(); }, getPrefix : function() { return this.options.prefix; }, empty : function() { const keys = this._listKeys(); for (let i = 0, len = keys.lenght; i < len; i++) { this.delete(keys[i]); } }, has : function(key) { return this.get(key) !== null; }, forEach : function(callbackFunc) { const allContent = this.getAll(); for (let prop in allContent) { callbackFunc(prop, allContent[prop]); } }, unserialize : function(value) { if (this._isJson(value)) { return JSON.parse(value); } return value; }, serialize : function(value) { if (this._isJson(value)) { return JSON.stringify(value); } return value; }, _listKeys : function(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 : function(key) { return this.options.prefix + key; }, _unprefix : function(key) { return key.substring(this.options.prefix.length); }, _isJson : function(item) { try { JSON.parse(item); } catch (e) { return false; } return true; }, _isObject : function(a) { return (!!a) && (a.constructor === Object); }, _isArray : function(a) { return (!!a) && (a.constructor === Array); } };