diff --git a/bun.lock b/bun.lock index efe01bf957f3..3e1199267aa9 100644 --- a/bun.lock +++ b/bun.lock @@ -948,6 +948,7 @@ "@opentui/core": "catalog:", "@opentui/keymap": "catalog:", "@opentui/solid": "catalog:", + "bidi-js": "1.1.0", "clipboardy": "4.0.0", "diff": "catalog:", "effect": "catalog:", @@ -3196,6 +3197,8 @@ "before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="], + "bidi-js": ["bidi-js@1.1.0", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg=="], + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], "bin-links": ["bin-links@6.0.2", "", { "dependencies": { "cmd-shim": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "proc-log": "^6.0.0", "read-cmd-shim": "^6.0.0", "write-file-atomic": "^7.0.0" } }, "sha512-frE1t78WOwJ45PKV2cF2tNPjTcs9L1J9s6VkrV59wanRP4GlaomuxYPVma7BwthMg8WnfSory4w5PTE6FZZ81w=="], diff --git a/docs/rtl/README.ar.md b/docs/rtl/README.ar.md new file mode 100644 index 000000000000..9ff5f455f7be --- /dev/null +++ b/docs/rtl/README.ar.md @@ -0,0 +1,138 @@ +# دعم الكتابة من اليمين لليسار (RTL / BiDi) في واجهة OpenCode النصية + +بقى النص العربي والفارسي والأردي والعبري يظهر صح في واجهة OpenCode النصية — +في **مربع الكتابة (البرومبت)** وفي **ردود المساعد** — عن طريق تنفيذ خوارزمية +يونيكود للاتجاهين (UAX #9) في طبقة الرسم داخل التطبيق نفسه، من غير أي اعتماد +على دعم الـ terminal، ومن غير أي إعادة كتابة destructive للنص. + +> English: [README.md](./README.md) + +## إيه اللي بيشتغل + +- **العربي لوحده** يقرأ طبيعي من اليمين لليسار ويتحاذى لليمين. +- **عربي + إنجليزي** بيفضل الإنجليزي (`npm`، `API`، أسماء المتغيرات) في مكانه + الطبيعي حسب ترتيب يونيكود ثنائي الاتجاه. +- **المقاطع اللاتينية بتفضل LTR**: أكواد inline، أسماء ملفات، مسارات، روابط، + أوامر، أسماء حزم، وأرقام — كلها بتتعزل بـ LRI/PDI. +- **الكود دايمًا LTR**: بلوكات الكود والجداول والـ diffs بتستخدم الراسم + الأصلي ومابيتغيرش ترتيبها أبدًا. +- **الالتفاف (wrapping)** محسوب بالـ grapheme وبعرض الخلية؛ أسطر الالتفاف + بتفضل متحاذية يمين وبالترتيب البصري الصح. +- **مؤشر الكتابة واعي بالاتجاه**: الأسهم بتتحرك بصريًا؛ الكتابة واللصق + والتراجع والقيمة المخزنة تفضل يونيكود منطقي. +- **النسخ واللصق سليم**: التحديد بيرجّع النص المنطقي الأصلي، مش ترتيب بصري + ولا حروف تحكم مخفية. + +## الخطوط + +التطبيق ميقدرش يختار خطوط — الـ terminal هو اللي بيختار. سيب الخط الـ +monospaced زي ما هو واتأكد إن في خط عربي متاح كـ fallback في إعدادات +الـ terminal (مثلًا `"face": "Cascadia Mono, Cairo, Segoe UI"` في +Windows Terminal)، وبعدين اقفل التيرمنال وافتحه تاني. + +## التثبيت (ويندوز، من نفس المستودع) + + +```powershell +# 1) تثبيت اعتماديات الـ workspace +bun install + +# 2) بناء ملف تنفيذي لمنصتك الحالية +bun run --cwd packages/opencode script/build.ts --single --skip-install --skip-embed-web-ui + +# 3) تشغيله +.\packages\opencode\dist\opencode-windows-x64\bin\opencode.exe +``` + +لاستبدال نسخة npm المثبتة (مع الاحتفاظ بنسخة احتياطية): + +```powershell +$new = ".\packages\opencode\dist\opencode-windows-x64\bin\opencode.exe" +$stable = "$env:APPDATA\npm\node_modules\opencode-ai\bin\opencode.exe" +Copy-Item $stable "$stable.original-backup" -Force +Copy-Item $new $stable -Force +``` + +## المعمارية + +الواجهة مبنية على `@opentui/solid` فوق `@opentui/core@0.4.5`. تخطيط النص +والالتفاف والتشكيل ورسم الخلايا كلها بتحصل داخل **مكتبة Zig أصلية** +(`bufferDrawTextBufferView` / `drawEditorView`) مفيها أي دعم BiDi ومفيش بديل +JS. الحزمة المنشورة بتيجي JavaScript مبنية ومضغوطة، فالتعديل ده **مش** بيعدل +OpenTUI نفسه؛ هو بيعمل subclass للكلاسات العامة بتاعته وبيبدّل بس نقطة الرسم +ونقطة رسم المؤشر. + +| الجزء | الملف | +| --- | --- | +| محرك UAX #9 ونموذج الـ grapheme والالتفاف والعزل وخرايط المؤشر | `packages/tui/src/util/bidi.ts` | +| مربع الكتابة (`BidiTextareaRenderable`) | `packages/tui/src/component/bidi-textarea.ts` | +| ماركداون ردود المساعد (hook اسمه `renderNode`) | `packages/tui/src/component/bidi-markdown.ts` | +| صدى رسالة المستخدم (`BidiTextRenderable`) | `packages/tui/src/component/bidi-text.ts` | +| تسجيل العناصر (`extend`) | `packages/tui/src/component/bidi-elements.ts` | + +الربط: + +- `packages/tui/src/component/prompt/index.tsx` — `