عند اللصق في المحرر أثناء وجوده في وضع “محرر النص المنسق”، لا يتم احترام خاصية CSS white-space لبيانات الحافظة. ينتج عن هذا دائمًا ضغط المسافات البيضاء في المحتوى الملصق. في الحالات التي كانت فيها خاصية white-space لمحتوى المصدر مضبوطة على القيمة pre، ينتج عن ذلك صعوبة قراءة المحتوى الملصق، وعدم صحته في الحالات التي كانت فيها المسافات البيضاء لمحتوى المصدر ذات أهمية تقنية.
خطوات التكرار:
أنشئ ملف HTML بالمحتوى التالي:
<html>
<body>
<span style="white-space: pre">foo
bar
</span>
</body>
</html>
افتح الملف في متصفح الويب الخاص بك.
لاحظ أن المسافات البيضاء لمحتوى الصفحة لم يتم ضغطها:
foo
bar
انسخ محتوى صفحة الويب.
افتح منشئ المشاركات.
ضع المنشئ في وضع “محرر النص المنسق”.
الصق المحتوى المنسوخ.
بدلاً من الحصول على نفس تنسيق المحتوى المنسوخ، تم ضغط المسافات البيضاء للمحتوى الملصق:
foo bar
سياق إضافي:
أرى أن ProseMirror يدعم white-space: pre:
لا يحدث الخطأ عند استخدام المنشئ في وضع “محرر Markdown”.
لا يحدث الخطأ إذا تم لصق المحتوى في كتلة التعليمات البرمجية بدلاً من المحرر العادي. صحيح أنه في كثير من الحالات سيكون من الأنسب وضع المحتوى الذي يستخدم شيئًا مثل white-space: pre في كتلة تعليمات برمجية. ومع ذلك، من الشائع جدًا للمستخدمين تطبيق التنسيق بأثر رجعي عن طريق إضافة المحتوى إلى المنشئ، وتحديد المحتوى، ثم استخدام شريط أدوات المنشئ لتطبيق التنسيق (على عكس النهج البديل المتمثل في تشغيل كتلة تعليمات برمجية قبل إضافة المحتوى).
وجدت أن هذه أداة مفيدة لفحص البيانات الأولية لمحتوى الحافظة:
لستُ خبيرًا جدًا في موضوع HTML، ولكني أتوقع هذا العرض:
على حد علمي، هذه هي الطريقة التي يعرض بها متصفح Chrome ذلك.
ومع ذلك، في الاستخدام المحدد الذي واجهت فيه المشكلة، صحيح أن عرض كتلة التعليمات البرمجية سيكون الأكثر ملاءمة. نحصل على هذا النوع من محتوى الحافظة بالنقر فوق الزر “نسخ مخرجات وحدة التحكم” في بيئة تطوير متكاملة عبر الإنترنت تسمى “Arduino Cloud Editor”:
ومع ذلك، فإن هذا التفضيل لكتلة التعليمات البرمجية خاص بحالتنا المحددة. قد يكون أنه في حالات استخدام أخرى توجد مصادر لمحتوى الحافظة بخصائص white-space: pre والتي قد لا تكون كتلة التعليمات البرمجية مناسبة لها. وحتى في حالتنا، من المعقول وضع مسؤولية تطبيق تنسيق كتلة التعليمات البرمجية يدويًا على المستخدم.
إذا استخدمت أداة “Clipboard Inspector” للتحقق من البيانات الموجودة في الحافظة الخاصة بي بعد النقر على زر “Copy Console Output” في Arduino Cloud Editor، فسيظهر أن هناك بيانات من النوع “text/plain” التالية:
مع التحسينات الأخيرة على زر شريط أدوات الكود، يجب أن يكون المستخدمون قادرين على تحديد هذا القسم الملصق مع الفواصل الصلبة وتحويله إلى كتلة كود، ويجب نقل فواصل الأسطر.
شكراً جزيلاً على الإصلاح يا @renato، وعلى تخصيص الوقت لنشر تحديث هنا!
لقد جلبت إصلاحات الأخطاء الأخيرة وظائف محرر النصوص المنسقة إلى النقطة التي يمكن أن تجعل منتدانا أكثر سهولة للمستخدمين الأقل خبرة تقنية الذين ليسوا على دراية بالفعل بـ Markdown وغير متحمسين لتعلمه.
لا تزال هناك بعض الحالات التي تكون فيها النتائج غير متوقعة، ولكن هذه أمور غير معقولة للتخفيف منها عبر قاعدة كود Discourse:
تلف بسبب بناء جملة العلامات العرضي
قد تتلف المشاركات في حالة وجود محتوى يشبه العلامات عن طريق الصدفة. هذا يرجع إلى القرار المتعمد لدعم العلامات في محرر النصوص المنسقة.
بالنسبة لحالة الاستخدام الخاصة بنا حيث يُتوقع من أولئك الذين يرغبون في استخدام العلامات استخدام محرر Markdown، بينما يُقصد بمحرر النصوص المنسقة فقط للاستخدام من قبل أولئك الذين ليس لديهم اهتمام باستخدام العلامات، فهذا قرار مؤسف للغاية. إحدى أهم المشكلات التي نواجهها مع المستخدمين غير التقنيين الذين يستخدمون محرر Markdown هي تلف المشاركات بسبب العلامات العرضية، وكان لدي آمال كبيرة في أن يوفر محرر النصوص المنسقة حلاً لذلك. ومع ذلك، بالنسبة لحالة الاستخدام حيث سيوفر المنتدى محرر نصوص منسقة فقط، فإن هذا التصميم منطقي تمامًا لأنه لا يزال يسمح للمستخدمين الماهرين في Markdown بتأليف المشاركات بكفاءة.
تنسيق غير صحيح بسبب علامات غير مناسبة في محتوى الحافظة
لدينا حالة يكون فيها المحتوى من نوع “text/html” المضاف إلى الحافظة عند النسخ من تطبيق معين يحتوي على علامات HTML غير مناسبة، مما يؤدي إلى تنسيق غير صحيح عند لصق المحتوى في محرر النصوص المنسقة خارج كتلة التعليمات البرمجية.
هذا بالطبع خطأ في التطبيق، ويتصرف Discourse بشكل صحيح بنسبة 100٪ من خلال تنسيق المحتوى كما هو مشار إليه بالعلامات.
هل يمكنك التوسع قليلاً في أمثلة حيث يمكن أن يحدث الفساد؟ لا نزال نواجه بعض الحالات الطرفية حول العقد التي لا نعرف كيفية عرضها، لكننا نحاول حظر التبديل إلى المحرر الغني في حالات كهذه.
فيما يتعلق بالحافظة، نريد بالتأكيد التحسين. إنها مشكلة صعبة، وأي إعادة إنتاج دقيقة هنا ستكون مفيدة للغاية.
بالتأكيد. يسعدني أن تكون المعلومات مفيدة. أود أن أكرر ما قلته سابقًا:
ومع ذلك، سأكون سعيدًا إذا كنت مخطئًا بشأن ذلك .
انسخ كود C++ التالي:
#include <iostream>
int main() {
std::cout << __FILE__;
}
افتح منشئ المشاركات.
ضع المنشئ في وضع “محرر النصوص المنسقة”.
الصق المحتوى المنسوخ في المنشئ.
المحتوى تالف:
#include
int main() {
std::cout << FILE;
}
(لاحظ أنه تم كتم \u003ciostream\u003e لأنه يشبه علامة HTML غير مدعومة، وتم التعامل مع __FILE__ كعلامة جريئة)
يمكن اعتبار هذا خطأ من المستخدم، حيث يمكن تجنبه عن طريق تشغيل كتلة الكود قبل لصق المحتوى غير النثري. ومع ذلك، قد نتوقع أن يكون سير العمل البديل المتمثل في تطبيق تنسيق كتلة الكود بأثر رجعي على المحتوى الملصق بنفس القدر من الصلاحية (كما هو الحال عند استخدام محرر Markdown).
void setup() {
Serial.begin(9600);
while (!Serial) {} // انتظر حتى يتم فتح منفذ التسلسلي.
delay(500); // تتطلب بعض اللوحات تأخيرًا بعد تهيئة منفذ التسلسلي.
Serial.println("foo");
Serial.println("bar");
}
void loop() {}
حدد Tools > Serial Monitor من قوائم Arduino IDE لفتح عرض Serial Monitor، إذا لم يكن مفتوحًا بالفعل.
حدد " 9600 " من قائمة معدل الباود في عرض Serial Monitor.
قم بتحميل الرسم التخطيطي إلى لوحة Arduino الخاصة بك.
حدد الإخراج التسلسلي من الحقل في عرض Serial Monitor.
انسخ المحتوى المحدد.
افتح منشئ مشاركات Discourse.
ضع المنشئ في وضع “محرر النصوص المنسقة”.
الصق المحتوى المنسوخ في المنشئ.
يتم وضع كل سطر من المحتوى المنسوخ في كتلة كود منفصلة:
foo
bar
إذا قمت بفحص محتوى الحافظة، فسترى أنه بالإضافة إلى نوع المحتوى المتوقع “text/plain”:
نظرًا لأن مراقب التسلسل في Arduino IDE 2.x يلتف بشكل غير صحيح كل سطر من المحتوى المنسوخ من نوع “text/html” في علامات <pre>، فإن عرض كل سطر من المحتوى الملصق ككتلة كود منفصلة بواسطة محرر النصوص المنسقة لـ Discourse هو صحيح ومتوقع.
كما هو الحال مع المشكلة الأخرى التي وصفتها أعلاه، يمكن تجنب التنسيق غير المتوقع عن طريق تشغيل تنسيق كتلة الكود بشكل استباقي قبل لصق المحتوى.