2008-09-19 12 views
11

Czy istnieje sposób, w jaki mój skrypt może pobrać wartości metadanych, które są zadeklarowane w jego własnym nagłówku? Nie widzę niczego obiecującego w API, z wyjątkiem być może GM_getValue(). To oczywiście wymaga specjalnej składni nazw. Próbowałem, na przykład: GM_getValue("@name").Uzyskiwanie dostępu do metadanych Greasemonkey z poziomu twojego skryptu?

Motywacją jest tutaj uniknięcie zbędnych specyfikacji.

Jeśli metadane GM nie są bezpośrednio dostępne, być może istnieje sposób na odczytanie treści samego skryptu. Jest to z pewnością w pamięci gdzieś i nie byłoby zbyt ciężko parsować dla "// @". (Które mogą być konieczne w moim przypadku żaden sposób, gdyż wartość Jestem bardzo zainteresowany jest @version, który jest rozszerzoną wartość odczytana przez userscripts.org.)

Odpowiedz

7

Ta odpowiedź jest nieaktualny: Od Greasemonkey 0,9 0,16 (lut 2012) zobacz Brock's answer dotyczące GM_info


Tak. Bardzo prosty przykład to:

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); 

Zobacz this thread on the greasemonkey-users group aby uzyskać więcej informacji. Bardziej niezawodną implementację można znaleźć pod koniec.

4

W oparciu o odpowiedź Atheny, oto moje ogólne rozwiązanie, które daje obiekt par nazwa/wartość, z których każda reprezentuje własność metadanych. Zauważ, że niektóre właściwości mogą mieć wiele wartości (@include, @exclude, @require, @resource), dlatego mój parser przechwytuje je jako Array - lub w przypadku @resource jako podrzędny Obiekt par nazwa/wartość.

 
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"]); 

Działa to ładnie w moich skryptach.

EDYCJA: Dodano @resource i @require, które zostały wprowadzone w Greasemonkey 0.8.0.

Edycja: FF5 + Zgodność, Array.filter() nie przyjmuje wyrażenie regularne

4

Zastosowanie the GM_info object, który został dodany do GreaseMonkey w wersji 0.9.16.

Na przykład, jeśli uruchomić ten skrypt:

// ==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); 


Będzie wyjście obiektu:

{ 
    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" 
} 
Powiązane problemy