- الرئيسية
- Documentation
- الأصلية
- خط أنابيب النص/البحث الأصلي
خط أنابيب النص/البحث الأصلي
تُعيّن هذه الوثيقة السطح النصي/البحثي لـ @f5-sales-demo/pi-natives (grep، وglob، وtext، وhighlight) من أغلفة TypeScript إلى صادرات Rust N-API وعودةً إلى كائنات النتائج في JS.
تتبع المصطلحات ملف docs/natives-architecture.md:
- الغلاف: واجهة برمجة TS في
packages/natives/src/* - طبقة وحدة Rust: صادرات N-API في
crates/pi-natives/src/* - ذاكرة تخزين الفحص المشتركة: ذاكرة تخزين مدخلات المجلدات المدعومة بـ
fs_cacheوالمستخدمة في تدفقات الاكتشاف/البحث
ملفات التنفيذ
Section titled “ملفات التنفيذ”packages/natives/src/grep/index.tspackages/natives/src/grep/types.tspackages/natives/src/glob/index.tspackages/natives/src/glob/types.tspackages/natives/src/text/index.tspackages/natives/src/text/types.tspackages/natives/src/highlight/index.tspackages/natives/src/highlight/types.tscrates/pi-natives/src/grep.rscrates/pi-natives/src/glob.rscrates/pi-natives/src/glob_util.rscrates/pi-natives/src/fs_cache.rscrates/pi-natives/src/text.rscrates/pi-natives/src/highlight.rscrates/pi-natives/src/fd.rs
تعيين واجهة برمجة JS ↔ صادرات Rust
Section titled “تعيين واجهة برمجة JS ↔ صادرات Rust”| واجهة برمجة الغلاف JS | صادر Rust (#[napi]، snake_case -> camelCase) | وحدة Rust |
|---|---|---|
grep(options, onMatch?) | grep | grep.rs |
searchContent(content, options) | search | grep.rs |
hasMatch(content, pattern, options?) | hasMatch | grep.rs |
fuzzyFind(options) | fuzzyFind | fd.rs |
glob(options, onMatch?) | glob | glob.rs |
invalidateFsScanCache(path?) | invalidateFsScanCache | fs_cache.rs |
wrapTextWithAnsi(text, width) | wrapTextWithAnsi | text.rs |
truncateToWidth(text, maxWidth, ellipsis, pad) | truncateToWidth | text.rs |
sliceWithWidth(line, startCol, length, strict?) | sliceWithWidth | text.rs |
extractSegments(line, beforeEnd, afterStart, afterLen, strictAfter) | extractSegments | text.rs |
sanitizeText(text) | sanitizeText | text.rs |
visibleWidth(text) | visibleWidth | text.rs |
highlightCode(code, lang, colors) | highlightCode | highlight.rs |
supportsLanguage(lang) | supportsLanguage | highlight.rs |
getSupportedLanguages() | getSupportedLanguages | highlight.rs |
نظرة عامة على خط الأنابيب حسب النظام الفرعي
Section titled “نظرة عامة على خط الأنابيب حسب النظام الفرعي”1) البحث بالتعبيرات النمطية (grep، وsearchContent، وhasMatch)
Section titled “1) البحث بالتعبيرات النمطية (grep، وsearchContent، وhasMatch)”تدفق المدخلات/الخيارات
Section titled “تدفق المدخلات/الخيارات”- يُمرر الغلاف TS الخيارات إلى الوحدة الأصلية:
- يُمرر
grep/index.tsالخياراتoptionsدون تغيير إلى حد بعيد، ويُغلّف رد النداء من الشكل(match) => voidإلى شكل رد نداء napi الآمن في الخيوط(err, match). - يُمرر
searchContentوhasMatchالنص/Uint8Arrayمباشرةً.
- يُمرر
- تُفسّر هياكل خيارات Rust في
grep.rsحقول camelCase (ignoreCase، وmaxCount، وcontextBefore، وcontextAfter، وmaxColumns، وtimeoutMs). - يُنشئ
grepرمزCancelTokenمنtimeoutMs+AbortSignalوينفذ داخلtask::blocking("grep", ...).
فروع التنفيذ
Section titled “فروع التنفيذ”- فرع الذاكرة (أداة مساعدة خالصة)
search←search_sync←run_searchعلى بايتات المحتوى المقدمة.- لا فحص لنظام الملفات، ولا
fs_cache.
- فرع الملف الواحد (يعتمد على نظام الملفات)
- يحل
grep_syncالمسار، ويتحقق من أن البيانات الوصفية تخص ملفاً، ثم يبث ما يصل إلىMAX_FILE_BYTESلكل ملف (4 MiB) عبر مطابق ripgrep.
- يحل
- فرع المجلد (يعتمد على نظام الملفات)
- البحث الاختياري في ذاكرة التخزين المؤقت عبر
fs_cache::get_or_scanعند تعيينcache: true. - إجراء فحص جديد عبر
fs_cache::force_rescanعند تعيينcache: false. - إعادة التحقق الاختيارية من النتائج الفارغة عند تجاوز عمر ذاكرة التخزين المؤقت للقيمة
empty_recheck_ms(). - تصفية المدخلات: ملفات فقط + تصفية glob اختيارية (
glob_util) + تصفية النوع الاختيارية (js،ts،rust، إلخ).
- البحث الاختياري في ذاكرة التخزين المؤقت عبر
دلالات البحث والتجميع
Section titled “دلالات البحث والتجميع”- محرك التعبيرات النمطية:
grep_regex::RegexMatcherBuilderمعignoreCaseوmultiline. - حل السياق:
- تتجاوز
contextBefore/contextAfterالخيار القديمcontext. - تُصفّر أوضاع غير المحتوى مجموعة السياق.
- تتجاوز
- أوضاع الإخراج:
content=> مدخلGrepMatchواحد لكل تطابق.- يُعيّن كل من
countوfilesWithMatchesإلى مدخلات نمط العدد (lineNumber=0،line=""، يُعيَّنmatchCount).
- الحدود:
- يُطبَّق الإزاحة العالمية
offsetوmaxCountعبر الملفات. - يُستخدم المسار المتوازي فقط عند عدم تعيين
maxCountوكونoffset == 0؛ وإلا يُستخدم المسار التسلسلي للحفاظ على دلالات الإزاحة/الحد العالمية الحتمية.
- يُطبَّق الإزاحة العالمية
تشكيل النتائج وإعادتها إلى JS
Section titled “تشكيل النتائج وإعادتها إلى JS”- تُعيَّن حقول
SearchResult/GrepResultفي Rust إلى أنواع TS عبر تحويل حقول كائنات N-API. - تُقيَّد العدادات إلى
u32قبل عبور N-API. - تُحذف القيم المنطقية الاختيارية ما لم تكن صحيحة في بعض المسارات (
limitReached). - يتلقى رد نداء البث كل مدخل
GrepMatchمُشكَّل (محتوى أو مدخل عدد).
سلوك الفشل
Section titled “سلوك الفشل”- يُعيد
searchContentقيمةSearchResult.errorعند فشل التعبير النمطي/البحث عوضاً عن الرمي بخطأ. - يرفض
grepعند الأخطاء الحادة (مسار غير صالح، glob/تعبير نمطي غير صالح، انقضاء المهلة/الإلغاء). - يُعيد
hasMatchقيمةResult<bool>ويرمي عند أنماط غير صالحة أو أخطاء فك ترميز UTF-8. - تُتخطى أخطاء فتح/بحث الملفات في فحوصات الملفات المتعددة لكل ملف على حدة؛ ويستمر الفحص.
معالجة التعبيرات النمطية المشوهة
Section titled “معالجة التعبيرات النمطية المشوهة”يُعالج grep.rs الأقواس المعقوصة قبل تصريف التعبير النمطي:
- تُهرَّب الأقواس المعقوصة الشبيهة بالتكرار غير الصالح (
{/}->\{/\}) عندما لا يمكنها تشكيل{N}، أو{N,}، أو{N,M}. - يمنع ذلك مقاطع قوالب الحروف الشائعة (مثل
${platform}) من الفشل كتكرار مشوه. - لا تزال بنية التعبير النمطي غير الصالحة المتبقية تُعيد خطأ في التعبير النمطي.
2) اكتشاف الملفات (glob) والبحث الضبابي في المسارات (fuzzyFind)
Section titled “2) اكتشاف الملفات (glob) والبحث الضبابي في المسارات (fuzzyFind)”يتشارك glob وfuzzyFind فحوصات fs_cache؛ بينما تختلف منطق المطابقة.
تدفق glob
Section titled “تدفق glob”- الغلاف TS (
glob/index.ts):path.resolve(options.path).- القيم الافتراضية:
pattern="*"، وhidden=false، وgitignore=true، وrecursive=true.
- يبني Rust
globالكائنGlobConfigويصرّف النمط عبرglob_util::compile_glob. - مصدر المدخلات:
cache=true=>get_or_scan+ إعادة فحص اختيارية للنتائج القديمة-الفارغة.cache=false=>force_rescan(..., store=false)(جديد فقط).
- التصفية:
- تخطي
.gitدائماً. - تخطي
node_modulesما لم يُطلب ذلك (includeNodeModulesأو نمط يذكر node_modules). - تطبيق مطابقة glob.
- تطبيق تصفية نوع الملف؛ تحل فلاتر
file/dirللروابط الرمزية البيانات الوصفية للهدف.
- تخطي
- الترتيب الاختياري حسب وقت التعديل تنازلياً (
sortByMtime) قبل الاقتصار علىmaxResults.
تدفق fuzzyFind (مُنفَّذ في fd.rs)
Section titled “تدفق fuzzyFind (مُنفَّذ في fd.rs)”- يُصدَّر الغلاف TS من وحدة
grep، لكن التنفيذ في Rust يقع فيfd.rs. - مصدر الفحص المشترك من
fs_cacheمع نفس منطق تقسيم ذاكرة التخزين المؤقت/بدونها وسياسة إعادة التحقق من الفارغ القديم. - التسجيل:
- درجة مبنية على: التطابق التام / يبدأ بـ / يحتوي على / التسلسل الضبابي
- مسار تسجيل مُعيَّر بالفواصل وعلامات الترقيم
- مكافأة المجلد وكسر التعادل الحتمي (
score desc، ثمpath asc)
- تُستثنى مدخلات الروابط الرمزية من نتائج البحث الضبابي.
سلوك الفشل
Section titled “سلوك الفشل”- نمط glob غير صالح => خطأ من
glob_util::compile_glob. - يجب أن يكون جذر البحث مجلداً موجوداً (
resolve_search_path)، وإلا حدث خطأ. - تنتشر الإلغاءات/انتهاءات المهل كأخطاء إجهاض عبر فحوصات
CancelToken::heartbeat()في الحلقات.
معالجة أنماط glob المشوهة
Section titled “معالجة أنماط glob المشوهة”glob_util::build_glob_pattern متسامحة:
- تُعيَّر
\إلى/. - تُضاف تلقائياً
**/بادئةً للأنماط التكرارية البسيطة عند تعيينrecursive=true. - تُغلق تلقائياً مجموعات التناوب
{...غير المتوازنة قبل التصريف.
3) دورة حياة الفحص/التخزين المشترك (fs_cache)
Section titled “3) دورة حياة الفحص/التخزين المشترك (fs_cache)”يخزن fs_cache نتائج الفحص كمدخلات نسبية مُعيَّرة (path، وfileType، وmtime الاختيارية) مُفهرَسة بـ:
- جذر البحث القانوني
include_hiddenuse_gitignore
انتقالات حالة ذاكرة التخزين المؤقت
Section titled “انتقالات حالة ذاكرة التخزين المؤقت”- إخفاق / معطل
- مدة الصلاحية
0أو المفتاح غائب/منتهي الصلاحية ->collect_entriesجديدة.
- مدة الصلاحية
- إصابة
- عمر المدخل
< cache_ttl_ms()-> إعادة المدخلات المخزنة +cache_age_ms.
- عمر المدخل
- إعادة التحقق من القديم-الفارغ (سياسة الاستدعاء في
glob/grep/fd)- إذا أسفر الاستعلام عن صفر تطابقات وكان
cache_age_ms >= empty_recheck_ms()، فأجرِ إعادة فحص واحدة.
- إذا أسفر الاستعلام عن صفر تطابقات وكان
- الإبطال
invalidateFsScanCache(path?):- بدون وسيطة: مسح جميع المفاتيح
- مع وسيطة مسار: إزالة المفاتيح التي تتضمن جذورها بادئة مسار الهدف
مقايضة النتائج القديمة
Section titled “مقايضة النتائج القديمة”- تُفضّل ذاكرة التخزين المؤقت الفحوصات المتكررة المنخفضة الاستجابة على الاتساق الفوري.
- يمكن أن تُعيد نافذة مدة الصلاحية نتائج إيجابية/سلبية قديمة.
- تقلل إعادة التحقق من الفارغ من النتائج السلبية القديمة للفحوصات المخزنة الأقدم، بتكلفة فحص إضافي واحد.
- الإبطال الصريح هو الخطاف المقصود للصحة بعد تعديلات الملفات.
4) أدوات النص ANSI (text)
Section titled “4) أدوات النص ANSI (text)”هذه أدوات مساعدة خالصة في الذاكرة (بدون فحص لنظام الملفات).
الحدود والمسؤوليات
Section titled “الحدود والمسؤوليات”- يمتلك
text.rsدلالات خلايا الطرفية:- تحليل تسلسلات ANSI
- العرض المدرك للمخططات البيانية والتقطيع
- سلوك الالتفاف/القطع/التعقيم
- قطع الأسطر في
grep.rs(maxColumns) منفصلة:- قطع بسيط لحدود الأحرف للأسطر المطابقة مع
... - غير حافظة لحالة ANSI وغير مدركة لعرض خلايا الطرفية
- قطع بسيط لحدود الأحرف للأسطر المطابقة مع
السلوكيات الرئيسية
Section titled “السلوكيات الرئيسية”wrapTextWithAnsi: يلتف حسب العرض المرئي، ويحمل رموز SGR النشطة عبر الأسطر الملتفة.truncateToWidth: قطع بالخلايا المرئية مع سياسة علامة الحذف (Unicode، وAscii، وOmit)، وحشو أيمن اختياري، ومسار سريع يُعيد سلسلة JS الأصلية عند عدم التغيير.sliceWithWidth: تقطيع الأعمدة مع تطبيق عرض صارم اختياري.extractSegments: يستخرج المقاطع قبل/بعد تراكب مع استعادة حالة ANSI لمقطعafter.sanitizeText: يجرد هروبات ANSI + أحرف التحكم، ويتخلص من الوكلاء المنعزلين، ويُعيَّر CR/LF بإزالة\r.visibleWidth: يحسب خلايا الطرفية المرئية (تستخدم علامات التبويبTAB_WIDTHالثابتة من تنفيذ Rust).
سلوك الفشل
Section titled “سلوك الفشل”تُعيد دوال النص عموماً مخرجات محولة حتمية؛ تقتصر الأخطاء على حدود تحويل سلاسل JS (فشل تحويلات وسيطات N-API).
5) إبراز بنية الشيفرة (highlight)
Section titled “5) إبراز بنية الشيفرة (highlight)”highlight.rs تحويل خالص (بدون نظام ملفات، بدون ذاكرة تخزين مؤقت).
التدفق
Section titled “التدفق”- يُمرر الغلاف
code، وlangالاختيارية، ولوحة ألوان ANSI. - يحل Rust البنية بـ:
- البحث بالرمز/الاسم
- البحث بالامتداد
- جدول الأسماء المستعارة الاحتياطي (
ts/tsx/js -> JavaScript، إلخ) - الرجوع إلى بنية النص العادي عند عدم الحل
- تحليل كل سطر بـ
ParseStatesyntect ومكدس النطاق. - تعيين النطاقات إلى 11 فئة لون دلالية وحقن/إعادة تعيين رموز ألوان ANSI.
سلوك الفشل
Section titled “سلوك الفشل”- فشل تحليل السطر لا يُفشل الاستدعاء: يُضاف ذلك السطر دون إبراز ويستمر المعالجة.
- اللغة المجهولة/غير المدعومة تنتقل إلى بنية النص العادي.
تدفقات الأداة المساعدة الخالصة مقابل المعتمدة على نظام الملفات
Section titled “تدفقات الأداة المساعدة الخالصة مقابل المعتمدة على نظام الملفات”| التدفق | الوصول إلى نظام الملفات | ذاكرة التخزين المشتركة | ملاحظات |
|---|---|---|---|
searchContent / hasMatch | لا | لا | تعبير نمطي على البايتات/النص المقدم فقط |
دوال وحدة text | لا | لا | معالجة ANSI/العرض/التعقيم فقط |
دوال وحدة highlight | لا | لا | البنية + تلوين ANSI فقط |
glob | نعم | اختيارية | فحوصات المجلدات + تصفية glob |
fuzzyFind | نعم | اختيارية | فحوصات المجلدات + التسجيل الضبابي |
grep (مسار ملف/مجلد) | نعم | اختيارية (وضع المجلد) | ripgrep على الملفات، مع فلاتر/رد نداء اختيارية |
ملخص دورة الحياة الشاملة
Section titled “ملخص دورة الحياة الشاملة”- يستدعي المُستدعي الغلاف TS مع خيارات مُكتَّبة.
- يُعيَّر الغلاف القيم الافتراضية (ولا سيما
glob) ويُمررها إلى صادرnative.*. - تُتحقق Rust/تُعيَّر الخيارات وتبني المُطابق/تهيئة البحث.
- بالنسبة لتدفقات نظام الملفات، تُفحص المدخلات (إصابة/إخفاق/إعادة فحص في ذاكرة التخزين المؤقت) ثم تُصفى/تُسجَّل.
- تستدعي حلقات العمال دورياً نبضة قلب الإلغاء؛ يمكن أن تُنهي انتهاءات المهل/الإلغاءات التنفيذ.
- تُشكّل Rust المخرجات إلى كائنات N-API (
lineNumber، وmatchCount، وlimitReached، إلخ). - يُعيد الغلاف TS كائنات JS مُكتَّبة (وردود نداء اختيارية لكل تطابق لـ
grep/glob).