- الرئيسية
- Documentation
- الأصلية
- أدوات الوسائط والنظام الأصلية
أدوات الوسائط والنظام الأصلية
هذا المستند هو تحليل معمّق لنظام فرعي خاص بطبقة البدائيات الأصلية للنظام/الوسائط/التحويل الموصوفة في docs/natives-architecture.md: image وhtml وclipboard وتحليل أداء work.
ملفات التنفيذ
Section titled “ملفات التنفيذ”crates/pi-natives/src/image.rscrates/pi-natives/src/html.rscrates/pi-natives/src/clipboard.rscrates/pi-natives/src/prof.rscrates/pi-natives/src/task.rspackages/natives/src/image/index.tspackages/natives/src/image/types.tspackages/natives/src/html/index.tspackages/natives/src/html/types.tspackages/natives/src/clipboard/index.tspackages/natives/src/clipboard/types.tspackages/natives/src/work/index.tspackages/natives/src/work/types.ts
ملاحظة: لا يوجد ملف
crates/pi-natives/src/work.rs؛ تحليل أداء العمل مُنفَّذ فيprof.rsويُغذَّى بالأدوات الموجودة فيtask.rs.
ربط واجهة TS البرمجية ↔ تصدير/وحدة Rust
Section titled “ربط واجهة TS البرمجية ↔ تصدير/وحدة Rust”| تصدير TS (packages/natives) | تصدير N-API في Rust | وحدة Rust |
|---|---|---|
PhotonImage.parse(bytes) | PhotonImage::parse | image.rs |
PhotonImage#resize(width, height, filter) | PhotonImage::resize | image.rs |
PhotonImage#encode(format, quality) | PhotonImage::encode | image.rs |
htmlToMarkdown(html, options) | html_to_markdown | html.rs |
copyToClipboard(text) | copy_to_clipboard + منطق احتياطي في TS | clipboard.rs + clipboard/index.ts |
readImageFromClipboard() | read_image_from_clipboard | clipboard.rs |
getWorkProfile(lastSeconds) | get_work_profile | prof.rs |
حدود تنسيقات البيانات والتحويلات
Section titled “حدود تنسيقات البيانات والتحويلات”الصورة (image)
Section titled “الصورة (image)”- حد الإدخال في JS: بايتات صورة مُرمَّزة من نوع
Uint8Array. - حد فك الترميز في Rust: تُنسَخ البايتات إلى
Vec<u8>، ويُخمَّن التنسيق باستخدامImageReader::with_guessed_format()، ثم يُفكّ الترميز إلىDynamicImage. - الحالة في الذاكرة: يخزّن
PhotonImageالقيمةArc<DynamicImage>. - حد الإخراج: تُعيد
encode(format, quality)القيمةPromise<Uint8Array>(أيVec<u8>في Rust).
معرّفات التنسيقات رقمية:
0: PNG1: JPEG2: WebP (مُرمِّز بدون فقدان)3: GIF
القيود:
- يُستخدَم
qualityفقط مع JPEG. - تتجاهل PNG/WebP/GIF القيمة
quality. - تفشل معرّفات التنسيقات غير المدعومة (
Invalid image format: <id>).
تحويل HTML (html)
Section titled “تحويل HTML (html)”- حد الإدخال في JS: سلسلة نصية
stringمن HTML + كائن اختياري{ cleanContent?: boolean; skipImages?: boolean }. - حد التحويل في Rust: يُحوَّل الإدخال
Stringبواسطةhtml_to_markdown_rs::convert. - حد الإخراج: سلسلة نصية
stringبتنسيق Markdown.
سلوك التحويل:
- القيمة الافتراضية لـ
cleanContentهيfalse. - عند تعيين
cleanContent=true، تُفعَّل المعالجة المسبقة معPreprocessingPreset::Aggressiveوعلامات الإزالة الصارمة للتنقل والنماذج. - القيمة الافتراضية لـ
skipImagesهيfalse.
الحافظة (clipboard)
Section titled “الحافظة (clipboard)”- مسار النص:
- تُصدر TS أولاً OSC 52 (
\x1b]52;c;<base64>\x07) عندما يكون stdout طرفية TTY. - ثم يُحاوَل نسخ نفس النص عبر واجهة الحافظة الأصلية (
native.copyToClipboard) كمحاولة أفضل جهد. - على Termux، تحاول TS استخدام
termux-clipboard-setأولاً.
- تُصدر TS أولاً OSC 52 (
- مسار قراءة الصورة:
- يقرأ Rust الصورة الخام من
arboard. - يُعيد Rust ترميزها إلى بايتات PNG (مكتبة
image)، ويُعيد{ data: Uint8Array, mimeType: "image/png" }. - تُعيد TS القيمة
nullمبكراً على Termux أو جلسات Linux بدون خادم عرض (عند غيابDISPLAY/WAYLAND_DISPLAY).
- يقرأ Rust الصورة الخام من
تحليل أداء العمل (work)
Section titled “تحليل أداء العمل (work)”- حد التجميع: تُنتَج عينات التحليل بواسطة حراسات
profile_region(tag)فيtask::blockingوtask::future. - تنسيق التخزين: مخزن مؤقت دائري بحجم ثابت (
MAX_SAMPLES = 10_000) يخزّن مسار المكدس + المدة (μs) + الطابع الزمني (μs منذ بدء العملية). - حد الإخراج: تُعيد
getWorkProfile(lastSeconds)كائناً يحتوي على:folded: نص مكدس مطوي (مدخل رسم اللهب البياني)summary: جدول ملخص بتنسيق markdownsvg: رسم SVG اختياري لرسم اللهب البيانيtotalMs،sampleCount
دورة الحياة وانتقالات الحالة
Section titled “دورة الحياة وانتقالات الحالة”دورة حياة الصورة
Section titled “دورة حياة الصورة”- تُجدوِل
PhotonImage.parse(bytes)مهمة فك ترميز حاجبة (image.decode). - عند النجاح، يوجد مقبض
PhotonImageأصلي في JS. - تُنشئ
resize(...)مقبضاً أصلياً جديداً (image.resize)، ويمكن أن يتواجد المقبض القديم والجديد معاً. - تُجسِّد
encode(...)البايتات (image.encode) دون تغيير أبعاد الصورة.
انتقالات الفشل:
- فشل اكتشاف التنسيق/فك الترميز يرفض وعد التحليل.
- فشل الترميز يرفض وعد الترميز.
- معرّف التنسيق غير الصالح يرفض وعد الترميز.
دورة حياة HTML
Section titled “دورة حياة HTML”- تُجدوِل
htmlToMarkdown(html, options)مهمة تحويل حاجبة. - يعمل التحويل مع الخيارات الافتراضية (
cleanContent=false،skipImages=false) ما لم تُحدَّد. - تُعيد سلسلة markdown نصية أو ترفض.
انتقالات الفشل:
- فشل المحوِّل يُعيد وعداً مرفوضاً (
Conversion error: ...).
دورة حياة الحافظة
Section titled “دورة حياة الحافظة”copyToClipboard(text) مُصمَّم عمداً كأفضل جهد ومتعدد المسارات:
- إذا كان TTY: محاولة كتابة OSC 52 (حمولة base64).
- محاولة أمر Termux عند تعيين
TERMUX_VERSION. - محاولة نسخ النص الأصلي عبر
arboard. - ابتلاع الأخطاء في طبقة TS.
تختلف صرامة readImageFromClipboard() حسب المرحلة:
- تحظر TS بشكل صارم سياقات وقت التشغيل غير المدعومة (Termux/Linux بدون واجهة رسومية) وتُعيد
null. - تعمل قراءة
arboardفي Rust فقط عندما تسمح TS بذلك. - يُربَط
ContentNotAvailableبالقيمةnull. - أخطاء Rust الأخرى ترفض.
دورة حياة تحليل أداء العمل
Section titled “دورة حياة تحليل أداء العمل”- لا يوجد بدء صريح: التحليل يعمل دائماً عند تنفيذ مساعدات المهام.
- يسجّل كل نطاق مهمة مُجهَّز عينة واحدة عند إسقاط الحارس.
- تُستبدَل أقدم الإدخالات بعد الوصول لسعة المخزن المؤقت.
- تقرأ
getWorkProfile(lastSeconds)نافذة زمنية وتستخرج منتجات المكدس المطوي/الملخص/SVG.
انتقالات الفشل:
- فشل توليد SVG هو فشل مرن (
svg: null)، بينما يستمر إرجاع المكدس المطوي والملخص. - نافذة العينات الفارغة تُعيد بيانات مكدس مطوية فارغة و
svg: null، وليس خطأً.
العمليات غير المدعومة وانتشار الأخطاء
Section titled “العمليات غير المدعومة وانتشار الأخطاء”الصورة
Section titled “الصورة”- إدخال فك ترميز غير مدعوم أو بايتات تالفة: فشل صارم (رفض الوعد).
- معرّف تنسيق ترميز غير مدعوم: فشل صارم.
- لا يوجد مسار احتياطي لأفضل جهد في غلاف TS.
- أخطاء التحويل هي فشل صارم (رفض).
- حذف الخيارات يُعامَل كتعيين افتراضي بأفضل جهد، وليس فشلاً.
الحافظة
Section titled “الحافظة”- نسخ النص يعمل بأفضل جهد في طبقة TS: تُكبَت الأخطاء التشغيلية.
- قراءة الصورة تُميِّز بين “لا توجد صورة” (
null) والفشل التشغيلي (الرفض). - تُعامَل Termux/Linux بدون واجهة رسومية كسياقات غير مدعومة لقراءة الصورة (
null).
تحليل أداء العمل
Section titled “تحليل أداء العمل”- الاسترجاع صارم بالنسبة لاستدعاء الدالة نفسه، لكن توليد المنتجات يعمل جزئياً بأفضل جهد (
svgقابل للقيمة null). - اقتطاع المخزن المؤقت هو سلوك متوقع (مخزن دائري)، وليس خطأ فقدان بيانات.
ملاحظات خاصة بالمنصة
Section titled “ملاحظات خاصة بالمنصة”- نص الحافظة: يعتمد OSC 52 على دعم الطرفية؛ ويعتمد الوصول الأصلي للحافظة على بيئة سطح المكتب/الجلسة.
- قراءة صورة الحافظة: محظورة في TS على Termux وLinux بدون خادم عرض.