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