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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top