محرر المستخدمين مفتوح المصدر لـ Safari
يتوفر UsperScripts لنظام التشغيل iOS (iPados) و MacOS. بالنسبة لجميع الإصدارات ، يتم التثبيت من خلال متجر تطبيقات Apple. على MacOS ، تم توفير الإصدارات قبل 4.x
لتنزيل وتثبيت مباشرة من المستودع ، ولكن بسبب التغييرات في الطريقة التي تتيح بها Apple للمطورين توزيع التطبيقات المصممة باستخدام واجهة برمجة تطبيقات Webextension ، لم يعد هذا خيارًا.
لتشغيل المستخدمين على iOS ، يجب أن تكون على iOS 15.1 أو أعلى.
لتشغيل المستخدمين على MacOS ، يجب عليك تشغيل MacOS 12 أو أعلى ، إلى جانب Safari 14.1 أو أعلى.
رابط متجر التطبيقات
تقدم التنمية
يوصي بقراءة هذا الوثائق ، وإذا كان لديك وقت ، شاهد نظرة عامة على الفيديو التالية للتعرف على التطبيق والتمديد.
بمجرد تنزيل التطبيق وتثبيته ، يجب اتخاذ الخطوات التالية:
بعد تثبيت تطبيق iOS ، تحتاج إلى خطوتين رئيسيتين لجعل التمديد يعمل:
افتح التطبيق وقم بتعيين دليل (لحفظ وتحميل المستخدمين)
Set Userscripts Directory
وحدد الدليلتمكين التمديد في Safari (ومنح أذونات)
AA
على iPhone ، extension-icon
على iPad ، حيث تقوم أيضًا بفتح واجهة popup
للامتداد)Always Allow
للمستخدمين لجميع All Websites
ملحوظة
لا يمكن للتطبيق اكتشاف ما إذا كنت قد قمت بتمكين الامتداد في Safari ، وبالتالي ، لن يتغير موجه التطبيق بعد تمكين التمديد. حاليًا يتم استخدام واجهة التطبيق فقط لتعيين أو تغيير دليل المستخدمين.
يمكنك تحديد مجلد ICLOUD لمزامنة البرامج النصية بين MACOS و iOS ، ولكن يرجى ملاحظة أنه قد يكون هناك تأخير في المزامنة ، وقد تواجه ملفات يتم إبعادها بسبب تحسين ICLOUD ، يرجى الرجوع إلى #424.
هناك طريقتان رئيسيتان لتثبيت برنامج نصي للمستخدم من إصدار iOS:
.user.js
في Safari ، ثم افتح popup
المنبثقة وسترى موجه التثبيت.user.js
مباشرة إلى دليل المستخدمين الذين حددته أعلاه نصيحة
كل من العمل أعلاه جيدا على قدم المساواة في إصدار MacOS.
لا يتضمن إصدار iOS محرر البرنامج النصي الذي يوفره إصدار MacOS ، ولكن يمكنك دائمًا تحرير ملفات البرامج النصية في الدليل الذي تقوم بتعيينه مباشرة على iOS. (استخدم أي تطبيقات محرر رمز الطرف الثالث ، ودعم الفتح والتحرير في مكانها)
بعد تثبيت المستخدمين على MacOS ، لا تحتاج إلى تحديد دليل المستخدمين إذا كنت لا تخطط لمزامنة المستخدمين بين الأجهزة المتعددة. بدلاً من ذلك ، يمكنك اختيار استخدام الدليل الافتراضي ، والذي يقع في ~/User/Library/Containers/Userscripts/Data/Documents/scripts
- مرة أخرى ، هذا هو السلوك الافتراضي (والأوتوماتيكي). تحتاج فقط إلى تحديد موقع جديد إذا كنت ترغب في تخزين UsperScripts في مكان آخر ، وهو أمر مفيد بشكل خاص إذا كنت تستخدم محرر رمز خارجي مثل Sublime Text أو VSCode.
ارجع إلى صفحة الدليل الرسمي لشركة Apple: استخدم ملحقات Safari على جهاز Mac الخاص بك
إليك مقطع قصير يوضح كيفية إنشاء/إضافة مستخدمين في Safari بسهولة باستخدام هذا الملحق على MacOS
settings
(الممثل بواسطة COG) إعدادات الإعدادات (تمت مناقشتها أدناه)plus
للمستخدمين إضافة عناصر جديدةNew CSS
هو "مستخدمين" يتوقع رمز CSSNew Javascript
هي مستخدمي نموذج أولي يتوقع رمز JavaScriptNew Remote
للمستخدم بإضافة مستضافة عن بُعد (أو نمط) عن طريق إدخال عنوان الويب ( على سبيل المثال: https://www.k21p.com/example.user.js
)@version
@updateURL
Discard
- أثناء التحرير ، يعود أي تغييرات غير محفوظة قمت بإجرائها على المستخدمينSave
- أثناء التحرير ، يحفظ جميع التغييرات التي أجريتها على المستخدمينCommand + S
هو اختصار لوحة المفاتيح للإجراء() [] {} "" ''
4
لأن استخدام 2
هو جنون مطلق@match
(بنية نمط المطابقة) ، سيتم تجاهل عنوان URL للصفحة مع نمط في هذه القائمة لحقن البرنامج النصييدعم Assercripts Safari حاليًا بيانات تعريف المستخدمين التالية:
@name
- سيكون هذا هو الاسم الذي يعرض في الشريط الجانبي ويتم استخدامه كاسم الملف - لا يمكنك استخدام نفس الاسم لملفات متعددة من نفس النوع@description
- استخدم هذا لوصف ما يفعله المستخدمون الخاص بك - سيتم عرض هذا في الشريط الجانبي - هناك إعداد لإخفاء الأوصاف@icon
- لا يحتوي هذا على وظيفة مع مدير المستخدمين ، ولكن القيمة الأولى المقدمة في البيانات الوصفية ستكون متاحة في كائن GM_/GM.info
@match
- أنماط مطابقة المجال - يمكنك استخدام عدة مثيلات من هذا الحقل إذا كنت ترغبhttp/s
فقط@exclude-match
- أنماط المجال حيث لا تريد تشغيل البرنامج النصي@include
- يستخدم للمطابقة مع عناوين URL للحقن والكرات والتعبيرات العادية ، اقرأ المزيد هنا@exclude
- وظائف بطريقة مماثلة مثل @include
ولكن بدلاً من الحقن ، فإن المباراة ضد قيمة هذا المفتاح ستمنع الحقن@inject-into
- يسمح للمستخدم باختيار السياق الذي يجب ضخه البرنامج النصي فيauto
(افتراضي) ، content
، page
GM
متاحة فقط عند استخدام content
@run-at
@weight
@require
@version
@updateURL
، سيسمح ذلك للمستخدم بتحديث المستخدمين من مصدر عن بُعد ، إذا كان الإصدار الموجود على جهازه <
إصدار في عنوان URL للتحديث@version
أي شيء بمفرده ، يجب إقرانه مع @updateURL
لتحديث عن بُعد للعمل بشكل صحيح@updateURL
>
على الجهاز المحلي ، فسيتم تحديث الملف@updateURL
لا يفعل شيئًا بمفرده ، يجب إقرانه مع @version
التحديث عن بُعد" لتعمل بشكل صحيح@downloadURL
@version
و @updateURL
)@version
و @updateURL
، إذا كان الإصدار المحلي هو <
إصدار الملف الذي يشير إليه @updateURL
، فسيحاول الامتداد تحديث رمز الملف مع محتويات الملف الموجود في @downloadURL
@downloadURL
بأي شيء بمفرده ، فهو يحتاج إلى @version
و @updateURL
لتقديمه من أجل العمل بشكل صحيح@noframes
@grant
APIs
الخاصة (إن وجدت) ، واحد على كل خط @grant
، سيتم توفير طرق API فقط.@grant
، فلن يتم افتراض none
.none
وشيء آخر ، none
له الأسبقية. جميع المستخدمين يحتاجون إلى ما لا يقل عن 1 @match
أو @include
للتشغيل!
يدعم المستخدمون حاليًا أساليب API التالية. جميع الطرق غير متزامنة ما لم يذكر خلاف ذلك. يجب على المستخدمين @grant
هذه الأساليب من أجل استخدامها في مستخدمي. عند استخدام أساليب API ، من الممكن فقط الحقن في نطاق البرنامج النصي للمحتوى بسبب مخاوف الأمان.
ملحوظة
ينطبق وصف API التالي على أحدث فرع التطوير ، فقد تحتاج إلى التحقق من الوثائق الخاصة بالإصدار المقابل. يرجى التبديل إلى الإصدار الذي تريد التحقق منه عبر Branches
أو Tags
في الأعلى.
على سبيل المثال ، لإصدار V4.xx من متجر التطبيقات: https://github.com/quoid/userscripts/tree/release/4.xx
للحصول على تعريفات نوع API ، يرجى الرجوع إلى: types.d.ts
GM.addStyle(css)
css: String
Promise
، حل إذا نجحت ، مرفوض برسالة الخطأ إذا فشلتGM.setValue(key, value)
key: String
value: Any
- يمكن أن يكون json serializedPromise
، حل إذا نجحت ، مرفوض برسالة الخطأ إذا فشلتGM.getValue(key, defaultValue)
key: String
defaultValue: Any
- اختياريPromise
، تم حله value
التي تم تعيينها أو توفيرها أو undefined
defaultValue
إذا نجحت ، تم رفضها برسالة الخطأ إذا فشلتGM.deleteValue(key)
key: String
Promise
، حل إذا نجحت ، مرفوض برسالة الخطأ إذا فشلتGM.listValues()
Promise
، تم حله بمجموعة من الأسماء الرئيسية للقيم المحددة حاليًا إذا نجحت ، مرفوض برسالة خطأ إذا فشلتGM.getTab()
Promise
، يتم حله مع Any
بيانات ثابتة طالما كانت علامة التبويب هذه مفتوحة إذا نجحت ، ورفضت برسالة الخطأ إذا فشلتGM.saveTab(tabObj)
tabObj: Any
- يمكن أن يكون json serializedPromise
، حل إذا نجحت ، مرفوض برسالة الخطأ إذا فشلتGM.openInTab(url, openInBackground)
url: String
openInBackground: Bool
- اختياري ، false
بشكل افتراضيPromise
، تم حله باستخدام بيانات علامة التبويب لعلامة التبويب التي تم فتحها للتو إذا نجحت ، ورفضت برسالة الخطأ إذا فشلتGM.closeTab(tabId)
tabId: Int
- اختياري ، caller tab
افتراضيًاPromise
، حل إذا نجحت ، مرفوض برسالة الخطأ إذا فشلتGM.setClipboard(data, type)
data: String
type: String
- اختياري ، text/plain
افتراضيًاPromise
، يتم حله بقيمة Bool
تشير إلى نجاح أو تفشل ، يتم رفضها برسالة الخطأ إذا فشلتGM.info
&& GM_info
@grant
scriptHandler: String
- Returns Userscripts
version: String
- إصدار تطبيق المستخدمينscriptMetaStr: String
- Metablock للبرنامج النصي الذي يتم تشغيله حاليًاscript: Object
- يحتوي على بيانات حول البرنامج النصي الذي يتم تشغيله حاليًاdescription: String
exclude-match: [String]
excludes: [String]
grant: [String]
includes: [String]
inject-into: String
matches: [String]
name: String
namespace: String
noframes: Bool
require: [String]
resources: [String]
- لم يتم تنفيذها حاليًاrun-at: String
version: String
- قيمة إصدار المستخدمينGM.xmlHttpRequest(details)
details: Object
details
يقبل الخصائص التاليةurl: String
- مطلوبmethod: String
- اختيارية ، GET
افتراضيًاuser: String
- اختياريpassword: String
- اختياريةheaders: Object
- اختياريoverrideMimeType: String
- اختياريةtimeout: Int
- اختياريbinary: Bool
- اختياري (تم إهماله ، استخدم كائنات البيانات الثنائية مثل Blob
، ArrayBuffer
، TypedArray
، إلخ. بدلاً من ذلك.)data: String | Blob | ArrayBuffer | TypedArray | DataView | FormData | URLSearchParams
- اختياريresponseType: String
- اختياريةXMLHttpRequests
onabort: Function
- اختياريةonerror: Function
- اختياريonload: Function
- اختياريonloadend: Function
- اختياريonloadstart: Function
- اختياريonprogress: Function
- اختياريةonreadystatechange: Function
- اختياريةontimeout: Function
- اختياريreadyState
response
responseHeaders
responseType
responseURL
status
statusText
timeout
responseText
(عندما تكون responseType
text
)Promise
مخصص يحتوي على abort
خاصية إضافية ، يتم حلها باستخدام كائن الاستجابة.const xhr = GM.xmlHttpRequest({...});
xhr.abort();
لإحباط الطلبconst response = await xhr;
const response = await GM.xmlHttpRequest({...});
GM_xmlhttpRequest(details)
GM.xmlHttpRequest(details)
، باستثناء:abort
، وهي Function
const foo = GM.xmlHttpRequest({...});
... foo.abort();
لإحباط الطلب هذا هو الدليل الذي سيقرأه التطبيق/الامتداد والكتابة إليه. يتم تغيير هذا الدليل عن طريق فتح التطبيق المحتوي والنقر فوق الزر "تغيير الموقع".
ملاحظات دليل البرنامج النصي
إذا واجهت مشكلة أثناء استخدام هذا التطبيق/التمديد أو في حاجة إلى بعض المساعدة ، فيرجى فتح مشكلة هنا في المستودع. عند القيام بذلك ، يرجى تقديم أكبر قدر ممكن من التفاصيل. يتضمن ذلك مواصفات نظام الإدراج وما هو موقع الويب والبرنامج النصي الذي تحاول تنفيذه. يرجى اتباع قالب القضية!
"رفض تنفيذ نصي" خطأ (أخطاء) ، ماذا يجب أن أفعل!؟
أنت ترى هذا الخطأ بسبب سياسة أمان محتوى الموقع. حاليًا لا توجد طريقة للسماح برامج نصوص محتوى الامتداد بتجاوز CSPs في Safari.
تلقائيًا ، سيحاول الامتداد التحايل على CSPs الصارمة ، ولكن إذا كنت لا تزال تواجه مشكلات ، في محاولة لضبط مفتاح MetAdata/val
// @inject-into auto
أو// @inject-into content
.يمكنك قراءة المزيد حول هذا الموضوع في هذه القضية.
هل أحتاج إلى استخدام محرر الامتداد لإنشاء مستخدمين جدد أو لتحرير الموجود؟
يمكنك استخدام المحرر الخاص بك لتحديث ملفاتك وإدارتها. طالما أنك تقوم بحفظ الملفات إلى موقع حفظ ، ويتم تنسيقها بشكل صحيح ، فيجب حقنها. ومع ذلك ، يجب عليك فتح المنبثقة التمديد مسبقًا. هذا يعني ، إذا قمت بإنشاء جهاز مستخدم جديد أو تحريره مع محرر خارجي وحفظه في موقع الحفظ ، قبل أن يحدث الحقن بشكل صحيح ، يجب فتح المنبثقة التمديد ويجب تحميل المنبثقة تمامًا.
ما هي اختصارات لوحة المفاتيح؟
أثناء استخدام المحرر المضمون ، سيقوم النقر فوق
⌘ + s
بحفظ الملف. أثناء عمل المحرر ، سيقوم النقر فوق⌘ + f
بإظهار شريط البحث وسيخفيهesc
.
عندما أستخدم @require
، أين يتم تخزين الملفات المطلوبة؟
يتم حفظ جميع الملفات المطلوبة كملفات JavaScript في مجلد حاوية الامتداد في MacOS 11.x. يقع هذا المجلد في موقع حفظ الافتراضي ، على:
~/Library/Containers/Userscripts/Data/Documents/require/
.إذا قمت بنقل الملفات من المجلد المتطلبات أو تحرير ملف
manifest.json
يدويًا ، فمن المحتمل أن تقطع وظيفة التطبيق/التمديد.
مساهمات مستوى الكود يرجى الرجوع إلى المساهمة. md
علاوة على ذلك ، فإن أي قضية تحمل علامة "المساعدة المطلوبة" تسعى بنشاط للحصول على المساعدة. يرجى الرد على تلك المشكلات المتعلقة بالتعليقات أو التوجيه أو عروض المساعدة في الترميز.
ستكون المشاركة والتفاعل مع أي Issues
أو Discussions
موجودة مساعدة كبيرة للمشروع والمجتمعات المفتوحة المصدر. شكرا لك على مساهماتك.
إن أسرع وأسهل طريقة لدعم المشروع هي ترك مراجعة إيجابية في متجر التطبيقات إذا كنت تستمتع بالتمديد وترغب في رؤية تحسينات مستقبلية. رؤية هذه المراجعات ، اسمحوا لي أن أعرف أنني أفعل شيئًا صحيحًا ، أو خطأ ، وتحفزني على مواصلة العمل في المشروع.
ثاني أفضل طريقة للمساعدة هي التسجيل في اختبار الإصدار الجديد من التطبيق. نظرًا لأن هذا الامتداد يقدر خصوصيتك ، ولا يجمع أي بيانات من المستخدمين ، فمن الصعب قياس كيفية استخدام الامتداد. من خلال التسجيل ليكون اختبارًا تجريبيًا ، فإنه لا يسمح لك فقط باختبار الميزات القادمة ، ولكن أيضًا يتيح لي الفرصة لاستنباط ملاحظات مباشرة من المستخدمين الحقيقيين.
يرجى الانضمام واختبار إصدار بيتا المقابل في الإصدارات عبر رابط TestFlight العام.
لا تقوم UsperScripts بجمع أي بيانات من مستخدميها ولا تراقب الأنشطة أو الإجراءات التي تقوم بها داخل التطبيق والتمديد. هذا يعني أن كل ما تفعله بالتطبيق والتمديد خاص بك ولا يتم مشاركته أبدًا مع المطورين أو أطراف ثالثة. نظرًا لعدم وجود جمع بيانات ، لا يوجد الاحتفاظ بالبيانات من أي نوع.
حقوق الطبع والنشر (ج) 2018-2024 جوستين واساك
مرخصة بموجب ترخيص GNU General Public V3.0 لجميع طلبات المصادر المفتوحة. مطلوب ترخيص تجاري لجميع الطلبات الأخرى.