Javascript 从脚本中访问Greasemonkey元数据?

Javascript 从脚本中访问Greasemonkey元数据?,javascript,metadata,greasemonkey,Javascript,Metadata,Greasemonkey,我的脚本是否有任何方法可以检索在它自己的头中声明的元数据值?我在API中看不到任何有希望的东西,除了可能GM\u getValue()。这当然会涉及一种特殊的名称语法。我试过,例如:GM\u getValue(@name”) 这里的动机是避免冗余规范 如果不能直接访问GM元数据,那么可能有一种方法可以读取脚本本身的主体。它肯定在内存中的某个地方,要为“/@”解析也不会太难。(这在我的情况下可能是必要的,因为我真正感兴趣的值是@version,这是一个扩展值,由读取者读取。)此答案已过时:自Gre

我的脚本是否有任何方法可以检索在它自己的头中声明的元数据值?我在API中看不到任何有希望的东西,除了可能
GM\u getValue()
。这当然会涉及一种特殊的名称语法。我试过,例如:
GM\u getValue(@name”)

这里的动机是避免冗余规范


如果不能直接访问GM元数据,那么可能有一种方法可以读取脚本本身的主体。它肯定在内存中的某个地方,要为
“/@”
解析也不会太难。(这在我的情况下可能是必要的,因为我真正感兴趣的值是
@version
,这是一个扩展值,由读取者读取。)

此答案已过时:自Greasemonkey 0.9.16(2012年2月)起,请参阅关于
GM_信息的内容


对。一个非常简单的例子是:

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); 
var元数据=
//==用户脚本==
//@name读取元数据
//@名称空间http://www.afunamatata.com/greasemonkey/
//@description已从标头读入元数据
//@version 0.9
//@包括https://stackoverflow.com/questions/104568/accessing-greasemonkey-metadata-from-within-your-script
//==/UserScript==
.toString();
GM_日志(元数据);

有关更多信息,请参阅。接近尾声时可以找到一个更健壮的实现。

基于雅典娜的答案,这里是我的通用解决方案,它生成一个名称/值对的对象,每个对象表示一个元数据属性。请注意,某些属性可以有多个值(@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"]); var scriptMetadata=parseMetadata(.toString()); 函数解析元数据(headerBlock) { //拆分行,忽略不包含“/@”的行 函数isAGmParm(元素){return/\/\/@/.test(元素);} 变量行=headerBlock.split(/[\r\n]+/).filter(isAGmParm); //使用枚举属性的空数组初始化结果对象 var元数据={include:[]、exclude:[]、require:[]、resource:{}; 对于每个(行中的var行) { [line,name,value]=line.match(/\/\/@(\S+)\S*(.*)/); if(元数据[名称]数组实例) 元数据[名称]。推送(值); else if(对象的元数据[名称]实例){ [rName,rValue]=value.split(//\s+/);//每个资源都被命名为 元数据[name][rName]=rValue; } 其他的 元数据[名称]=值; } 返回元数据; } //示例用法 GM_日志(“版本:+scriptMetadata[“版本]); GM_日志(“res1:+scriptMetadata[“resource”][“res1”]); 这在我的脚本中运行得很好

编辑:添加了@resource和@require,它们是在Greasemonkey 0.8.0中引入的

编辑:FF5+兼容性,Array.filter()不再接受正则表达式的使用,该正则表达式已添加到0.9.16版的Greasemonkey中

例如,如果运行此脚本:

// ==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"
}