ماكرو ليبر أوفس لتهيئة النصوص.

نشره أحمد أبوزيد في
LibreOffice-logo

تعرفنا سابقاً على التعابير النظامية Regular Expressions أو كما يقال لها اختصاراً Regex وكيف يمكن أن تفيدنا في تهيئة النصوص خصوصاً الكبيرة منها بسرعة وفاعلية، وذلك عن طريق تقليص العمل اليدوي لأقل حد ممكن.

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

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

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

وهنا ولا يكون أمامك إلا حلّين، الأول إما أن تضغط Shift + Enter قبل الكلمة في آخر السطر لتجعلها تنزل إلى السطر الجديد مع المحافظة على خاصية المحاذاة (Justify)، أما الحل الثاني فهو أن تستبدل المسافة بين واو العطف أو الفاصلة وبين الكلمة بمسافة غير منكسرة Non-breaking space (والتي يمكن ادراجها من ليبر أوفس من قائمة Insert ثم Formating mark ثم Non-Breaking Space أو إدراجها يدوياً عن طريق أداة Character Map) وبالتالي يتم معاملة حرف العطف أو علامة الترقيم والكلمة كأنهم كلمة واحدة.

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

إذن ماذا يفعل هذا الماكرو؟

  • يزيل السطور الفارغة.
  • يزيل أي تكرار للمسافات، والمسافات في أول وآخر الفقرات.
  • يزيل المسافة من قبل (الفاصلة، الفاصلة المنقوطة، النقطة، النقطتين الرأسيتين، علامتي التعجب والاستفهام).
  • يزيل المسافات بين الأقواس الهلالية "()" والنص بداخلها.
  • يزيل المسافة بين الواو المنفردة والكلمة التي بعدها.
  • يزيل الكشائد (التطويل Shift + ت).
  • يحول الفاصلة اللاتينية (الفاصلة العشرية) "," بعد الكلمات العربية إلى فاصلة عربية "،".
  • يحول الفاصلة المنقوطة اللاتينية ";" بعد الكلمات العربية إلى فاصلة منقوطة عربية "؛".

كيف تضيف هذا الماكرو إلى ليبر أوفس؟

افتح محرر النصوص ريتر ليبر أوفس، ثم من القائمة: Tools ‣ Macros ‣ Organize Macros ‣ LibreOffice Basic ثم اختر: My Macros ‣ Standerd ‣ New

Add new macro to LibreOffice

وانسخ الماكرو بالأسفل ثم احفظ.

Edit macro inLibreOffice

وتستطيع تشغيله ليتم تطبيقه على المستند من خلال: Tools ‣ Macros ‣ Run Macros
الآن تستطيع أن تبدأ العمل على مستند نظيف خالي من أي زيادات أو أشياء غير مرغوب فيها :-)
أي ملاحظات أو تحسينات بالتأكيد مرحب بها.

هل تود عمل مكارو بسهولة دون معرفة برمجية؟ جرب خاصية تسجيل الماكرو في ليبر أوفس: Recording a Macro - LibreOffice Help

مراجع إضافية:

Getting Started with Macros. Macro - LibreOffice Help. Macro programming in LibreOffice.

Sub FixArabicCommon oDoc = thisComponent aFind = Array("(.*\w[^a-zA-Z\d])(;)", "(.*\w[^a-zA-Z\d])(,)", "\([ ]*", "[ ]*\)", "^$", "^[\ ]*$", "^[\ ]*", "[\ ]*$", "[ ]*", " :", " ؛", " ،", " \.", " !", " ؟", " و ", "^و ", "ـ") aReplace = Array("$1؛", "$1،", "(", ")", "", "", "", "", " ", ":", "؛", "،", ".", "!", "؟", " و", "و", "") aRayCount = 0 FandR = oDoc.createReplaceDescriptor FandR.SearchCaseSensitive = true FandR.SearchRegularExpression = true While aRayCount = uBound(aFind) FandR.setSearchString(aFind(aRayCount)) FandR.setReplaceString(aReplace(aRayCount)) aRayCount = aRayCount + 1 oDoc.ReplaceAll(FandR) Wend End Sub