Доступ к метаданным Greasemonkey из вашего скрипта? - PullRequest
11 голосов
/ 19 сентября 2008

Есть ли способ, которым мой скрипт может получить значения метаданных, которые объявлены в своем собственном заголовке? Я не вижу ничего перспективного в API, кроме, возможно, GM_getValue(). Это, конечно, будет включать специальный синтаксис имени. Я пробовал, например: GM_getValue("@name").

Мотивация здесь состоит в том, чтобы избежать избыточной спецификации.

Если метаданные GM не доступны напрямую, возможно, есть способ прочитать текст самого сценария. Это, конечно, где-то в памяти, и не было бы слишком сложно разобрать для "// @". (В моем случае это может понадобиться в любом случае, поскольку значение, которое меня действительно интересует, равно @version, что является расширенным значением, читаемым userscripts.org .)

Ответы [ 3 ]

7 голосов
/ 19 сентября 2008

Этот ответ устарел: По состоянию на Greasemonkey 0.9.16 (февраль 2012 г.) см. Ответ Брока относительно GM_info


Да. Очень простой пример:

var metadata=<> 
// ==UserScript==
// @name           Reading metadata
// @namespace      http://www.afunamatata.com/greasemonkey/
// @description    Read in metadata from the header
// @version        0.9
// @include        /104244/dostup-k-metadannym-greasemonkey-iz-vashego-skripta
// ==/UserScript==
</>.toString();

GM_log(metadata); 

См. эту ветку в группе greasemonkey-users для получения дополнительной информации. Более надежная реализация может быть найдена ближе к концу.

6 голосов
/ 07 мая 2012

Используйте объект GM_info , который был добавлен в Greasemonkey в версии 0.9.16.

Например, если вы запустите этот скрипт:

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


Он выведет этот объект:

{
    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"
}
4 голосов
/ 22 сентября 2008

Опираясь на ответ Афины, вот мое обобщенное решение, которое дает объект пар имя / значение, каждая из которых представляет свойство метаданных. Обратите внимание, что некоторые свойства могут иметь несколько значений (@include, @exclude, @require, @resource), поэтому мой анализатор захватывает их как массивы - или, в случае @resource, как подчиненный объект пар имя / значение.

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

Это хорошо работает в моих сценариях.

EDIT: добавлены @resource и @require, которые были введены в Greasemonkey 0.8.0.

РЕДАКТИРОВАТЬ: совместимость с FF5 +, Array.filter () больше не принимает регулярное выражение

...