Доступ к метаданным Механика из сценария?

В дополнение к другим ответам структура может (но обычно не имеет) иметь виртуальные функции, и в этом случае размер структуры также будет содержать пространство для vtbl.

11
задан Chris Noe 19 September 2008 в 19:01
поделиться

2 ответа

Этот ответ устарел: С Механика 0.9.16 (февраль 2012) посмотрите ответ Brock относительно 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        https://stackoverflow.com/questions/104568/accessing-greasemonkey-metadata-from-within-your-script
// ==/UserScript==
</>.toString();

GM_log(metadata); 

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

7
ответ дан 3 December 2019 в 06:49
поделиться

Основываясь на ответе Athena's, вот мое обобщенное решение, которое приводит к объекту пар имя/значение, каждый представляющий свойство метаданных. Обратите внимание, что определенные свойства могут иметь несколько значений, (@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"]);

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

Править: Добавленный @resource и @require, которые были представлены в Механике 0.8.0.

Править: FF5 + совместимость, Array.filter () больше не принимает регулярное выражение

4
ответ дан 3 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: