11

独自のヘッダーで宣言されているメタデータ値をスクリプトで取得できる方法はありますか? おそらくGM_getValue(). もちろん、それには特別な名前の構文が含まれます。たとえば、試してみましGM_getValue("@name")た。

ここでの動機は、冗長な仕様を避けることです。

GM メタデータに直接アクセスできない場合は、おそらくスクリプト自体の本文を読み取る方法があります。それは確かにメモリのどこかにあり、解析するのはそれほど難しくありません"// @"。(私が本当に興味を持っている値はuserscripts.org@versionによって読み取られる拡張値であるため、私の場合は何らかの方法で必要になる場合があります。)

4

3 に答える 3

7

この回答は古くなっています: 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); 

詳細については、グリースモンキー ユーザー グループのこのスレッドを参照してください。より堅牢な実装は、最後の方にあります。

于 2008-09-19T19:28:40.303 に答える
7

バージョン 0.9.16 で Greasemonkey に追加されたobjectを使用します。GM_info

たとえば、次のスクリプトを実行すると:

// ==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"
}
于 2012-05-07T00:05:35.517 に答える
4

Athena の回答に基づいて、それぞれがメタデータ プロパティを表す名前と値のペアのオブジェクトを生成する一般化されたソリューションを次に示します。特定のプロパティは複数の値 (@include、@exclude、@require、@resource) を持つことができることに注意してください。したがって、パーサーはそれらを配列としてキャプチャします。@resource の場合は、名前と値のペアの従属オブジェクトとしてキャプチャします。

var scriptMetadata = parseMetadata(.toString());

関数 parseMetadata(headerBlock)
{
    // 行を分割し、"// @" を含まない行を省略します
    関数 isAGmParm(要素) { return /\/\/ @/.test(要素); }
    var lines = headerBlock.split(/[\r\n]+/).filter(isAGmParm);
    // 列挙されたプロパティの空の配列で結果オブジェクトを初期化します
    var メタデータ = { include: []、exclude: []、require: []、resource: {} };
    for each (var line in lines)
    {
        [行、名前、値] = line.match(/\/\/ @(\S+)\s*(.*)/);
        if (metadata[name] instanceof Array)
            メタデータ[名前].push(値);
        else if (metadata[name] instanceof Object) {
            [rName, rValue] = value.split(/\s+/); // 各リソースに名前が付けられます
            メタデータ[名前][rName] = rValue;
        }
        そうしないと
            メタデータ[名前] = 値;
    }
    メタデータを返します。
}

// 使用例
GM_log("バージョン: " + scriptMetadata["バージョン"]);
GM_log("res1: " + scriptMetadata["リソース"]["res1"]);

これは私のスクリプトでうまく機能しています。

編集: Greasemonkey 0.8.0 で導入された @resource と @require を追加しました。

編集: FF5+ との互換性、Array.filter() は正規表現を受け入れなくなりました

于 2008-09-21T21:01:34.913 に答える