NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @namespace ProxyFiend.ProxyFiendLib // @exclude * // ==UserLibrary== // @name ProxyFiendLib // @description Fixes a few of GreaseMonkey/TamperMonkey's shortfalls. // @copyright 2018, ProxyFiend (https://openuserjs.org/users/ProxyFiend) // @homepageURL https://openuserjs.org/libs/ProxyFiend/ProxyLib/ // @license GPL-3.0-or-later // @version 1.0.1 // ==/UserScript== // ==/UserLibrary== // ==OpenUserJS== // @author ProxyFiend // ==/OpenUserJS== var scriptMeta = parseHeaders(GM.info.scriptMetaStr) /** * Prints a debug message to the console. * @param {string} message - String to be printed as a debug message. * @author ProxyFiend */ function GM_debug(message) { if (scriptMeta.prefix != undefined) { console.debug("[" + scriptMeta.prefix + "] " + message) } else { console.debug("[GM] " + message); } }; /** * Inserts a stylesheet into the page's head tag. * @param {string} url - The URL to insert as a stylesheet. * @author ProxyFiend */ function GM_css(url) { var styleElement = document.createElement("link"); styleElement.setAttribute("type", "text/css"); styleElement.setAttribute("rel", "stylesheet"); styleElement.setAttribute("href", url); document.head.appendChild(styleElement); }; /** * Inserts a script into the page's head tag. * @param {string} url - The URL to insert as a script. * @author ProxyFiend */ function GM_script(url) { var scriptElement = document.createElement("script"); scriptElement.setAttribute("src", url); document.head.appendChild(scriptElement); } /** * Get a JSON object using GreaseMonkey XHR. * @param {Object} data - XHR request data. * @returns Retrieved JSON data. * @author ProxyFiend */ function GM_getJSON(data) { GM_xmlhttpRequest({ method: "GET", url: data.url + "?" + jQuery.param(data.data), onload: function (resp) { data.onload(JSON.parse(resp.responseText), resp); } }); }; /** * Reads and parses the userscript metadata and returns a structured object. * @param {*} metadataBlock Supply GM.info.scriptMetaStr. * @author Marti <https://github.com/Martii> */ function parseHeaders(metadataBlock) { metadataBlock = metadataBlock.toString(); var re = /\/\/ @(\S+)(?:\s+(.*))?/; var headers = {}; var name, prefix, header, key, value; var lines = metadataBlock.split(/[\r\n]+/).filter(function (e, i, a) { return (e.match(re)); }); for (var line in lines) { [, name, value] = lines[line].replace(/\s+$/, "").match(re); switch (name) { case "licence": name = "license"; break; } [key, prefix] = name.split(/:/).reverse(); if (key) { if (prefix) { if (!headers[prefix]) headers[prefix] = new Object; header = headers[prefix]; } else header = headers; if (header[key]) { if (!(header[key] instanceof Array)) header[key] = new Array(header[key]); header[key].push(value || ""); } else header[key] = value || ""; } } if (headers["license"]) headers["licence"] = headers["license"]; return headers; }