مقال أليكسيس بينجسنر ،
"تقديم النص يكرهك" ، الذي نشر قبل شهر
، قريب جدًا مني.
في عام 2017 ، كنت أطور محرر نص تفاعلي في متصفح. غير راضٍ عن مكتبات ContentEditable الموجودة ، فكرت: "مرحبًا ، أعيد تحقيق تحديد النص! هل هو صعب؟ " كنت صغيرا ساذج. كنت أحسب أنني أستطيع التعامل معها في غضون أسبوعين. في الواقع ، استغرقت محاولة لحل هذه المشكلة عدة سنوات من حياتي ، بما في ذلك عام من العمل المدفوع الأجر من الصباح حتى المساء لتطوير محرر نصوص لنظام التشغيل الجديد.
في العمل ، كنت محظوظًا بما فيه الكفاية لأتعلم الكثير من
الموجهين ذوي الخبرة الواسعة في هذا المجال . لقد سمعت الكثير من القصص المخيفة. بما في ذلك مهندس دعم تطبيق Windows مع تطبيق مخصص لحقل النص - وأراد التبديل من واجهة برمجة تطبيقات إدخال النص القديم إلى إصدار جديد. فيما يلي
قائمة بواجهات إدخال النص في هذا الإصدار الجديد:

هذا صحيح ، 128 واجهات لإدخال النص. أنا متأكد تقريبًا من وجود ثمانية (8!) أنواع مختلفة من الأقفال لحل مشاكل التوافق ، على الرغم من أنني بصراحة لم أقرأ مستنداتها ، لذلك لا تقتبس من ذلك. هذا المهندس سنة ونصف (بدوام كامل!) تعديل محرره ، ولكن في النهاية فشل وبقي على API القديم.
الكتابة صعبة.
يذكر الكسيس في بعض الأحيان اختيار النص ، ولكن تجربتها الشخصية أكثر ارتباطًا بالتقديم. كشخص من ناحية أخرى ، يمكنني إضافة بضع نقاط حول الإدخال.
حركة المؤشر العمودي
لقد سبق لي أن غطيت هذا في
مقال سابق ، ولكن يمكننا تكرار هنا بسرعة.
في هذا المثال ، إذا قمت بالضغط للأعلى ، ينتقل المؤشر إلى بداية السطر ، قبل كلمة
hello . حتى الآن ، كل شيء معقول جدا. ولكن إذا قمت بالضغط لأعلى ثم لأسفل ، فسيقفز المؤشر أولاً أمام
hello ، ثم يقف بعد
بعض .
هذا قد لا يبدو منطقيا جدا. تسأل لماذا يقفز إلى اليمين؟ حسنًا ، مع الحركات الرأسية ، يتذكر كل مؤشر موضع
x بالبكسل ، ولا يتم تحديثه إلا عند الضغط على اليسار أو اليمين ، وليس لأعلى ولأسفل. نفس السلوك يمنع المؤشرات من التحرك إلى اليسار عند التحرك عموديًا عبر خطوط قصيرة.
قرب
حسنًا ، نعلم الآن أنه عندما نختار نصًا ، لدينا
قسمان من الحالة: إزاحة البايت داخل السطر والإحداثي
س بالبكسل ، المذكور أعلاه. هل تم حل المشكلة؟ حسنا لا.
النظر في موقفين المؤشر على خط طويل جدا:
نظرًا لأن كلمة
loooooooooong هي كلمة واحدة ، فإن مواضع المؤشر لها
نفس إزاحة البايت بالضبط في السلسلة . لا يوجد سطر جديد بينهما ، حيث يتم التفاف السطر بهدوء. تحتاج مؤشراتنا إلى شيء إضافي يخبرهم بالخط الذي يجب عليهم الذهاب إليه. معظم النظم استدعاء هذا التقارب قليلا. يتم استخدامه أيضًا في نص ثنائي الاتجاه مختلط ، والذي سنتحدث عنه قريبًا.
الرموز التعبيرية المعدلات
لنفترض أنني أرسل رسالة إلى صديق. للتعبير عن مشاعري أريد إضافة رمز تعبيري مضحك. أدخلت في منطقة النص إبهامًا لأعلى ولحرفًا ومعدل تعبيري عن لون البشرة. يبدو مثل هذا:
أوه ، لا أريد أن أكتب خطابًا. قمت بتعيين المؤشر بعد ذلك وانقر فوق مسافة للخلف. ماذا سيحدث؟ رأيت العديد من الخيارات ، وهذا يتوقف على المحرر.
- # 1 سيئة قد يبدو صحيحا. ولكن هذه هي الطريقة التي يعمل بها محرر النصوص مع دعم لتقديم الرموز التعبيرية القديمة ، على سبيل المثال ، Sublime Text. يعد هذا أمرًا سيئًا نظرًا لأن الرموز التعبيرية للإصبع الخفيف يتم تشفيرها كإصبع أصفر ، يتبعها فورًا معدل لون البشرة. لا يتم دمجها في رمز واحد ، كما هو متوقع. حتى لو قمت بنسخ الإصبع الخفيف من تطبيق آخر ، فلن يتم عرضه بشكل صحيح ، كما هو الحال هنا.
- سيء # 2 هو ما يفعله Chrome 77 في شريط العناوين. ليس على صفحات الويب ، ولكن فقط في شريط العناوين. هذه ليست مشكلة في العرض ، حيث تعمل الرموز التعبيرية للنسخ ولون البشرة. بدلاً من ذلك ، يحذف Chrome الحرف ، وبعد أن لاحظ المُعدِّل الذي يتبع الحرف ، فإنه يحذفه أيضًا. عفوا.
- تطابق # 3 السيئ مع مواصفات Unicode حول كيفية دمج الرموز التعبيرية. لكن هذا غير مفهوم تمامًا للمستخدمين ، وبالمناسبة ، تحتاج إلى تحريك المؤشر حتى لا تتعثر في منتصف المسافة داخل الرموز التعبيرية.
جميع الخيارات سيئة ، لذلك يمكنك افتراض أن هناك خيارًا رابعًا على الأرجح. هناك! لا يسمح لك العديد من المحررين ، مثل TextEdit ، بوضع المؤشر بعد الحرف ، نظرًا لأن معدل لون البشرة يعتبر وحدة واحدة بالحرف السابق. هذا أمر منطقي في سياق الرموز التعبيرية وحتى يعمل بشكل جيد في هذه الحالة ، ولكن ماذا لو أشار إلى المعدل بواسطة الحرف الأول في السلسلة؟
الآن يغير المعدل حرف السطر الجديد. لن يسمح لك TextEdit بوضع المؤشر في بداية السطر الثاني! أنا شخصياً أعتبر هذا القرار "سيئًا أيضًا".
ربما لاحظت أيضًا أن الإبهام لأعلى أصبح الإبهام لأسفل. فعلت هذا بنفسي لتعكس مشاعري حول الوضع برمته.
بالمناسبة ، يجعل TextEdit بالتحديد المؤشر على السطر الأول عربات التي تجرها الدواب
للغاية . على سبيل المثال ، خمن ما يحدث إذا ضغطت
4
هنا؟
هاه. قد تعتقد أيضًا أن هناك مسافات بين الأرقام. انهم ليسوا هناك.
نص ثنائي الاتجاه
يذكر Alexis تحديدات الانقسام في نص ثنائي الاتجاه مختلط ، كما في هذا المثال من TextEdit:
هذا أمر منطقي حقًا ، نظرًا لأن اللغة العربية في الأسطر يتم ترميزها من اليمين إلى اليسار ، بحيث يبدو الاختيار منقسمًا ، لكن البايتات هي نطاق مستمر.
لذلك ، من المدهش قليلاً أن نتمكن من الحصول على هذا الاختيار:
نعم ، إنها مستمرة بصريًا ، ولكنها منفصلة عن البايت. نعم هذا سيء. يقوم بعض المحررين بذلك إذا حددت نصًا باستخدام مفاتيح الأسهم بدلاً من الماوس. البديل هو تبديل المفاتيح اليسرى / اليمنى داخل النص بالاتجاه من اليمين إلى اليسار ، وهو أمر سيء أيضًا. لا توجد خيارات جيدة هنا.
كمكافأة ، حاول أن تفهم ما يجري هنا:
يا رب ... لا أريد التعليق على هذا.
الشيء عن طرق الإدخال
يطلق على البرنامج الذي يترجم ضغطات المفاتيح إلى الإدخال طريقة إدخال أو محرر أسلوب الإدخال. بالنسبة إلى الأبجدية اللاتينية ، هذا ليس برنامجًا مثيرًا للاهتمام ، لأن كل ضغطة مفتاح ترتبط مباشرة بإدخال حرف واحد. ولكن في العديد من البرامج النصية ، لا تلائم الشخصيات لوحة المفاتيح ، لذلك يجب أن تكون مبدعًا. على سبيل المثال ، في بعض أساليب الإدخال للغة الصينية ، يقوم المستخدم بإدخال الأصوات - ويحصل على قائمة من الأحرف المتشابهة في الصوت:
هذا الحقل يسمى أحيانًا المنطقة المؤلفة ، وغالبًا ما يظهر
أعلى النص المسطر . في بعض الأحيان يجب أن أسلوب الإدخال إلى أسلوب عليه. على سبيل المثال ، تستخدم طريقة الإدخال اليابانية على Android لون الخلفية لإنشاء منطقة مشاركة جملة:
(شكرا لشاي للشاشة!)هل تتفاعل كل هذه التحديدات والمناطق التركيبية مع النص ثنائي الاتجاه؟ دعونا لا نفكر في ذلك.
يجب أن تعمل طرق الإدخال في كل مكان ،
حتى داخل الجهاز :
لن يذهب أي شيء إلى Vim حتى يتم اختيار شخصية صينية من القائمة. ربما تعتقد: "لكن كيف تعمل في وضع أوامر Vim؟" ليس جيد جدا هذا هو السبب في إدخال النص على الإنترنت وضربات المفاتيح أحداث منفصلة. في وحدة التحكم ، فإنها تختلط ، مما تسبب في مشاكل.
هذا مجرد مثال واحد على العديد من طرق إدخال النص المختلفة. (لا تنس طرق الإدخال بدون لوحة المفاتيح مثل الصوت والكتابة اليدوية!) لحسن الحظ ، يوفر لك نظام التشغيل جميع هذه الطرق. ولكن لسوء الحظ ، يجب أن يتكلم مربع النص الخاص بك بروتوكول إدخال النص العام الذي تستخدمه جميع هذه الطرق. بالنسبة إلى Windows ، هذه هي 128 واجهة مدرجة في بداية المقالة. على أنظمة التشغيل الأخرى ، تكون الواجهات أبسط ، لكن لا يزال من الصعب تنفيذها.
قد تلاحظ أيضًا أن طريقة الإدخال هي عملية منفصلة ، بحيث يمكن لطريقة الإدخال والتطبيق إجراء تغييرات على حالة حقل النص. هذا هو في الواقع بروتوكول التحرير الموازي. يحل Windows المشكلة مع ثمانية (8!) أنواع الأقفال. على الرغم من أن الاحتفاظ بقفل عبر حدود العملية قد يبدو مشكوكًا فيه ، فإن معظم الأنظمة الأساسية الأخرى تحاول استخدام الأساليب البحثية غير الكاملة لإصلاح مشكلات التوافق. أو يأملون فقط ألا يحدث شرط السباق. في تجربتي ، الصلاة ليست بدائية فعالة للغاية من التوازي.
لماذا كل شيء معقد جدا؟
يذكر جوناثان بلو ، في محاضرة حول تدهور البرمجيات ،
محرر النصوص كين طومسون ، الذي كتبه خلال أسبوع. يتم عرض عشوائي معظم التعليمات البرمجية في هذه المقالة التعقيد. هل يحتاج Windows بالفعل إلى 128 واجهة و 8 أنواع من الأقفال لإدخال النص؟ لا مفر هل الأخطاء في TextEdit ناتجة عن نموذج تحرير معقد؟ نعم. هل نثر الحشرات في البرامج الحديثة أمر يدعو للقلق؟ على الأقل بالنسبة لي هو عليه.
ومع ذلك ، كان محرر كين طومسون أبسط بكثير مما نتوقعه من محرري النصوص الحديثة. يدعم Unicode جميع اللغات الحية تقريبًا في العالم (هناك حوالي 7000 لغة منها) ، والكثير غيرها قد مات. هناك نصوص مختلفة وتوجيهات نصية وطرق إدخال ، يفرض كل منها قيودًا معقدة (وفي بعض الحالات غير قابلة للذوبان) على أي محرر. لكنه يجب أن يدعم أيضًا قارئات الشاشة.
التعقيد الضخم يتراكم
حتما ، وفي هذه المقالة لم نلمسها إلا قليلاً. هذه معجزة برمجة حقيقية حيث يمكنك فقط صفعة
<textarea>
على صفحة ويب - وتوفير إدخال النص على الفور لكل مستخدم إنترنت في جميع أنحاء العالم.