هل تريد الوصول إلى بيانات تعريف Greasemonkey من داخل البرنامج النصي الخاص بك؟

StackOverflow https://stackoverflow.com/questions/104568

سؤال

هل هناك أي طريقة يمكن للبرنامج النصي الخاص بي من خلالها استرداد قيم البيانات التعريفية المعلنة في رأسه الخاص؟لا أرى أي شيء واعد في واجهة برمجة التطبيقات (API)، إلا ربما GM_getValue().سيتضمن ذلك بالطبع صيغة اسم خاصة.لقد حاولت على سبيل المثال: GM_getValue("@name").

الدافع هنا هو تجنب المواصفات الزائدة عن الحاجة.

إذا لم يكن من الممكن الوصول إلى البيانات التعريفية لـ GM بشكل مباشر، فربما تكون هناك طريقة لقراءة نص البرنامج النصي نفسه.من المؤكد أنها موجودة في الذاكرة في مكان ما، ولن يكون من الصعب تحليلها "// @".(قد يكون ذلك ضروريًا في حالتي بأي شكل من الأشكال، نظرًا لأن القيمة التي أهتم بها حقًا هي @version, ، وهي قيمة موسعة تمت قراءتها بواسطة userscripts.org.)

هل كانت مفيدة؟

المحلول

هذه الإجابة قديمة: اعتبارًا من Greasemonkey 0.9.16 (فبراير 2012) يرجى الاطلاع إجابة بروك متعلق 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); 

يرى هذا الموضوع على مجموعة مستخدمي Greemonkey للمزيد من المعلومات.يمكن العثور على تنفيذ أكثر قوة بالقرب من النهاية.

نصائح أخرى

يستخدم ال GM_info هدف, ، والذي تمت إضافته إلى Greasemonkey في الإصدار 0.9.16.

على سبيل المثال، إذا قمت بتشغيل هذا البرنامج النصي:

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

بناءً على إجابة أثينا، هذا هو الحل المعمم الذي ينتج عنه كائن من أزواج الاسم/القيمة، يمثل كل منها خاصية بيانات التعريف.لاحظ أن بعض الخصائص يمكن أن تحتوي على قيم متعددة، (@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() يقبل التعبير العادي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top