2008-09-19 18 views
11

¿Hay alguna forma en que mi script pueda recuperar los valores de metadatos que se declaran en su propio encabezado? No veo nada prometedor en la API, excepto quizás GM_getValue(). Eso implicaría, por supuesto, una sintaxis de nombre especial. Lo he intentado, por ejemplo: GM_getValue("@name").¿Tiene acceso a los metadatos de Greasemonkey desde su script?

La motivación aquí es evitar las especificaciones redundantes.

Si los metadatos GM no son accesibles directamente, quizás haya una forma de leer el cuerpo del script en sí. Ciertamente está en la memoria en alguna parte, y no sería demasiado difícil de analizar en "// @". (Esto puede ser necesario en mi caso, de ninguna manera, ya que el valor que estoy realmente interesa es @version, que es un valor extendida leído por userscripts.org.)

Respuesta

7

Esta respuesta no está actualizado: A partir de Greasemonkey 0,9 0,16 (feb 2012) consulte Brock's answer respecto 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 this thread on the greasemonkey-users group para más información. Se puede encontrar una implementación más robusta cerca del final.

4

Sobre la base de la respuesta de Athena, aquí está mi solución generalizada que produce un objeto de pares nombre/valor, cada uno representa una propiedad de metadatos. Tenga en cuenta que ciertas propiedades pueden tener valores múltiples, (@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 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 funciona muy bien en mis scripts.

EDITAR: Agregó @resource y @require, que se introdujeron en Greasemonkey 0.8.0.

EDIT: FF5 + compatibilidad, Array.filter() ya no acepta una expresión regular

4

Uso the GM_info object, que se añadió 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); 


Se dará salida a 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" 
} 
Cuestiones relacionadas