محمد هاني البرمجة
كل المشروعات

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 ,andthere, and
مجموعات الترقيمتبقى ... و!? متصلةthinking ... Youthinking... You
علامات الاقتباسيحيط زوج العلامات ' بالكلمات التي بينهما دون مسافات داخلية' awesome ''awesome'
أداة التنكيرتتحول a إلى an قبل حرف علة أو ha amazing rockan amazing rock

طريقة البناء

مراحل المعالجة

  1. التحقق من المدخلاتاسما ملفين بالضبط
  2. قراءة ملف الإدخالos.ReadFile
  3. تقسيم النص إلى أسطركل سطر يُعالج منفردًا
  4. تقسيم السطر إلى كلماتstrings.Fields
  5. تطبيق التعليماتhex, bin, up, low, cap
  6. تصحيح أداة التنكيرa → an
  7. تصحيح الترقيمالإلصاق والتجميع
  8. تصحيح الاقتباسالمطابقة والإلصاق
  9. الدمج والحفظ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 إلى anfixArticles 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.