go-reloaded
محرر نصوص بلغة Go يعمل من سطر الأوامر: يقرأ ملفًا، وينفّذ تعليمات التحرير المكتوبة داخل النص، وينظّم التنسيق، ثم يحفظ النتيجة في ملف جديد.
- النوع
- أداة سطر أوامر
- اللغة
- Go، بالمكتبة القياسية فقط
- مكان التنفيذ
- أكاديمية 01 Talent، المشروع 1 من 60
- التاريخ
- أكتوبر 2026
- الفريق
- مشروع فردي
- الاختبارات
- 48 حالة، وسبع دوال اختبار
نظرة عامة
كان المطلوب بناء أداة تصحيح تلقائي صغيرة. يحتوي الملف النصي على ملاحظات للمحرر مكتوبة
داخل النص، مثل (up, 2) التي تعني "اكتب الكلمتين السابقتين بأحرف
كبيرة"، إلى جانب أخطاء تنسيق شائعة مثل المسافة قبل الفاصلة أو استخدام
a في موضع an. على البرنامج
أن ينفّذ كل تعليمة، ويصحّح الأخطاء، ويحذف التعليمات، ويحفظ نصًا نظيفًا.
يعمل من الطرفية بملف إدخال وملف إخراج:
Rungo run . sample.txt result.txt
مثال
Init (cap) was the best of times, it was the worst of times (up) , it was the age of wisdom
OutIt was the best of times, it was the worst of TIMES, it was the age of wisdom
ما الذي تعالجه الأداة
| القاعدة | ما يحدث | قبل | بعد |
|---|---|---|---|
(hex) (bin) | تحويل الكلمة السابقة من النظام الست عشري أو الثنائي إلى العشري | 1E (hex) | 30 |
(up) (low) (cap) | تحويل الكلمة السابقة إلى أحرف كبيرة أو صغيرة أو بحرف أول كبير | go (up) | GO |
(up, n) | الشيء نفسه على عدد n من الكلمات السابقة | so exciting (up, 2) | SO EXCITING |
| علامات الترقيم | تلتصق . , ! ? : ; بالكلمة السابقة وتليها مسافة واحدة | there ,and | there, and |
| مجموعات الترقيم | تبقى ... و!? متصلة | thinking ... You | thinking... You |
| علامات الاقتباس | يحيط زوج العلامات ' بالكلمات التي بينهما دون مسافات داخلية | ' awesome ' | 'awesome' |
| أداة التنكير | تتحول a إلى an قبل حرف علة أو h | a amazing rock | an amazing rock |
طريقة البناء
مراحل المعالجة
- التحقق من المدخلاتاسما ملفين بالضبط
- قراءة ملف الإدخال
os.ReadFile - تقسيم النص إلى أسطركل سطر يُعالج منفردًا
- تقسيم السطر إلى كلمات
strings.Fields - تطبيق التعليماتhex, bin, up, low, cap
- تصحيح أداة التنكيرa → an
- تصحيح الترقيمالإلصاق والتجميع
- تصحيح الاقتباسالمطابقة والإلصاق
- الدمج والحفظ
os.WriteFile
المراحل من 5 إلى 8 هي قواعد التحرير، وتُطبَّق على كل سطر بهذا الترتيب الثابت.
لماذا تعمل القواعد بهذا الترتيب
- التعليمات أولًا، لأنها تحذف الملاحظات وتغيّر الكلمات، ويجب أن ترى بقية القواعد الكلمات النهائية. في
a (up) appleلا تعمل قاعدة أداة التنكير إلا بعد أن يصبح النصA apple. - أداة التنكير قبل الترقيم، حتى تطابق القاعدة
aنظيفة لاa,بعد إلصاق الترقيم. - الترقيم قبل الاقتباس، فيصبح
raincoat . 'أولًاraincoat.ثمraincoat.'، وهي النتيجة الصحيحة.
هيكل الشيفرة
سبعة ملفات بلغة Go. كل قاعدة دالة صغيرة، موزعة على ملفات بحسب المسؤولية. وتقتصر الدالة main على استدعاء run(args) التي تُرجع الخطأ بدلًا من إنهاء البرنامج، فتستطيع الاختبارات تشغيل البرنامج كاملًا مباشرة.
| الملف | المسؤولية | الدوال الرئيسية |
|---|---|---|
main.go | نقطة البداية: التحقق من المدخلات، وقراءة ملف الإدخال، وكتابة ملف الإخراج، والإبلاغ عن الأخطاء | main run |
process.go | تقسيم النص إلى أسطر وتشغيل القواعد على كل سطر بالترتيب | processText processLine |
modifiers.go | التعرّف على (hex) و(bin) و(up) و(low) و(cap) وصيغها المرقّمة وتطبيقها | applyModifiers parseModifier changePreviousWords convertToDecimal capitalize |
articles.go | تحويل a إلى an | fixArticles startsWithVowelOrH |
punctuation.go | إلصاق علامات الترقيم والحفاظ على المجموعات متصلة | fixPunctuation splitLeadingPunctuation |
quotes.go | مطابقة علامات الاقتباس وإلصاقها بالكلمات التي بداخلها | fixQuotes isQuoteMark |
main_test.go | اختبارات الوحدة | سبع دوال اختبار |
قرارات التصميم
لم يغطِّ وصف المشروع كل الحالات. وحيث سكت، اخترت سلوكًا لا يُضيّع نص المستخدم أبدًا ويوافق ما يتوقعه القارئ.
| الحالة | السلوك | السبب |
|---|---|---|
(up, 5) وقبلها كلمتان فقط | تغيير الكلمتين الموجودتين | لا توقف للبرنامج؛ ينفّذ أقصى ما يمكن |
(up, -1) أو (foo) | تبقى في النص دون تغيير | ليست تعليمة صالحة، فلا يخمّن البرنامج |
zz (hex) وهو رقم غير صالح | حذف التعليمة والإبقاء على الكلمة كما هي | لا يُتلف نص المستخدم أبدًا |
hello , world (up, 2) | HELLO, WORLD | الفاصلة المنفردة لا تُحسب كلمة |
don't | دون تغيير | الفاصلة العليا داخل الكلمة ليست علامة اقتباس |
| نص من عدة أسطر | كل سطر يُعالج منفردًا مع الحفاظ على فواصل الأسطر | لا ينبغي أن تغيّر تعليمة في سطر كلمات سطر آخر |
الاختبار ومعالجة الأخطاء
توجد الاختبارات في main_test.go وتُشغَّل بالأمر go test.
والاختبار الرئيسي قائم على جدول: 48 حالة، لكل منها اسم ومُدخل ومُخرج متوقع، تتحقق منها حلقة
واحدة. وتغطي كل أمثلة وصف المشروع، إضافة إلى حالات استثنائية ظهرت أثناء الاختبار، مثل الملف
الفارغ، والمسافات الزائدة، والعدد الأكبر من الكلمات المتاحة، والأرقام غير الصالحة، ومجموعات
الترقيم المختلطة مثل ?!، وعبارتين مقتبستين في سطر واحد. وتُنسَّق الشيفرة
بأداة gofmt وتُفحص بأداة go vet.
| الاختبار | ما الذي يثبته |
|---|---|
TestProcessText | كل حالات النص الـ48، من المُدخل إلى المُخرج المتوقع |
TestRunWithFiles | البرنامج الحقيقي يقرأ الملفات ويكتبها، باستخدام مجلد مؤقت تحذفه لغة Go بعد الاختبار |
TestRunErrors | حالات الفشل: صفر أو واحد أو ثلاثة مُدخلات، وملف إدخال غير موجود، وملف إخراج تتعذر كتابته |
TestUsageMessageText | نص رسالة الاستخدام مطابق تمامًا |
TestParseModifier TestConvertToDecimal TestCapitalize | الدوال المساعدة كلٌّ على حدة، فيشير أي فشل مباشرة إلى سببه |
رسائل خطأ واضحة مع رمز خروج 1
- عدد غير صحيح من المدخلات: تظهر رسالة
usage: go run . <input file> <output file> - ملف الإدخال غير موجود أو تتعذر قراءته: تظهر رسالة
cannot read input fileمع السبب - تتعذر كتابة ملف الإخراج: تظهر رسالة
cannot write output fileمع السبب - الإدخال الفارغ ينتج ملف إخراج فارغًا، وتُعالج نهايات أسطر ويندوز بشكل صحيح
ملاحظات
- يستخدم المكتبة القياسية للغة Go فقط:
osوstringsوstrconvوunicodeوerrorsوfmt. - إدارة الإصدارات بأداة Git، مع حفظ التغييرات عند كل مرحلة عاملة.
- الشيفرة المصدرية محفوظة على خادم Git الخاص بأكاديمية 01 Talent.