Knowing Your Own Metadata

From GreaseSpot

Jump to: navigation, search

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"));
  }
});
Personal tools