Knowing Your Own Metadata
From GreaseSpot
Routine utilizing E4X (ECMAScript for XML) XMLList to retrieve a copy of the initial file metadata block entries and https metadata block entries.
- If a user changes the include/exclude rules via Manage User Scripts, they will not be reflected in this copy.
- If a user omits @namespace, and allows Greasemonkey to supply one, it will not be reflected in this copy.
- Remember to change the @uso:script key to match the scriptid hosted on userscripts.org
function parseHeaders(metadataBlock) {
var headers = {};
var line, name, prefix, header, key, value;
var lines = metadataBlock.split(/\n/).filter(/\/\/ @/);
for each (line in lines) {
[, name, value] = line.match(/\/\/ @(\S+)\s*(.*)/);
switch (name) {
case "licence":
name = "license";
break;
}
[key, prefix] = name.split(/:/).reverse();
if (prefix) {
if (!headers[prefix])
headers[prefix] = new Object;
header = headers[prefix];
} else
header = headers;
if (header[key] && !(header[key] instanceof Array))
header[key] = new Array(header[key]);
if (header[key] instanceof Array)
header[key].push(value);
else
header[key] = value;
}
headers["licence"] = headers["license"];
return headers;
}
var fileMETA = parseHeaders(<><![CDATA[
// ==UserScript==
// @name My Script
// @namespace http://www.example.com/gmscripts
// @description Scripting is fun
// @copyright 2009+, John Doe (http://www.example.com/~jdoe)
// @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html
// @version 0.0.1
// @include http://www.example.com/*
// @include http://www.example.org/*
// @exclude http://www.example.org/foo
// @require foo.js
// @resource resourceName1 resource1.png
// @resource resourceName2 http://www.example.com/resource2.png
// @uso:script scriptid
// ==/UserScript==
]]></>.toString());
GM_xmlhttpRequest({
method:"GET",
url:"https://userscripts.org/scripts/source/" + fileMETA["uso"]["script"] + ".meta.js",
headers:{
"Accept":"text/javascript; charset=UTF-8"
},
overrideMimeType:"application/javascript; charset=UTF-8",
onload:function(response) {
var httpsMETA = parseHeaders(response.responseText);
GM_log([
"\n---------- Local ----------",
fileMETA["name"] + " version " + fileMETA["version"],
fileMETA["copyright"],
fileMETA["license"],
fileMETA["description"],
fileMETA["include"],
fileMETA["exclude"],
"\n---------- Remote ----------",
httpsMETA["name"] + " version " + httpsMETA["version"],
httpsMETA["copyright"],
httpsMETA["license"],
httpsMETA["description"],
httpsMETA["include"],
httpsMETA["exclude"],
httpsMETA["uso"]["script"],
httpsMETA["uso"]["version"],
httpsMETA["uso"]["timestamp"],
httpsMETA["uso"]["hash"],
httpsMETA["uso"]["installs"],
httpsMETA["uso"]["reviews"],
httpsMETA["uso"]["rating"],
httpsMETA["uso"]["discussions"],
httpsMETA["uso"]["fans"]
].join("\n"));
}
});

