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


我的脚本是否有任何方法可以检索在其自己的标头中声明的元数据值?除了也许,我在API中看不出任何有希望的东西 GM_getValue()。那当然会涉及一个特殊的名称语法。我试过,例如: GM_getValue("@name")

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

如果无法直接访问GM元数据,也许有一种方法可以读取脚本本身。它肯定在某个地方的内存中,并且解析起来也不会太难 "// @"。 (在我的情况下,这可能是必要的,因为我真正感兴趣的是 @version,这是一个读取的扩展值 userscripts.org。)


9416
2017-09-19 19:01


起源



答案:


这个答案已经过时了: 截至Greasemonkey 0。0。16(2012年2月),请参阅 布洛克的回答 关于 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); 

看到 在greasemonkey-users组上的这个帖子 了解更多信息。在最后可以找到更强大的实现。


7
2017-09-19 19:28





使用 GM_info 目的,在版本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"
}

5
2018-05-07 00:05





基于Athena的答案,这是我的通用解决方案,它产生一个名称/值对的对象,每个对象代表一个元数据属性。请注意,某些属性可以有多个值(@ include,@ exclude,@ require,@ resource),因此我的解析器将这些值捕获为数组 - 或者在@resource的情况下,作为名称/值对的从属对象。

var scriptMetadata = parseMetadata(.toString());

function parseMetadata(headerBlock)
{
    //拆分行,省略那些不包含“// @”的行
    function isAGmParm(element){return / \ / \ / @ / .test(element); }
    var lines = headerBlock.split(/ [\ r \ n] + /)。filter(isAGmParm);
    //使用空数组初始化结果对象以获取枚举属性
    var metadata = {include:[],exclude:[],require:[],resource:{}};
    为每个(行中的var行)
    {
        [line,name,value] = line.match(/ \ / \ / @(\ S +)\ s *(。*)/);
        if(metadata [name] instanceof Array)
            元数据[名称] .push(值);
        else if(metadata [name] instanceof Object){
            [rName,rValue] = value.split(/ \ s + /); //每个资源都被命名
            metadata [name] [rName] = rValue;
        }
        其他
            metadata [name] = value;
    }
    返回元数据;
}

//示例用法
GM_log(“version:”+ scriptMetadata [“version”]);
GM_log(“res1:”+ scriptMetadata [“resource”] [“res1”]);

这在我的脚本中运行良好。

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

编辑:FF5 +兼容性,Array.filter()不再接受正则表达式


4
2017-09-21 21:01