2008-09-19 21 views
11

क्या कोई तरीका है कि मेरी स्क्रिप्ट मेटाडेटा मानों को पुनर्प्राप्त कर सकती है जो अपने ही शीर्ष में घोषित की जाती हैं? मुझे GM_getValue() को छोड़कर, एपीआई में वादा करने वाला कुछ भी नहीं दिख रहा है। इसमें निश्चित रूप से एक विशेष नाम वाक्यविन्यास शामिल होगा। मैंने कोशिश की है, उदाहरण के लिए: GM_getValue("@name")अपनी स्क्रिप्ट के भीतर से Greasemonkey मेटाडेटा तक पहुंच?

अनावश्यक विनिर्देश से बचने के लिए यहां प्रेरणा है।

यदि जीएम मेटाडाटा सीधे पहुंच योग्य नहीं है, तो शायद स्क्रिप्ट के शरीर को पढ़ने का एक तरीका है। यह निश्चित रूप से कहीं स्मृति में है, और "// @" के लिए पार्स करना बहुत कठिन नहीं होगा। (यही कारण है कि मेरे मामले किसी भी तरह से आवश्यक हो सकता है, मूल्य के बाद से मैं वास्तव में @version है, जो एक विस्तारित मूल्य userscripts.org द्वारा पढ़ा है में दिलचस्पी रखता हूँ।)

उत्तर

7

इस उत्तर पुराना हो चुका है: Greasemonkey 0.9 के रूप में .16 (फरवरी 2012) कृपया के बारे में 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), इसलिए मेरा पार्सर उन लोगों को एरेज़ के रूप में कैप्चर करता है - या @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() अब एक नियमित अभिव्यक्ति

4

उपयोग the GM_info object, जो संस्करण 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" 
} 
संबंधित मुद्दे