بلص - حلق بأعضائك

الساعة الآن +3: 1:28 مساءً الاثنين. 6 سبتمبر/أيلول, 2010 م.


يُسمح للزوار بالتعليق.
Rating: 9 votes, 5.00 average.

محرر بلص - مميزات, أمثلة, شرح لآلية عمله و بنيته الأساسية.

هاني كتبه بتاريخ 23/08/2009 الساعة 2:05 ص
هاني عدله بتاريخ 14/09/2009 الساعة 9:40 م (إضافة صورة لخيارات المنتج)

اضغط على الصورة لرؤيتها بحجمها الطبيعي

مبارك عليكم هذا الشهر الفضيل, شهر رمضان الكريم, و قبل أن تستمر في القراءة, أنصحك بالتبديل إلى الشكل المتمدد من أسفل الصفحة.

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

كبداية, اعتمدنا في عملنا بشكلٍ أساسي على JavaScript, و لجأنا إلى الاستفادة من خاصية توسيع وظائف الدوال التي تتيح إمكانية إدخال وظائف جديدة لأي دالة موجودة بالأساس, بدلاً من اللجوء إلى الطريقة السيئة التي تعتمد على إجراء تعديلات ثقيلة على الملفات, مما سيتسبب بعدم التوافقية مع أي ترقيات جديدة للمنتدى, و حتى اشرح لكم طريقة توسيع وظائف الدوال بشكل مبسط, سأستخدم المثال التالي:

توجد دالة لا يمكن الاستغناء عنها في أي لغة برمجية, ألا و هي trim, و تكمن أهميتها في إزالة أي مسافات ببداية أو نهاية النص, و لكن للأسف هذه الدالة غير متوفرة في JavaScript, و لحسن الحظ, فإن مرونة JavaScript تمكننا من كتابة دالة تؤدي هذا الغرض بالتحديد على الشكل التالي:

رمز برمجي:
trim = function (t) {
    return t.replace(/^\s+|\s+$/g, '');
};
و يمكن استخدامها من خلال تمرير نص - أو متغير نصي- إليها, و تعود إليك بنص منقح من المسافات الزائدة. كمثال على الاستخدام:

رمز برمجي:
alert('a' + trim('   -b-   ') + 'c');
لكن لما لا نستخدم الدالة الأصلية String في هذا المجال, عن طريقة إعادة كتابة الدالة السابقة بالشكل التالي:

رمز برمجي:
String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, ''); 
};
و تكمن سهولة استخدام هذه الأخيرة في إضافة النهاية .trim() إلى أي نص أو متغير, على الشكل التالي:

رمز برمجي:
alert('a' + '  -b-  '.trim() + 'c');
أليس ذلك رائعاً؟ نعم, هذا ما كنّا نعنيه بتوسيع وظائف الدوال, و ما استخدمناه هنا هو زيادة وظائف محرر المنتدى نفسه, من خلال تعريفه على أزرار جديدة عليه مما سيضمن لنا التوافقية مع الإصدارات المستقبلية و القديمة على حد سواء, و بنفس الوقت يعفينا من التعديل على الملفات الأساسية للمنتدى, و تم ذلك بسلاسة مع المحرر الخاص بنا.

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

المثال الأول:
اضغط على الصورة لرؤيتها بحجمها الطبيعي

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

المثال الثاني:
اضغط على الصورة لرؤيتها بحجمها الطبيعي

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

لم نكتفي بذلك, فقد رتبنا المحتوى بالتسلسل الذي قد يتّبعه أي مستخدم في تعبئة الخانات من خلال ترقيم كل خانة و زر, موفراً بذلك الانتقال الصحيح عند الضغط على زر الإبدال في لوحة المفاتيح "Tab", و بالتأكيد استخدمنا الخيار tabindex الذي يمكن تعيينه داخل وسوم HTML.

كما وظفنا زر الهروب "Esc" ليعمل على إغلاق النافذة, و أكبر زر في لوحة المفاتيح "زر الإدخال Enter" ليؤدي نفس الدور الذي يقوم به زر الاعتماد عند الضغط عليه بالفأرة, و صحيح أن القليل منا يستخدم لوحة المفاتيح في تأدية مثل هذه الأمور, و السبب في ذلك يعود للحداثة في استخدام الحاسب ممزوجاً بعدم استثمار مثل هذه الخدمات في صفحات الويب. لكن مثل هذه الوظائف الصغيرة توفّر الكثير و الكثير من الجهد و الوقت. و كما يقولون, فالوقت من ذهب.

و لتسهيل الاستخدام أكثر, استفدنا من رسائل البالونات alt في أي وسم أو حقل, حاوياً بداخله أبسط و أسهل و أكثر العبارات شيوعاً في الاستخدام, لتساعده في معرفة المطلوب منه بالتفصيل تجاه ملئ الحقول. كما لجأنا إلى JavaScript في تلوين الحقول الإلزامية أو عرض رسائل توضيحية صديقة, متفادين بذلك استخدام الدالة alert التي تجمد كامل المتصفح حتى ينقر المستخدم على موافق, ليعيد الحياة للمتصفح. و هذا يعتبر من أبشع أساليب البرمجة الصديقة للمستخدم. فلا يجب أن تفرض على المستخدم أي ضغوطات أو أساليب محددة, حتى لا تعطي له الفرصة بأن يتبلور لديه أي سلبية تجاه الخدمات التي تقدمها له.

رغبنا أيضاً بتطبيق تقنية التشغيل بعد اكتمال التحميل, أي عرض محتوى بعد اكتمال تحميل الصفحة. مما سيضفي فتحاً أسرع للصفحات, و وضع كافة ملفات JS في آخر الصفحة, و الذي يعتبر أفضل مكان لملفات JavaScript, بالإضافة إلى استخدامنا لأسرع أمر في جلب ملفات الأنماط الانسيابية:

رموز HTML البرمجية:
<link rel="stylesheet" type="text/css" href="clientscript/pe/plusvb_poem.css?v=100" />
مضيفين إليه متغير تتبدل قيمته من إصدارة إلى أخرى, لتفادي حدوث أي مشاكل عند إجراء تحديث للمنتج على المدى الطويل.

و أيضاً طبقنا تقنية التشغيل بعد اكتمال التحميل على الوسم embed حيث يتم تشغيل ملفات swf أي ("Flash") بعد تحميل الصفحة, بالإضافة إلى ملفات MP3 و YouTube و الوسائط و RealPlayer, و كانت فعّالة جداً في سرعة تحميل الصفحة. حيث تبدأ العملية بعرض وسم نصي مضافاً له اسم نمط انسيابي خاص به, يحدد من بعدها نوعه (RealPlayer, YouTube, Flash, ... الخ.):

رموز HTML البرمجية:
<span  class="flash">http://www.example.com/simple.swf</span>
و عند اكتمال الصفحة, يبدأ العد التنازلي الذي مدته ثانية, ليعمل على جلب كافة الوسوم التي لها الاسم span, ثم يدخل هذه الوسوم إلى تكرار ليبحث بداخله عن أي من الوسوم التي تخصنا و يبدأ بتوليدها بالشكل الصحيح.

العملية نظرياً, ممتازة. لكن اكتشفنا أن التكرار يدور حول نفسه بعدد يتراوح بين 60 - 200 مرة حسب عدد وسوم span في الصفحة. لذلك قررنا أن نبحث عن وسم يقل استخدامه في الصفحات, فوجدنا غايتنا في الوسم bdo. و أصبح التكرار يتراوح بين انعدامه إلى عدد الوسوم الواجب توليدها بالصفحة (بالمتوسط 5).

كما شكل ذلك سرعة أعلى في التوليد و تنفيذ الدوال, و هذه كانت الغاية من تدشينه. لكن الخبر المحزن هو أن توليد وسوم embed من خلال JavaScript يتسم بعدم فعاليته, حيث يتسبب في بعض الأحيان في تجميد الصفحة, و بعض المتصفحات ترفض الطلبات المتكررة (أي تمل بسرعة جراء ذلك), لذلك استغنينا عن هذه التقنية في جميع وسوم embed, واستخدمناها في صقل القصيدة و غيرها من الوسوم التي تعمل عليها بشكل جيد.

أسدى لنا هذا التعديل خدمتين أساسيتين, الأولى و هي السرعة العالية, و الثانية هي أمكانية مشاهدة ملفات Flash و MP3 و YouTube و الوسائط و RealPlayer فعلياً في المحرر المتقدم, حيث يمكنك تعديل أبعاد ملفات Flash بالفأرة, بالنفس الطريقة التي تعدل بها أبعاد نافذة من على سطح مكتبك. فكان ذلك بمثابة البشرى السارة. حيث سيوفر ذلك سهولة عالية للمستخدمين .

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

سار العمل بسلاسة حتى لزمنا أن نحدد عرض القصيدة, فعينا القيمة إلى 50% من الخلية التي تكون القصيدة بداخلها. لكن ذلك بقي حتى نكمل أساسياتها و نجد الآلية المناسبة لحساب العرض المناسب, و بعد بحث عن حجم الحروف. وجدنا أن متوسط عرض الحرف العربي هو 7 من النقاط على شاشة الحاسب, رغم أن هذا صحيح في حالة كان عرض الخط معيّن إلى الحجم الأوسط (14pt) و تم توليده داخل متصفح Internet Explorer. حيث أن ذلك يختلف بنسبة 10% مع باقي المتصفحات, لذلك رفعنا متوسط عرض الخط إلى 8.1. و تكون العملية الرياضية لحساب عرض القصيدة على الشكل التالي:

النسبة المؤوية لحجم الخط (ضرب) أكبر شطر في القصيدة (ضرب) 8.1 (ضرب) 2

حيث يعبر الرقم 2 عن شطري البيت (صدر و عجز البيت), و أكبر شطر يتم تعينه حسب عدد أحرفه مستثنين منه حروفاً لا تحتل أي مكانة من الحجم, مثل التشكيل (الضمة و الفتحة ... الخ). و المخرجات تمثلت بعرض مقبول جداً للقصيدة, رغم تغيير طفيف بين أنواع الخطوط. فطمعنا بشيء أكثر من مجرد معادلة تعمل على PHP, طمعنا بشيء يمس القصيدة بكاملها مهما كانت أبعادها و حجم خطها و حتى اختلاف محتواها. فشاهِدنا فلم بدأ بالمغامرة و الحيرة, و توسطته مأساة, و ختم باستهلاك أقل للموارد (أحسبت بأني سأكمل جملتي بالخير منتصراً على الشر!).

بدأت العمل على دالة بلغة JavaScript, تقلص عرض القصيدة 5 نقاط كل مرة, حتى ينكسر أي شطر ما بالقصيدة (انكسار بالشكل لا بالوزن), ثم أجعلها تضيف 5 نقاط على آخر عرض كسر السطر. و الكسر عملت على حسابه من خلال تفقد طول القصيدة عند كل تقليص, و تغييره يدل على كسر. و الفكرة في غاية البساطة و غاية الكفاءة, و كان بمثابة السهل الممتنع لي. حيث أن الحل لهذه المعضلة لم أصل إليه إلا في منامي!, و حصلت بذلك على أفضل عرض يمكن الوصول إليه. لكن فرحتي لم تطل, فتنفيذ هذه العمليات يستغرق أربع ثوانٍ من زمن فتح الصفحة, و لا يمكن أن أسمح كمثل هذا زمن, فكررت نفس الرمز البرمجي المعني بالتقليص, لكن بقيمة أعلى من 5 نقاط, حيث عينته على ثمن العرض من خلال هذه المعادلة البسيطة:

رمز برمجي:
tw = Math.round(w / 8);
ليكون الشكل النهائي للدالة هو:

رمز برمجي:
    function MPR(o)
    {
        var w2 = 0, i = 0, j = 0, tw = 0,
        p = o.parentNode,
        w = parseInt(YD.getStyle(p, 'width'), 10),
        h = p.offsetHeight;

        tw = Math.round(w / 8);
        for (j = (w - tw); j >= 50; j = j - tw)
        {
            YD.setStyle(p, 'width', j + 'px');

            if (p.offsetHeight > h)
            {
                tw = j + tw;

                break;
            }
        }

        tw -= 4;
        for (i = tw; i >= 50; i = i - 4)
        {
            YD.setStyle(p, 'width', i + 'px');

            if (p.offsetHeight > h)
            {
                w2 = 4 + i;
                YD.setStyle(p, 'width', w2 + 'px');
                break;
            }
        }
    }
هذا التكرار للرمز البرمجي لم أحلم به :-), و من خلاله تمكنت من أن اختصر زمن التنفيذ من أربع ثوانٍ إلى 4 أجزاء في المئة من الثانية.

كفانا حديثاً بالطلاسم و التي لا تعني الكثير لغير المبرمجين, و لنسرد لكم المزايا الأساسية ملخصة على النحو التالي:
  • جميع النوافذ تحوي على زر معاينة للروابط المدرجة بها.
  • زر MP3 و مشغل خاص به. يعمل على أي نظام تشغيل و في أي متصفح عالمي.
  • زر RealPlayer لإدراج ملفات RM, RAM, RMV.
  • زر إدراج ملفات Media لإدراج AVI, MPEG,WMA.WMV... الخ.
  • زر إدراج ملفات فلاش, مع خاصية تحديد عرض أقصى لها.
  • زر إدراج مقاطع YouTube, مع إمكانية تحويل الروابط تلقائياُ عند إدراجها في المحرر و استخدام مشغلات خاصة تزيل رابط العودة إلى موقع YouTube.
  • زر تنسيق القصائد الشعرية, متوافق مع كافة المتصفحات.
  • زر إدراج المعادلات الرياضية.
  • مفكرة العضو, مدعمة بخاصيتي إدراج ما تحويه إلى المحرر و جلب ما به إليها.
  • زر تحويل الحروف الإنجليزية إلى عربية, مع التعرف على الوسوم الخاصة بالمحرر و عدم المساس بها.
  • زر خاص بإزالة جميع أنواع الوسوم بالمحرر.
  • تركيب سهل, فقط رفع للملفات (و التي تتم في الغالب عن طريق بلص إلى موقع العميل) و استيراد المنتج, و بعدها سيعمل بشكل مباشر.
  • إمكانية تعطيل أي خاصية بالمحرر, من خلال لوحة تحكم بسيطة و أنيقة.
  • جميع وظائف المنتج تعمل على أي متصفح عالمي.
  • استخدام أقل رموز و عمليات برمجية تساهم في سرعة تحميل و فتح الصفحة بشكل كبير.
  • تحميل العناصر المطلوبة فقط, مما يساهم ذلك من تقليل زمن التحميل و استهلاك معدل نقل البيانات للموقع.
  • واجهة صديقة بسيطة جداً للمستخدم, تمكنه من التنقل بين الخيارات ببساطة و سهولة كبيرة.
  • لا يوجد بالمنتج أي استعلام أياً كان نوعه.
  • كل الرموز البرمجية تم اختبارها عدة مرات ليتم التأكد من أنها لا تسبب أي ضغط من أي نوع على الخادم أو حتى التسبب بتعليق المتصفح.

خيارات المنتج
اضغط على الصورة لرؤيتها بحجمها الطبيعي

و التالي عبارة عن صورة لكل وضيفة متبوعة بمثال قدر المستطاع:

ملف MP3

اضغط على الصورة لرؤيتها بحجمها الطبيعي

بدون عنوان للملف


مع عنوان للملف

صوت عصفور

------------------------

ملف RealPlayer

اضغط على الصورة لرؤيتها بحجمها الطبيعي

بدون عنوان للملف


مع عنوان للملف

صوت عصفور

------------------------

ملف وسائط

اضغط على الصورة لرؤيتها بحجمها الطبيعي

بدون عنوان للملف


مع عنوان للملف

صوت عصفور

------------------------

ملف Flash

اضغط على الصورة لرؤيتها بحجمها الطبيعي


------------------------

مقطع فيديو من youtube

اضغط على الصورة لرؤيتها بحجمها الطبيعي


------------------------

تنسيق قصيدة شعرية

اضغط على الصورة لرؤيتها بحجمها الطبيعي

إذا غامَرْتَ في شَرَفٍ مَرُومِ  
  فَلا تَقنَعْ بما دونَ النّجومِ
فطَعْمُ المَوْتِ في أمْرٍ حَقِيرٍ  
  كطَعْمِ المَوْتِ في أمْرٍ عَظيمِ

------------------------

معادلة رياضية

نكتب مثلاً المعادلات التالية:

pi=sum{n=0}{+infty}{{(n!)^2 2^{n+1}}/{(2n+1)!}}
pi=22/7-int{0}{1}{{x^4 (1-x)^4}/{1+x^2}dx}
pi=3/4 sqrt{3}+24 int{0}{1/4}{sqrt{x-x^2}dx}

نحددهن و نضغط على الزر , ثم تصبح المخرجات على الشكل التالي:

pi=sum{n=0}{+infty}{{(n!)^2 2^{n+1}}/{(2n+1)!}}

pi=22/7-int{0}{1}{{x^4 (1-x)^4}/{1+x^2}dx}

pi=3/4 sqrt{3}+24 int{0}{1/4}{sqrt{x-x^2}dx}

------------------------

مفكرة العضو

اضغط على الصورة لرؤيتها بحجمها الطبيعي


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

و كخاتمة, فإن للأشياء الصغيرة قوة تظهر عندما تمزج مع بعضها البعض. و عندما تكون الواحدة منها قد بنيت بإتقان, فإنها تشكل مجتمعة شيئاً يوازي في إتقانه قيمة تتعدى ضعف إتقان كل أجزائه الصغيرة, حيث أن المعادلة الرياضية التي تتمثل بـ ( 1 + 1 = 2 ) لا تنطبق عليها. فالبحر تشكل من قطرة, و العسل اجتهدن به ألاف النحلات. فنشكر جميع العملاء الذين لم يتركوا صغيرة و لا حتى كبيرة إلا و لفتوا انتباهنا إليها, بالإضافة إلى أعضائهم الذين لا يقلّون روعةً عنهم باستثمارهم للكثير من أوقاتهم الغالية عليهم في التواصل معنا و إبداء آرائهم حول هذا المنتج, فشكراً لكم مجتمعين على كل صغيرة و كبيرة تقدمتم بها لبلص و لمحررها.

دمتم بالسلامة.
كتبت فيبلص, ‏المنتجات
المشاهدات 4863 التعليقات 10 Email Blog Entry
إجمالي التعليقات 10

التعليقات

  1. Old Comment
    مبارك عليك الشهر الفضيل يا أستاذ هاني وكل عام وأنتم بخير ..
    وأبارك لكم أيضا على هذا التطور في المنتج الجميل ( محرر بلص ) متمنياً لكم مزيداً من التوفيق والتطور .
    ABUSAIF كتبه بتاريخ 23/08/2009 الساعة 2:22 ص ABUSAIF غير متصل
  2. Old Comment
    صورة د.الشبكة الرمزية
    ما شاء الله بالتوفيق يا هاني

    وبإنتظار باقي الإبدااااعات
    د.الشبكة كتبه بتاريخ 23/08/2009 الساعة 3:47 ص د.الشبكة غير متصل
  3. Old Comment
    استـاذ بكل ما تعنيه الكلمة من معنى ..

    مبارك عليك الشهر و يسرّ الله لك قيامه و صيامه

    و اتمنى ان نرى دروس برمجية
    صقر كتبه بتاريخ 23/08/2009 الساعة 4:42 ص صقر غير متصل
  4. Old Comment
    صورة البدو الرمزية
    ابداع × ابداع يا ابوسعد
    البدو كتبه بتاريخ 31/08/2009 الساعة 1:11 ص البدو غير متصل
  5. Old Comment
    ما شاء الله تبارك الرحمن,,,

    ما كنت اعلم بمدى مرونة الجافا سكربت بالشكل هذا,,,

    الله يوفقك,,,
    من ارض الغربة كتبها بتاريخ 02/09/2009 الساعة 5:40 م
  6. Old Comment
    ما شاء الله تبارك الله

    الله يعطيك العافية يا ابو سعد بحق انت انسان رائع و متمكن الله يحفظك
    medicalacademy كتبه بتاريخ 06/09/2009 الساعة 6:19 م medicalacademy غير متصل
  7. Old Comment
    صورة هاني الرمزية
    بارك الله فيكم على هذه الردود الطيبة
    هاني كتبه بتاريخ 07/09/2009 الساعة 6:30 ص هاني غير متصل
  8. Old Comment

    ماشاء الله

    كل عام وانتم بخير

    يعطيك العافية على المحرر

    شغل متعوب عليه ماشاء الله
    عابر سبيل كتبها بتاريخ 15/09/2009 الساعة 2:32 ص
  9. Old Comment
    ماشاء الله ^_^
    ابداع × ابداع يا ابوسعد
    الليل الصامت كتبه بتاريخ 05/10/2009 الساعة 3:29 م الليل الصامت غير متصل
  10. Old Comment
    >> السلام عليكم ورحمة من الله وبركاته

    مـاشآء الله تبآرك الله .. حقيقة محرر جميل جداً

    ومن أروعـ مارأيت .. بارك الله بك أخي الكريم أبى سعد

    ونفعـ المولى بما تقدم للجميع

    ,,
    مسلمة كتبه بتاريخ 22/03/2010 الساعة 2:42 ص مسلمة غير متصل
كتابة تعليق كتابة تعليق
مجموع التعقبات 0

التعقبات



كافة الحقوق محفوظة لبلص© 2006 - 2010, ماعدا العلامات التجارية المسجلة لغيرنا, فهي محفوظة لأصحابها.