تحسين تقليم البريد الإلكتروني (بدون تقليم داخل كتل الأكواد)

لقد فتحت أيضًا مشكلة على GitHub بخصوص هذا، ولكني أردت نشرها هنا أيضًا في حال كان هناك المزيد من الأشخاص يتابعون:

أعتقد أنه سيكون من الرائع تحسين منطق قص البريد الإلكتروني لتجنب القص داخل كتل التعليمات البرمجية. على سبيل المثال، في بريد إلكتروني يحتوي على:

```
# لا ينبغي حذف هذا
#
# أو قصه
# إنه رمز
####
كود كود كود
```

يتم قص كل شيء أسفل علامة ‘#’ الأولى. هذا غير مريح بعض الشيء، حيث يستخدم الكثير من الأشخاص علامات التعليق لتقسيم أجزاء من التعليمات البرمجية الخاصة بهم، وأحيانًا حتى في السلاسل النصية متعددة الأسطر للطباعة. كما أن لديها ميزة ملائمة تتمثل في أنه إذا أراد الأشخاص نسخ ولصق مخرجات البرنامج في بريد إلكتروني وتضمنت هذه المخرجات أسطرًا كهذه، فلن يتم قص البريد الإلكتروني عندها إذا تم تغليف مخرجات البرنامج بعلامات اقتباس. هل هناك أي فرصة لأن تكون هذه مشكلة شائعة بما يكفي ليتمكن شخص ما من إيجاد وقت لرؤية ما إذا كان يمكن تحسينها؟ لقد وصلت إلى التعبير النمطي (regex) حيث يحدث المطابقة، ولكني لست متأكدًا من مدى تعقيد إضافة استثناء لكتل التعليمات البرمجية.

شكرًا!

حسنًا، اضطررت لتعلم القليل من لغة روبي، ولكن:

نرحب بالنقاش!

3 إعجابات

حتى نكون على نفس الصفحة، دعني أعيد صياغة مشكلتك حتى نتحدث عن نفس الشيء :wink:

أنت تريد القدرة على التعامل بشكل صحيح مع كتل التعليمات البرمجية المسورة في ردود البريد الإلكتروني، خاصة إذا كانت تتضمن الرمز #، والذي غالبًا ما يُستخدم كفاصل (توقيع) وبالتالي يتم قصه.

لذلك إذا كنت سترسل رد البريد الإلكتروني التالي

هذه هي الرقعة الخاصة بي

```
# هذا تعليق ما
####

answer = 42
```

هل يبدو جيدًا؟

يجب أن يكون “ذكيًا” بما يكفي للتعرف على أن الأسطر الموجودة بين ``` هي تعليمات برمجية فعلية وبالتالي يجب “تجاهلها” من المعالجة العادية.

إذا كان الأمر كذلك، فسأوصي بحل / نهج مختلف. قد يكون من الأفضل رفع جميع كتل التعليمات البرمجية في الدالة preprocess! وحقنها مرة أخرى لاحقًا.

كتل التعليمات البرمجية المسورة صعبة إلى حد ما في التحليل بشكل صحيح باستخدام تعبير عادي ولكن لحل جيد بما فيه الكفاية، يجب أن يعمل هذا

def hoist_code_blocks(text)
  blocks = {}
  pattern = /^```\\w*$\\n.*?^```$/m
  
  text.gsub(pattern) do |block|
    token = SecureRandom.hex
    blocks[token] = block
    token
  end

  [text, blocks]
end

ستقوم هذه الطريقة باستبدال جميع كتل التعليمات البرمجية بقيمة عشوائية وتتبع تعيين بين القيمة العشوائية ومحتوى الكتلة في الهاش blocks.

يمكنك استدعائها هكذا

text = "some text\n```ruby\ndef foo\nend\n```\nmore text"
new_text, blocks = hoist_code_blocks(text)

ثم يمكنك “استعادة” كتل التعليمات البرمجية باستخدام الكود التالي

blocks.each { |token, block| new_text.gsub!(token, block) }

شكرًا على الرد! لقد فهمت المشكلة التي أواجهها بشكل صحيح، نعم.

فكرت في القيام بشيء كهذا أيضًا، ويسعدني أن يتم تنفيذ ذلك إذا كان يعمل ويتطابق مع سلوك المحلل داخل المتصفح قدر الإمكان. على سبيل المثال، في واجهة المتصفح، يُسمح لي بوجود مسافات بيضاء قبل إعلان لغتي، ويُسمح لي بوجود مسافات بيضاء بعد إغلاقي:

int x=42;<br>
```         (الكثير من المسافات هنا)

لا يزال يتم عرضه بشكل صحيح على النحو التالي:
```                    c++
int x=42;

في طلب السحب أعلاه، حاولت اتباع القواعد التي تمكنت من تحديدها في المحلل.

السؤالان الآخران اللذان سأطرحهما حول تنفيذك هما ما إذا كان ينبغي القيام بذلك حقًا في preprocess!، بحيث يجب أيضًا تمرير الكتل أو الاحتفاظ بها بواسطة فئة EmailReplyTrimmer (وأيهما سيكون المفضل)، وما إذا كان قد يكون هناك خطأ هناك، لأن text الذي تم إرجاعه هناك هو نفس النص الأصلي، دون إجراء أي استبدالات (يبدو أن gsub تُرجع مُعدِّدًا للمطابقات، ولكنك لا تقوم فعليًا بالاستبدال هنا؟).

على أي حال، يسعدني أن تستخدم الاختبار الذي تمت إضافته في طلب السحب الخاص بي أعلاه إذا كنت تفضل إضافة هذا الكود إلى المحلل بنفسك، أو إذا أخبرتني عن المشكلتين أعلاه، يمكنني إنشاء طلب سحب جديد. لقد فهمت المشكلة بشكل صحيح تمامًا، ويبدو أن حلك قريب، أنا فقط لست متأكدًا تمامًا من كيفية رغبتك في إنهاء الأمر.

شكرًا!

نعم، بدأ الأمر يصبح معقدًا… يمكن القيام بذلك، ولكن ستكون هناك دائمًا حالات استثنائية مقارنة بوجود محلل حقيقي.

يمكنك أيضًا استخدام أكثر من 3 `، 3 هي الحد الأدنى :wink:

يمكنك أيضًا القيام بذلك في دالة trim، مباشرة بعد استدعاء preprocess! وقم بتنفيذ خطوة “ما بعد المعالجة” في النهاية.

صحيح، كان ذلك في الغالب رمزًا زائفًا :sweat_smile:
يمكنك على الأرجح استخدام gsub! أو القيام بـ text = text.gsub....

حسناً، رائع — لقد فتحت طلب سحب جديد هنا:

شكراً مرة أخرى!

3 إعجابات

تم زيادة الإصدار في Discourse أيضًا :up:

3 إعجابات

تم إغلاق هذا الموضوع تلقائيًا بعد 39 ساعة. لم يعد يُسمح بالردود الجديدة.