¿Accediendo a los metadatos de Greasemonkey desde su script?
-
01-07-2019 - |
Pregunta
¿Hay alguna manera de que mi secuencia de comandos pueda recuperar valores de metadatos declarados en su propio encabezado?No veo nada prometedor en la API, excepto quizás GM_getValue()
.Por supuesto, eso implicaría una sintaxis de nombre especial.He probado, por ejemplo: GM_getValue("@name")
.
La motivación aquí es evitar especificaciones redundantes.
Si no se puede acceder directamente a los metadatos de GM, tal vez haya una manera de leer el cuerpo del script.Ciertamente está en algún lugar de la memoria y no sería demasiado difícil analizarlo. "// @"
.(Eso puede ser necesario en mi caso de cualquier manera, ya que el valor que realmente me interesa es @version
, que es un valor extendido leído por userscripts.org.)
Solución
Esta respuesta está desactualizada: A partir de Greasemonkey 0.9.16 (febrero de 2012), consulte la respuesta de brock acerca de GM_info
Sí.Un ejemplo muy simple es:
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);
Ver este hilo en el grupo de usuarios de Greasemonkey para más información.Cerca del final se puede encontrar una implementación más sólida.
Otros consejos
Usar el GM_info
objeto, que se agregó a Greasemonkey en la versión 0.9.16.
Por ejemplo, si ejecuta este 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);
Generará este objeto:
{
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"
}
Sobre la base de la respuesta de Athena, aquí está mi solución generalizada que produce un objeto de pares de nombre/valor, cada uno de los cuales representa una propiedad de metadatos.Tenga en cuenta que ciertas propiedades pueden tener múltiples valores, (@include, @exclude, @require, @resource), por lo tanto, mi analizador las captura como matrices o, en el caso de @resource, como un objeto subordinado de pares de nombre/valor.
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"]);
Esto está funcionando muy bien en mis scripts.
EDITAR:Se agregaron @resource y @require, que se introdujeron en Greasemonkey 0.8.0.
EDITAR:Compatibilidad con FF5+, Array.filter() ya no acepta una expresión regular