Accéder aux métadonnées Greasemonkey à partir de votre script?
-
01-07-2019 - |
Question
Mon script peut-il extraire des métadonnées déclarées dans son propre en-tête? Je ne vois rien de prometteur dans l'API, sauf peut-être GM_getValue ()
. Cela impliquerait bien sûr une syntaxe de nom spéciale. J'ai essayé, par exemple: GM_getValue ("@ name")
.
La motivation ici est d'éviter les spécifications redondantes.
Si les métadonnées de GM ne sont pas directement accessibles, il existe peut-être un moyen de lire le corps du script lui-même. C'est certainement en mémoire quelque part, et il ne serait pas trop difficile d'analyser "// @" et
. (Cela peut être nécessaire dans mon cas de toute façon, car la valeur qui m'intéresse vraiment est @version
, qui est une valeur étendue lue par userscripts.org .)
La solution
Cette réponse est obsolète: À compter de Greasemonkey 0.9.16 (février 2012), consultez la page Brock's. répondre sur GM_info
Oui. Un exemple très simple est:
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);
Voir ce fil de discussion sur le groupe d'utilisateurs de clé greasemon pour plus d'informations. Une implémentation plus robuste peut être trouvée vers la fin.
Autres conseils
Utilisez l'objet GM_info
, qui a été ajouté à Greasemonkey dans la version 0.9 .16.
Par exemple, si vous exécutez ce script:
// ==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);
Il va sortir cet objet:
{
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"
}
S'appuyant sur la réponse d'Athena, voici ma solution généralisée qui donne un objet composé de paires nom / valeur, chacune représentant une propriété de métadonnées. Notez que certaines propriétés peuvent avoir plusieurs valeurs (@include, @exclude, @require, @resource). Par conséquent, mon analyseur les capture sous forme de tableaux - ou, dans le cas de @resource, en tant qu'objet subordonné de paires nom / valeur. / p>
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"]);
Cela fonctionne bien dans mes scripts.
EDIT: Ajout des ressources @resource et @require, introduites dans Greasemonkey 0.8.0.
EDIT: compatibilité FF5 +, Array.filter () n'accepte plus d'expression régulière