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);
- }
- };