2008-09-19 8 views
11

내 스크립트가 자체 헤더에서 선언 된 메타 데이터 값을 검색 할 수있는 방법이 있습니까? 아마 GM_getValue()을 제외하고는 API에서 기대할만한 것이 아무것도 없습니다. 물론 특별한 이름 구문이 필요합니다. 나는 시도했다, 예를 들면 : GM_getValue("@name").스크립트 내에서 Greasemonkey 메타 데이터에 액세스 하시겠습니까?

여기서 동기 부여는 중복 사양을 피하는 것입니다.

GM 메타 데이터에 직접 액세스 할 수없는 경우 스크립트 본문을 읽을 수있는 방법이 있습니다. 그것은 분명히 어딘가에 있고, "// @"을 파싱하는 것은 너무 어렵지 않을 것입니다. (즉, 값 이후 나는 userscripts.org 읽을 확장 된 값입니다 @version입니다 정말 관심이 있어요, 내 경우 어떤 방법으로해야 할 수도 있습니다.)

답변

7

이 대답은 유효 기간이 경과 : 0.9 그리스 몽키의로 0.16 (2012 2월) GM_info


예에 관한 Brock's answer를 참조하십시오. 아주 간단한 예는 다음과 같습니다

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); 

자세한 내용은 this thread on the greasemonkey-users group를 참조하십시오. 결국보다 견고한 구현을 찾을 수 있습니다.

4

아테나의 답을 바탕으로, 각각 메타 데이터 속성을 나타내는 이름/값 쌍의 객체를 생성하는 내 일반적인 솔루션이 있습니다. 특정 속성은 여러 개의 값 (@include, @exclude, @require, @resource)을 가질 수 있으므로 파서는 이름 또는 값 쌍의 하위 개체로 Array 또는 @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 : Greasemonkey 0.8.0에서 처음 소개 된 @resource 및 @require가 추가되었습니다.

편집 : FF5가 + 호환성, Array.filter()는 더 이상 정규 표현식

4

에게 버전 0.9.16에서 그리스 몽키에 추가 된 사용 the GM_info object을지지 않습니다. 예를 들어

,이 스크립트를 실행하는 경우 :

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