Zugriff auf Grease Metadaten aus dem Skript?
-
01-07-2019 - |
Frage
Gibt es eine Möglichkeit, dass mein Skript Metadatenwert abrufen kann, die in ihrem eigenen Header deklariert werden? Ich sehe nichts viel versprechend in der API, mit der Ausnahme vielleicht GM_getValue()
. Das würde natürlich eine besondere Namen Syntax einbeziehen. Ich habe versucht, zum Beispiel:. GM_getValue("@name")
Die Motivation ist hier überflüssig Spezifikation zu vermeiden.
Wenn GM Metadaten nicht direkt zugänglich ist, vielleicht ist es eine Möglichkeit, den Körper des Skripts selbst zu lesen. Es ist sicherlich irgendwo im Speicher, und es wäre nicht zu furchtbar schwer für "// @"
zu analysieren sein. (Das kann in meinem Fall eine Möglichkeit, notwendig sein, da der Wert, den ich wirklich interessiert bin in @version
ist, die ein erweiterter Wert gelesen von userscripts.org .)
Lösung
Diese Antwort ist veraltet: Wie von Greasemonkey 0.9.16 (Feb 2012) finden Sie unter Brocks beantworten bezüglich GM_info
Ja. Ein sehr einfaches Beispiel ist:
var metadata=<>
// ==UserScript==
// @name Reading metadata
// @namespace http://www.afunamatata.com/greasemonkey/
// @description Read in metadata from the header
// @version 0.9
// @include https://stackoverflow.com/questions/104568/accessing-greasemonkey-metadata-from-within-your-script
// ==/UserScript==
</>.toString();
GM_log(metadata);
Siehe dieses Thema auf der Greasemonkey-Benutzer-Gruppe für weitere Informationen. Eine robustere Implementierung kann am Ende gefunden werden.
Andere Tipps
Verwenden Sie das GM_info
Objekt , die hinzugefügt wurde in Version 0.9.16 zu Greasemonkey.
Zum Beispiel, wenn Sie dieses Skript:
// ==UserScript==
// @name _GM_info demo
// @namespace Stack Overflow
// @description Tell me more about me, me, ME!
// @include http://stackoverflow.com/questions/*
// @version 8.8
// ==/UserScript==
unsafeWindow.console.clear ();
unsafeWindow.console.log (GM_info);
Gibt er diese Aufgabe:
{
version: (new String("0.9.18")),
scriptWillUpdate: false,
script: {
description: "Tell me more about me, me, ME!",
excludes: [],
includes: ["http://stackoverflow.com/questions/*"],
matches: [],
name: "_GM_info demo",
namespace: "Stack Overflow",
'run-at': "document-end",
unwrap: false,
version: "8.8"
},
scriptMetaStr: "// @name _GM_info demo\r\n// @namespace Stack Overflow\r\n// @description Tell me more about me, me, ME!\r\n// @include http://stackoverflow.com/questions/*\r\n// @version 8.8\r\n"
}
Aufbauend auf Athena Antwort, hier ist meine verallgemeinerte Lösung, die ein Objekt von Namen / Wert-Paaren ergibt, die jeweils eine Metadateneigenschaft darstellt. Beachten Sie, dass bestimmte Eigenschaften mehrere Werte haben kann, (@include, @exclude, @require, @Resource), deshalb fängt mein Parser diejenigen, die als Arrays -. Oder im Falle von @Resource, als untergeordnete Objekt von Name / Wert-Paare
var scriptMetadata = parseMetadata(.toString()); function parseMetadata(headerBlock) { // split up the lines, omitting those not containing "// @" function isAGmParm(element) { return /\/\/ @/.test(element); } var lines = headerBlock.split(/[\r\n]+/).filter(isAGmParm); // initialize the result object with empty arrays for the enumerated properties var metadata = { include: [], exclude: [], require: [], resource: {} }; for each (var line in lines) { [line, name, value] = line.match(/\/\/ @(\S+)\s*(.*)/); if (metadata[name] instanceof Array) metadata[name].push(value); else if (metadata[name] instanceof Object) { [rName, rValue] = value.split(/\s+/); // each resource is named metadata[name][rName] = rValue; } else metadata[name] = value; } return metadata; } // example usage GM_log("version: " + scriptMetadata["version"]); GM_log("res1: " + scriptMetadata["resource"]["res1"]);
Das ist schön in meinen Skripte zu arbeiten.
EDIT:. Hinzugefügt @Resource und @require, die in Greasemonkey 0.8.0 eingeführt wurden
EDIT: FF5 + Kompatibilität, Array.filter () nicht mehr akzeptiert einen regulären Ausdruck