ضاد بلوكلي(Daad Blockly) هي لغة برمجة عربية بالكامل. هذا التطبيق هو بيئة تطوير سطح مكتب تعتمد على Blockly من Google و Electron، تسمح لك بكتابة برامج بلغة ضاد عن طريق تركيب القطع البصرية (Blocks) دون الحاجة لكتابة الأكواد يدويًا.
لا يحتاج التطبيق إلى خادم أو قاعدة بيانات — كل شيء يعمل محليًا على جهازك.
- واجهة عربية كاملة (RTL) بخطوط وألوان مريحة
- أكثر من 50 قطعة برمجية بصرية تغطي أساسيات البرمجة
- توليد كود ضاد تلقائيًا من القطع البصرية
- تشغيل البرامج مباشرة داخل التطبيق والتفاعل مع الإدخال (
ادخل) - عرض المخرجات بشكل فوري مع دعم الإدخال التفاعلي أثناء التشغيل
- حفظ واسترجاع مساحات العمل (ملفات JSON)
- دعم Windows و Linux و macOS (بنيات x86-64 و ARM64)
- تصدير واستيراد المشاريع عبر مربعات الحوار
- Node.js (الإصدار 18 أو أحدث)
- نظام تشغيل: Windows (x86-64 / ARM64 / x86) أو Linux (x86-64 / ARM64 / x86) أو macOS (x86-64 / Apple Silicon)
# استنساخ المستودع
git clone https://github.com/daadLang/daad-blockly
cd daad-blockly
# تثبيت التبعيات
npm install
# تشغيل التطبيق
npm start
# تشغيل مع أدوات المطور (DevTools)
npm run devاسحب القطع من شريط الأدوات الجانبي إلى مساحة العمل. كل قطعة تولد كود ضاد تلقائيًا.
انقر على زر تشغيل (يتحول إلى إيقاف أثناء التنفيذ). تظهر المخرجات مباشرة في لوحة المخرجات.
عند استخدام قطعة ادخل، يظهر حقل الإدخال تلقائيًا. اكتب النص ثم اضغط إرسال. يمكنك إرسال أكثر من قيمة أثناء التشغيل.
- حفظ: يحفظ تلقائيًا في مجلد المستخدم
- حفظ باسم: يفتح مربع حوار لحفظ الملف في مكان تختاره
- فتح: يفتح ملف مساحة عمل سابق
| القطعة | الكود المولد |
|---|---|
| نص | "..." |
| اطبع | اطبع(...) |
| طول النص | طول(...) |
| دمج النصوص | ... + ... |
| ألحق نص | س = س + ... |
| حول إلى نص | نص(...) |
| تنسيق | نسق("...", ...) |
| القطعة | الكود المولد |
|---|---|
| عدد | رقم |
| عمليات حسابية | (+ - * /) |
| أس | (... ** ...) |
| باقي القسمة | (... % ...) |
| قسمة صحيحة | (... // ...) |
| حول إلى عشري | عشري(...) |
| القطعة | الكود المولد |
|---|---|
| صحيح / خطأ | صحيح / خطأ |
| مقارنة | (== != < <= > >=) |
| و / أو | (... و ...) / (... أو ...) |
| نفي | ليس(...) |
| معرفة النوع | نوع(...) |
| انتماء | (... في ...) |
| القطعة | الكود المولد |
|---|---|
| إنشاء قائمة | [ع1, ع2, ...] |
| قائمة فارغة | [] |
| Tuple | (ع1, ع2, ...) |
| عنصر من قائمة | قائمة[رقم] |
| طول القائمة | طول(...) |
| نطاق | نطاق(...) |
| أضف عنصر | ق = اضف(ق, عنصر) |
| أزل عنصر | ق = ازل(ق) |
| انسخ قائمة | انسخ(قائمة) |
| أفرغ قائمة | ق = افرغ(ق) |
| القطعة | الكود المولد |
|---|---|
| قاموس | {...} |
| القطعة | الكود المولد |
|---|---|
| تعيين مركب | س +=, -=, *=, /=, %=, //=, **= |
| عمليات بت | & , | , ^ , << , >> |
| قلب البتات | ~... |
| القطعة | الكود المولد |
|---|---|
| إذا / وإلا | اذا ... : واذا ... : والا : |
| طالما | طالما ... : |
| لكل | لكل ... في ... : |
| كرر | كرر ... مرات : |
| اخرج / تابع | اخرج / تابع |
| القطعة | الكود المولد |
|---|---|
| دالة بدون إرجاع | دالة اسم(وسائط): |
| دالة مع إرجاع | دالة اسم(وسائط): ... ارجع |
| إرجاع شرطي | اذا ... : ارجع |
| استدعاء دالة | اسم(وسائط) |
| القطعة | الكود المولد |
|---|---|
| متغير | اسم_المتغير |
| تعيين | اسم = ... |
| القطعة | الكود المولد |
|---|---|
| إدخال | ادخل(...) |
| استيراد | استورد ... |
| استيراد من | من ... استورد ... |
الوحدات المدمجة المتاحة للاستيراد: رياضيات, عشوائي, وقت, نظام, مسار (مثال: من رياضيات استورد جذر ثم اطبع(جذر(16))).
| القطعة | الكود المولد |
|---|---|
| صنف | صنف اسم: |
| دالة (خاصة بالصنف) | دالة اسم(ذاتي, وسائط): |
| ذاتي | ذاتي |
| خاصية | كائن.خاصية |
| تعيين خاصية | كائن.خاصية = ... |
| إنشاء كائن | اسم(وسائط) |
# كود ضاد مولّد من القطع البصرية
اطبع("مرحباً بك في لغة ضاد!")
الاسم = ادخل("ما اسمك؟ ")
اطبع("أهلاً، " + الاسم)خطوات بناء البرنامج:
- اسحب قطعة اطبع من قسم النصوص واكتب النص
- اسحب قطعة إدخال من قسم الدوال المدمجة وأدخل رسالة التنبيه
- اسحب قطعة متغير من قسم المتغيرات وسمّه
الاسم - وصّل قطعة الإدخال إلى المتغير
- اسحب قطعة اطبع أخرى وألحق بها اسم المتغير
daad-blockly/
├── main.js # عملية Electron الرئيسية
├── preload.js # جسر الأمان (DaadAPI)
├── renderer.js # ربط واجهة المستخدم بـ Blockly ومنطق التطبيق
├── index.html # الصفحة الرئيسية (RTL)
├── package.json # إعدادات المشروع
├── vitest.config.js # إعدادات بيئة الاختبارات (Vitest + jsdom)
├── AGENTS.md # دليل المساهمين والأوامر
├── .github/workflows/
│ ├── ci.yml # فحص الأكواد والاختبارات عند كل push/PR
│ └── release.yml # بناء وإصدار الحزم عند دفع وسم v*
├── bin/
│ ├── linux/ # مترجم ضاد (Linux: x64 / x86 / arm64)
│ ├── darwin/ # مترجم ضاد (macOS: x64 / arm64)
│ └── win32/ # مترجم ضاد (Windows: x64 / x86 / arm64)
├── assets/
│ ├── css/app.css # الأنماط (RTL، استجابة، إتاحة)
│ ├── img/logo.svg # الشعار
│ ├── icons/ # أيقونات الحزم (512.png, 256.png, icon.ico)
│ └── js/
│ ├── app/logic.js # منطق التطبيق النقي (DaadApp) — قابل للاختبار
│ ├── blocks/custom.js # تعريفات القطع المخصصة
│ ├── blocks/toolbox.js # ترتيب شريط الأدوات
│ ├── generator/index.js # مولّد كود ضاد
│ └── examples.js # أمثلة جاهزة
├── tests/ # اختبارات Vitest (generator.*, app.logic)
│ └── setup.js # تحميل Blockly وDaad في بيئة jsdom
└── node_modules/ # التبعيات
| التقنية | الإصدار | الاستخدام |
|---|---|---|
| Electron | ^42.4.1 | إطار التطبيق سطح المكتب |
| Blockly | ^13.0.0 | محرر القطع البرمجية البصرية |
| Node.js | (مضمن) | تشغيل التطبيق والعمليات الخلفية |
| Daad Interpreter | v0.2.0 | مترجم لغة ضاد (ثنائي مستقل) |
لفتح أدوات المطور:
npm run devيضيف الوسيط --dev الذي يفتح DevTools تلقائيًا عند بدء التطبيق.
يعتمد المشروع على Vitest مع jsdom لاختبار مولّد الكود (assets/js/generator/index.js) ومنطق التطبيق (assets/js/app/logic.js) دون الحاجة إلى Electron أو Blockly كامل. يقوم tests/setup.js بتحميل Blockly كـ ESM، ثم ينسخه إلى كائن قابل للتوسيع، ثم يُنفّذ custom.js وgenerator/index.js عبر eval بحيث تتوفر Blockly.Daad فعلياً في الاختبارات. يمكن بناء حالة الكتل عبر الدوال المساعدة المُصدَّرة من tests/setup.js: block(), val(), stmt(), text(), num(), program(), variable(), codeOf().
npm test # تشغيل الاختبارات مرة واحدة (كود الخروج يعكس النجاح/الفشل)
npm run test:watch # وضع المراقبة
npm run lint # فحص ESLint (تحذيرات فقط)
npm run lint:fix # إصلاح تلقائي للأكواديُشغّل CI (.github/workflows/ci.yml) lint وtest عند كل push/PR. لتفاصيل أكثر حول إضافة اختبارات أو القطع، راجع AGENTS.md.
| الاختصار | العمل |
|---|---|
Ctrl+Z |
تراجع |
Ctrl+Y أو Ctrl+Shift+Z |
إعادة |
Ctrl+S |
حفظ |
Ctrl+O |
فتح |
Alt+R |
تشغيل |
Alt+S |
حفظ |
Alt+O |
فتح |
يدعم قائمة الأمثلة التنقل بلوحة المفاتيح: ↓/↑ للتنقل بين العناصر، Enter للاختيار، Esc للإغلاق.
- تسميات ARIA و
aria-liveعلى مناطق الكود والمخرجات والأخطاء. - حلقات تركيز واضحة (
focus-visible) لكل الأزرار وعناصر القائمة. - نقاط توقف استجابية عند 960px و768px و480px (تتكديس اللوحات ويُخفى اسم الملف على الشاشات الضيقة).
- دعم
prefers-reduced-motion(تعطيل الرسوم المتحركة).
npm run dist:linux # AppImage + deb (x86-64)
npm run dist:win # مثبّت NSIS (x86-64)
npm run dist:mac # dmg + zip (x86-64 / Apple Silicon)يُبني macOS على كلٍّ من البنيتين عبر
--x64و--arm64(يتم ذلك تلقائيًا فيrelease.yml). للحصول على إصدار منشور، ادفع وسمv*(مثلv1.0.0)؛ سيقومrelease.ymlببناء حزم Linux وWindows وmacOS وإنشاء إصدار مسودة على GitHub مع ملاحظات تلقائية.
- لغة ضاد: الشكر موصول لمنظمة daadLang على تطوير لغة البرمجة العربية.
- مكتبة Blockly: يعتمد هذا المشروع على المكتبة الرائعة Google Blockly.
نرحب دائمًا بمساهماتكم! سواء كان ذلك من خلال إصلاح الأخطاء (Bug Fixes)، إضافة ميزات وكتل جديدة، أو حتى تحسين التوثيق. لا تتردد في فتح طلب سحب (Pull Request) أو الإبلاغ عن مشكلة عبر (Issues).
يرجى الاطلاع على AGENTS.md لقائمة الأوامر وقواعد التنسيق وكيفية إضافة اختبارات جديدة للمولّد أو منطق التطبيق. شغّل npm run lint وnpm test قبل إرسال المساهمة.
هذا المشروع مقدم كبرنامج مفتوح المصدر للتعليم والتعلم.