🏠 Home 

Greasy Fork is available in English.

SuperGM

Extends the GM_setValue and GM_getValue functions for any javascript variable type. basis on https://userscripts-mirror.org/scripts/source/107941.user.js

สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/389206/727035/SuperGM.js

  1. // ==UserScript==
  2. // @name SuperGM
  3. // @version 0.0.1
  4. // @description Extends the GM_setValue and GM_getValue functions for any javascript variable type. basis on https://userscripts-mirror.org/scripts/source/107941.user.js
  5. // @namespace userscripts.org/users/158640
  6. // ==/UserScript==
  7. (function () {
  8. String.prototype.startsWith = function (str) {
  9. return this.slice(0, str.length) == str;
  10. };
  11. String.prototype.endsWith = function (str) {
  12. return this.slice(-str.length) == str;
  13. };
  14. String.prototype.contains = function (str) {
  15. return this.indexOf(str) > -1;
  16. };
  17. var SuperGM = function (version, _expiredMilliseconds) {
  18. var versionkeybasic = 'tsharp.org:key:v:';
  19. var expiredkeybasic = 'tsharp.org:key:e:';
  20. var JSON_MarkerStr = 'json_val: ';
  21. var FunctionMarker = 'function_code: ';
  22. var expiredMilliseconds = -1;
  23. if (typeof version != 'undefine') { version = -1; }
  24. if (typeof _expiredMilliseconds != 'undefine') {
  25. expiredMilliseconds = -1;
  26. }
  27. else {
  28. expiredMilliseconds = _expiredMilliseconds;
  29. }
  30. function ReportError(msg) {
  31. if (console && console.error) {
  32. console.log(msg);
  33. }
  34. else {
  35. throw new Error(msg);
  36. }
  37. }
  38. //--- Check that the environment is proper.
  39. if (typeof GM_setValue != "function") {
  40. ReportError('This library requires Greasemonkey! GM_setValue is missing.');
  41. }
  42. if (typeof GM_getValue != "function") {
  43. ReportError('This library requires Greasemonkey! GM_getValue is missing.');
  44. }
  45. if (typeof version != 'integer') {
  46. ReportError('Arg version should be a integer type if you wana set it.');
  47. }
  48. if (typeof expiredMilliseconds != 'integer') {
  49. ReportError('Arg expiredMilliseconds should be a integer type if you wana set it.');
  50. }
  51. this.set = function (varName, varValue) {
  52. if (!varName) {
  53. ReportError('Illegal varName sent to GM_SuperValue.set().');
  54. return;
  55. }
  56. if (/[^\w _-]/.test(varName)) {
  57. ReportError('Suspect, probably illegal, varName sent to GM_SuperValue.set().');
  58. }
  59. var versionKey = versionkeybasic + varName;
  60. GM_setValue(versionKey, version);
  61. var expiredkey = expiredkeybasic + varName;
  62. GM_setValue(expiredkey, new Date().getTime());
  63. if (typeof varValue == 'function') {
  64. varValue = varValue();
  65. }
  66. switch (typeof varValue) {
  67. case 'undefined':
  68. ReportError('Illegal varValue sent to GM_SuperValue.set().');
  69. break;
  70. case 'boolean':
  71. case 'string':
  72. //--- These 2 types are safe to store, as is.
  73. GM_setValue(varName, varValue);
  74. break;
  75. case 'number':
  76. /*--- Numbers are ONLY safe if they are integers.
  77. Note that hex numbers, EG 0xA9, get converted
  78. and stored as decimals, EG 169, automatically.
  79. That's a feature of JavaScript.
  80. Also, only a 32-bit, signed integer is allowed.
  81. So we only process +/-2147483647 here.
  82. */
  83. if (varValue === parseInt(varValue) && Math.abs(varValue) < 2147483647) {
  84. GM_setValue(varName, varValue);
  85. break;
  86. }
  87. case 'object':
  88. /*--- For all other cases (but functions), and for
  89. unsafe numbers, store the value as a JSON string.
  90. */
  91. var safeStr = JSON_MarkerStr + JSON.stringify(varValue);
  92. GM_setValue(varName, safeStr);
  93. break;
  94. case 'function':
  95. /*--- Functions need special handling.
  96. */
  97. var safeStr = FunctionMarker + varValue.toString();
  98. GM_setValue(varName, safeStr);
  99. break;
  100. default:
  101. ReportError('Unknown type in GM_SuperValue.set()!');
  102. break;
  103. }
  104. };//-- End of set()
  105. this.getOrAdd = function (varName, defaultValue) {
  106. if (!varName) {
  107. ReportError('Illegal varName sent to GM_SuperValue.get().');
  108. return;
  109. }
  110. if (/[^\w _-]/.test(varName)) {
  111. ReportError('Suspect, probably illegal, varName sent to GM_SuperValue.get().');
  112. }
  113. var versionKey = versionkeybasic + varName;
  114. var savedversion = GM_getValue(versionKey);
  115. if (version != savedversion) { //需判断设置默认-1时
  116. if (typeof GM_deleteValue != "function") {
  117. GM_deleteValue(varName);
  118. GM_deleteValue(versionKey);
  119. }
  120. if (typeof defaultValue == 'function') {
  121. var varvalue = defaultValue();
  122. set(varName, varvalue);
  123. return varvalue;
  124. }
  125. else {
  126. set(varName, varvalue);
  127. return defaultValue;
  128. }
  129. }
  130. var expiredkey = expiredkeybasic + varName;
  131. var expire = GM_getValue(expiredkey);
  132. if (new Date().getTime() - expire > expiredMilliseconds) {
  133. if (typeof GM_deleteValue != "function") {
  134. GM_deleteValue(varName);
  135. GM_deleteValue(expiredkey);
  136. }
  137. }
  138. //--- Attempt to get the value from storage.
  139. var varValue = GM_getValue(varName);
  140. if (!varValue)
  141. return defaultValue;
  142. //--- We got a value from storage. Now unencode it, if necessary.
  143. if (typeof varValue == "string") {
  144. //--- Is it a JSON value?
  145. var regxp = new RegExp('^' + JSON_MarkerStr + '(.+)$');
  146. var m = varValue.match(regxp);
  147. if (m && m.length > 1) {
  148. varValue = JSON.parse(m[1]);
  149. return varValue;
  150. }
  151. //--- Is it a function?
  152. var regxp = new RegExp('^' + FunctionMarker + '((?:.|\n|\r)+)$');
  153. var m = varValue.match(regxp);
  154. if (m && m.length > 1) {
  155. varValue = eval('(' + m[1] + ')');
  156. return varValue;
  157. }
  158. }
  159. return varValue;
  160. };//-- End of get()
  161. this.del = function (varname) {
  162. if (typeof GM_deleteValue != "function")
  163. ReportError('Using del function requires Greasemonkey and grant rights for it! GM_deleteValue is missing.');
  164. GM_deleteValue(varName);
  165. };
  166. this.delStartsWith = function (varname) {
  167. if (typeof GM_deleteValue != "function")
  168. ReportError('Using delStartsWith function requires Greasemonkey and grant rights for it! GM_deleteValue is missing.');
  169. if (typeof GM_listValues != "function")
  170. ReportError('Using delStartsWith function requires Greasemonkey and grant rights for it! GM_listValues is missing.');
  171. for (var item in GM_listValues()) {
  172. if (item.startsWith(varname)) {
  173. GM_deleteValue(item);
  174. }
  175. }
  176. };
  177. }
  178. })();