从脚本中访问Greasemonkey元数据?
时间:2020-03-06 14:27:22 来源:igfitidea点击:
我的脚本有什么方法可以检索在其自己的标头中声明的元数据值?除了" GM_getValue()"之外,我在API中看不到任何有希望的东西。当然,这将涉及特殊的名称语法。我已经尝试过,例如:GM_getValue(" @ name")
。
这里的动机是避免多余的规范。
如果无法直接访问GM元数据,也许有一种方法可以读取脚本本身。它肯定在内存中的某个地方,并且解析"" // @"不会太困难。 (在我的情况下这可能是必需的,因为我真正感兴趣的值是
@ version`,这是userscripts.org读取的扩展值。)
解决方案
这个答案已经过时了:从Greasemonkey 0.9.16(2012年2月)开始,请参阅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);
有关更多信息,请参见lublessmonkey-users组上的该线程。即将结束时可以找到更可靠的实现。
在雅典娜的答案的基础上,这是我的通用解决方案,它产生一个名称/值对的对象,每个对象代表一个元数据属性。请注意,某些属性可以具有多个值(@ 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,这是Greasemonkey 0.8.0中引入的。
编辑:FF5 +兼容性,Array.filter()不再接受正则表达式