2008-09-19 2 views
11

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

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

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

ответ

7

Этого ответ устарело: По состоянию на Greasemonkey 0,9 +0,16 (февраль 2012) см Brock's answer относительно 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); 

См this thread on the greasemonkey-users group для получения дополнительной информации. Более надежная реализация может быть найдена ближе к концу.

4

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

4

Использование the GM_info object, который был добавлен в 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" 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^