اسمي ألكسس كلاي وهذه مدونتي التقنية. أنا مهتمة في برمجة واجهات المستخدم، والتعلم الآلي (معالجة اللغة الطبيعية)، واستخلاص المواقع. لدي خبرة عمل في برمجة الترجمات العربية وتصميم ألعاب الويب. هاجرت من سورية إلى أمريكا في ٢٠١٦
لنقل، فرضياً، أننا نريد مشاهدة أفضل الحلقات من مسلسل “ذا توايلايت زون”، أو ربما مسلسل فكاهي مثل “مالكوم إن ذا ميدل”. لن نفوت شيئاً إن تخطينا الحلقات السيئة إذ أن القصة حلقية
المفاجئ هو أن ترتيب الموسم حسب التقييم ليست ميزة أصلية في موقع أ.م.د.ب. لذا، هنا الخطوات التي يجب اتباعها لتنفيذ ذلك باستخدام متصفح ودفتر ملاحظات:
ولكن كما قال دوغلاس آدامز “أنا قلما أسعد عندما أمضي يوماً كاملاً في برمجة حاسوبي بقيام مهمة تلقائياً كانت لتستغرق عشر ثوانٍ تنفيذها بيدي” لذا، سأقوم بأتمتة المهمة السابقة >:)
أحد الحلول هي زحف بيانات الصفحات باستخدام BeautifulSoup أو مكتبة مشابهة. ولكن ذلك يخالف قوانين استخدام الموقع. يمكننا أيضاً الحصول على البيانات من واجهة مستخدم أ.م.د.ب الذي يوفَّر بشكل رسمي من أجل المشاريع المجانية الشخصية، ولكني أجد أن هذا الحل يستغرق وقتاً طويلاً إذ نحتاج لصنع برنامج يعرض النتائج – برنامجاً يطابق صفحة الموسم على الموقع ولكن مختلف قــلــيــلاً
بدلاً من ذلك الحل، يمكننا “تهكير” الصفحة المعروضة على متصفحنا وإضافة زر بواجهة العميل ليرتّب الحلقات. ويمكننا القيام بذلك باستخدام نص برمجي لغريسمنكي Greasemonkey
greasemonkeyهي إضافة لمتصفح firefoxيمكّن للمستخدم تفعيل النصوص الخارجية. يوجد العديد من تلك النصوص على هذا الموقع https://greasyfork.org مثال لذلك هو النصوص العديدة المكتوبة من قبل مؤلفين متعددين لزيادة وظائف يوتوب https://greasyfork.org/en/scripts/by-site/youtube.com يمكنكم وجود العديد من النصوص لأي موقع فعلياً. في الماضي، كنت أستخدم العديد من النصوص على newgrounds.comلأرى منْ منَ المستخدمين على النت، ولعرض احصائيات مخفية قصد عرضها فقط لمصممي الموقع
“لصّ الرحيق: الحلقة (أ)” هي لعبة كتابية قصيرة صنعتها لورين شميدت، قامت لورين بتصميم اللعبة لتكون نموذجاً مبدئياً حوارياً للعبة مستقبلية عن الاعتناء بالحدائق تدعى أيضاً “لصّ الرحيق”.
أنا في غاية الامتنان أنني دعيت لترجمة اللعبة إلى العربية فأنا مهووسةٌ بها قبل أن ترسل إلي المصممة طلب الترجمة! كنت واثقاً أن الترجمة لن تكون سهلة لأن اللعبة الأصلية مملوءة بالحوارات، وليس لدي مرجع لألعاب كتابية عربية أخرى.
استخدمت خط Courier لأنه خط موحّد العرض لكل محرف. أعتقد أن ذلك يجعل حركة كتابة كل محرف مريحاً للعين.
معلومات تقنية عن الترجمة العربية
صنعت لورين كوداً برمجياً ذكياً يقوم بنسخ كل النصوص المترجمة من جدول ويغير إعدادات اللعبة حسب اللغة مثل تغيير التنصيق، إضاقة تغييرات CSS، وغيرها. مع ذلك تطلب مني العمل لإضافة ميزات تحتاجها النسخة العربية لتكون مثالية:
١- رسم الكتابة من اليمين إلى اليسار. نقوم بذلك بمجرد إضافة هذا السطر في index.html وإصلاح كل ما يخرب:
<html lang="ar" dir="rtl">
٢- ترجمة الأرقام من الأرقام العربية المغربية (المعتمدة في الإنجليزية) إلى الأرقام العربية المشرقية (المتعمدة في العربية). نقوم بذلك عبر تحويل كل رقم مرسوم إلى سلسلة string ثم تبديل كل محرف مغربي في السلسة إلى محرف مشرقي.
التقنية مشمولة في الدالة التالية، ويمكنكم التطلع على مشروع صغير صنعته يقوم بهذه التقنية.
// Alex Clay. English-to-Arabic number transliterating
// مصفوفة تحوي جميع رموز الأرقام العربية المشرقية
// glyphs representing Arabic numerals
var arabicNumbersMap =
[
"&\#1632;","&\#1633;","&\#1634;","&\#1635;","&\#1636;",
"&\#1637;","&\#1638;","&\#1639;","&\#1640;","&\#1641;"
];
function getArabicNumbers(enNum)
{
var newStr = "";
enNum = String(enNum);
// ضف رمز زائد أو ناقص
// concat plus/minus sign
if (enNum[0] == "-" || enNum[0] == "+"){
newStr += enNum[0];
}
for (i = 0; i < enNum.length; i +=1) {
// parseInt("1") returns 1.
// This means it will return arabicNumbersMap[1]
if (arabicNumbersMap[parseInt(enNum.charAt(i))] != undefined) {
newStr += arabicNumbersMap[parseInt(enNum.charAt(i))];
}
}
return newStr;
}
٣- إضافة أزرار لوحة المفاتيح العربية للإدخال. تمتد شفرات أزرار الأرقام الإنجليزية من ٤٨ إلى ٥٧ (يمكنكم التحقق هنا) ولكن تمتد شفرات أزرار الأرقام العربية على لوحة مفاتيح عربي من ١٧٧٧ إلى ١٧٨٥. والمسألة مشابهة لأزرار الحروف.
حل مؤقت لهذه المشكلة هو تقبل إدخال شفرات إضافية ثانوية تحوي جميع حالات لوحة المفاتيح العربية. أعتقد أن هذا الحل مقبولٌ لنموذج مبدئي للعبة مجانية.
تتصرف شفرات المحارف بشكل مختلف قليلاً حسب المتصفح ونظام التشغيل لذا أكّدت تجربة الأزرار على كل متصفح مشهور، وعلى Windows و Linux، باللغة الإنجليزية والعربية.
ArSpr هي أداة تسمح لك بكتابة نص عربي في محرك Pico8 عبر إدخال نص لاتيني يترجم إلى العربية. صنعتها لأني أخطط بصنع ألعاب Pico8 معرّبة ولأني أردت التسلية ببرمجة راسم للخط العربي من صنعي.
استخدام ArSpr بسيط لكن يختلف عن دالة ()Print المعتادة في Pico8، يجب أن تهيئ متغيراً ليحوي بيانات الخط ثم ترسمه. هنا مثال بسيط:
function _init()
text1=create_ar_spr([string])
end
function _draw()
cls()
draw_ar(text1, [x], [y])
end
مثال بسيط
للخط ثلاث ألوان. لونٌ للحروف، ولونٌ للنقط، ولونٌ للتشكيل. يمكننا تغيير الألوان بهذا الشكل:
function _init()
text1=create_ar_spr([string])
end
function _draw()
cls()
ar_col1=[1-16] --لون الحروف
ar_col2=[1-16] --لون النقط
ar_col3=[1-16] --لون التشكيل
draw_ar
end
مثال لتغيير الألوان
[أترك حرية قراءة ما أسفل هذا السطر للقارئ. لكنه ليس ضرورياً]
معلومات تقنية عن AR_SPR
استوحيت فكرة المشروع من Tiny Text، وهو خط لاتيني لPico8 صنع بشكل مشابه.
مواصفات ArSpr:
2 sprites
510 out of 8192 tokens
~30% of compressed space
No dropped frames when filling the screen
لا تبطيئ في سرعة العرض عند ملئ الشاشة بالكتابة العربية
التّـصـمـيـم
ارتفاع كل حرف هو ٨ بكسلات كحدٍ أقصى. يختلف العرض بين حرف وآخر لكن عرض معظم الحروف هو ٥ بكسلات متضمنة ١ بكسل فارغ إلى يمين الرموز البادئة لكلمة والرموز المنفصلة.
لم أجعل العرض موحداً لأن بعض الحروف تحتاج ضعف عرض معظم الحروف الأخرى، مثل حرف الضاد:
ضـغط الخط
تستخرج جميع الرموز من رسمتين مضغوطتين في الذاكرة.
نقوم برسم الشكل النهائي عبر نسخ ولسق مناطق من الرسمتين المضغوطتين إلى الشاشة.
شمثال توضيحي: يمكننا رسم الرموز على اليمين عبر نسخ أجزاء من الرمز على اليسار
شفّرت بيانات الرسم في بعض من السلاسل strings لأن Pico8 لا يعدّ ما داخل السلاسل في حد الTokens. سنأخذ كمثال سلسلة بيانات “التشكيل” للخط العربي:
تحتوي السلسلة ar_tash على مواقع وأحجام كلَّ الأجزاء في خريطة الرسم ليتم نسخها ولسقها على الشاشة. يتم تحويل كل محرف من السلسلة إلى حرف أو رقم على هذا النحو:
“[الحرف], [عرض الحرف عند الكتابة], [موقع بداية النسخ على X], [موقع بداية النسخ على Y], [عرض الجزء], [ارتفاع الجزء], [موقع اللسق على X], [موقع اللسق على Y], [إشارة على نهاية الرسم أو بداية جزء جديد للرسم]”
كل قسم بين قوسين يجب أن يحوي محرفاً واحداً فقط. الخط السفلي “_” يترجم إلى صفر أو عدم. كمثال حرف تنوين الكسر ” ٍ” :
"✽_2211y6+__2211_6,"
تترجم السلسلة إلى: المحرف ✽ يقدم السطر 0 بكسلات. يحوي جزءاً مرسوماً ينسخ من (x=2,y=2) حجمه (1,1) يلسق في (6, 2-)، ويحوي جزءاً آخر يبداً من (2, 2) حجمه (1, 1) يلسق في (6 ,0).
ضّـــم الحــروف
للحروف العربية أربع رموز مختلفة (أول الكلمة، منتصف الكلمة، آخر الكلمة، منفصلة). ضمّ الخط Arabic Shaping هو أن نختار الرمز المناسب لكل حرف حسب موقع الحرف في الكلمة مع العلم أن الحرف قد يكون منفصلاً أو متّصلاً.
الحروف المتصلة Dual-Joining Letters تلحق بالحرف السابق واللاحق، وتملك جميع أشكال الرموز الأربعة (أول الكلمة، منتصف الكلمة، آخر الكلمة، منفصلة) مثل حرف الباء. ببب ب – بـ ـبـ ـب ب
الحروف المنفصلة Previous-Joining Letters تلحق بالحرف السابق فقط، وتحوي شكلين من الرموز (آخر الكلمة، منفصلة) مثل حرف الدال. ددد بددد – ـد د
جميع حروف الأبجدية حسب تصنيف منفصلة أم متصلة
بقية المحارف مثل (الفراغ، الأرقام، علامات الترقيم) لا تلحق بالحروف وتحوي رمزاً وحيداً منفصلاً.
يتم تجاهل محارف التشكيل عند ضم الحروف ليتمكن الكاتب من وضع التشكيل في نفس موقع الحرف.
تقنية ضمّ الخط التي كتبتها هي مجرد مجموعة من الشروط البسيطة، هنا كود مختصر من الأداة:
function _get_font(previousChar,currentChar,nextChar)
if currentChar is tashkeel
return _ar_tashkeel_glyph
elseif currentChar is (space, number, punctuation)
return _ar_nonletter_glyph
elseif previousChar is any except dual-joining letter
and currentChar is dual-joining letter
and nextChar is any except (space, number, punctuation)
return _ar_init_glyph
elseif previousChar is dual-joining
and currentChar is dual-joining
and nextChar is any except (space, number, punctuation)
return _ar_medial_glyph
elseif previousChar is dual-joining
and currentChar is dual-joining
and nextChar is (space, number, punctuation)
return _ar_final_glyph
elseif previousChar is dual-joining letter
and currentChar is previous-joining letter
return _ar_final_glyph
-- all previous checks failed.
else
return _ar_isolated_glyph
end
end
إن أردتم قراءة تقنية ضمّ خط عربي أخرى يمكنكم قراءة MiniBidi من صنع أحمد خليفة.
تـحسينات مـمكنة
١- يمكننا التخلص من البيانات المكررة في سلسلة الرسم بسماح المحارف أن تحوي مرجع إليها بدلاً من تكرارها. ٢- يمكنني تجريب تقنية Caaz لضغط الرسوم في Pico8 ٣- في نسخة سابقة، كنت أستخدم دالة printAr(str,x,y) لم تحتج لتهيئة المتغيرات لأنها كانت تخزن السلسة اللاتينية بعد رسمها أول مرة. أزلتها لتحرير بعض الtokens لكني أتمنى أن أعيدها.