ابن سعید
خادم
السلام علیکم!
یہاں میں جاوا اسکرپٹ کے ذریعہ ویب سائٹ تھیمز میں دائیں سے بائیں رخ پھیرنے کے امکانات کا جائزہ لینا چاہتا ہوں اور احباب کی رائے کے بعد اگر فیزیبل ہوا اور وقت نے اجازت دیا تو ان خطوط پر کام کرنے کا ارادہ بھی رکھتا ہوں۔
مجھے یقین ہے کہ اس رخ پر سوچنے والا میں پہلا یا اکیلا شخص نہیں ہوں۔ مزید لوگوں نے بھی ایسی کوششیں ضرور کی ہوں گی پر باوجود تلاش کے ایسے مواد پانے میں ناکام رہا۔
موٹیویشن:
اکثر احباب کو اپنے اردو بلاگ کے تھیم کے حوالے سے خصوصاً اس کی دائیں سے بائیں رخ پھیرنے والے مسئلے کو لیکر حیران پریشان پایا ہے۔ اور اعداد و شمار کے جائزہ لینے کے بعد اس نتیجے پر پہونچا ہوں کہ ایسے صارفین کی تعداد بہت ہی قلیل ہے جو جاوا اسکرپٹ غیر فعال کر کے براؤزر استعمال کرتے ہیں۔ لہٰذا ایک ایسے جاوا اسکرپٹ پلگ ان کا استعمال قطعی مناسب ہوگا جو ڈائنامیکلی کسی بھی ویب سائٹ تھیم کا رخ پھیر سکے۔
موجودہ ٹرینڈ:
آر ٹی ایل سپورٹ دینے کا موجودہ ٹرینڈ خاصہ تکلیف دہ اور وقت طلب ہے اور ایچ ٹی ایم ایل و سی ایس ایس میں کافی مہارت کا متقاضی ہے۔ جسے تبدیلیاں کر کر کے نتائج دیکھ کر کیا جاتا ہے۔ بھلا ہو فائر بگ کا جو اس کام میں بہت معاون ثابت ہوتا ہے۔ اس کے علاوہ کچھ اسکرپٹس بھی دستیاب ہیں جو بعض کامپلیکس ایگوریتھمز کا استعمال کرکے دی گئی ایچ ٹی ایم ایل اور سی ایس ایس فائلوں میں خاطر خواہ ان لائن تبدیلیاں کر دیتے ہیں۔ پر یہ طریقہ صد فیصد کامیاب نہیں ہے۔ اور درستگی کے لئے مزید سر مارنے کی ضرورت پڑتی ہے۔ اس قسم کے ایلگورتھم میں سب سے بڑی مصیبت سی ایس ایس پراپرٹیز لکھنے کی بے شمار طریقے ہونا ہے۔ تھیم میں شامل امیجیز مزید مسائل پیدا کرتی ہیں۔ حال ہی میں میں نے سی ایس ایس اوور رائڈنگ کے طریقے کی بابت بھی ذکر کیا تھا جس میں موجودہ سی ایس ایس فائل کے نیچے ایک اور سی ایس ایس فائل شامل کیا جاتا ہے اور جن پراپرٹیز کی قدریں بدلنی ہو تی ہیں انھیں اس میں شامل کیا جاتا ہے اس طرح براؤزر انٹرپریٹ کرتے ہوئے بعد میں آنے والے قاعدے کو حتمی مانتا ہے اور پچھلے کو منسوخ گردانتا ہے۔ پر یہ طریقہ بھی خاصہ وقت طلب ہوتا ہے اور بعض حالات میں مشکل بھی۔ اور میں ذاتی طور پر اس طریقے کو ان لائن تدوین سے بہتر گردانتا ہوں۔
جاوا اسکرپٹ اپروچ:
اس تدبیر میں ایک عدد جاوا اسکرپٹ فائل rtl.js ڈاکیومینٹ ہیڈ میں شامل کر کے اس میں موجود سمت تبدیل کرنے والا فنکشن DOM لوڈ ہونے کے بعد ایکزیکیوٹ کرایا جا سکتا ہے جو تمام ایچ ٹی ایم ایل ایلیمینٹس کی مخصوص پراپرٹیز میں تبدیلیا کر دے۔ اگر دیکھا جائے تو ایس تبدیلیاں صرف چند ایک پراپرٹیز میںکرنے کی ضرورت ہوتی ہے۔ مثلاً
text-align, align, direction, float, border, padding, margin
ان پراپرٹیز میں بھی top اور bottom قدروں کو بدلنے کی ضرورت نہیں صرف right اور left قدروں کو ایک دوسرے سے تبدیل کرنے کی ضرورت ہوتی ہے۔ جنھیں DOM لوڈ ہونے کے بعد جاوا اسکرپٹ کے ذریعہ پڑھ کر تبدیل کیا جا سکتا ہے۔ واضح رہے کے اس طرح کی ویلو سویپنگ کے لئے ایک عارضی ویریبل کی بھی ضرورت ہوگی۔
جاوا اسکرپٹ اپروچ کے فوائد:
- ایک ہی فائل ہر تھیم کے لئے یکساں کار گر ہوگی۔
- ورڈ پریس میں بطور پلگ ان شامل کیا جا سکے گا۔
- اس طرح کی اسکرپٹ بطور بک مارکلیٹ ابھی استعمال کی جا سکے گی۔
- کچھ سیٹنگ ویریبلز کے ذریعہ بعض تبدلیوں کو کسٹمائز بھی کیا جا سکے گا مثلاً بعض لوگوں کو سائڈ بار کا الائنمینٹ بدلنا پسند نہیں ہوتا۔
- سمت تبدیل کرنے کے ساتھ ساتھ فانٹ وغیرہ اوور رائڈ کرنے کے بھی امکانات ہو سکتے ہیں، بدرجہ احسن کسی کنفیگیوریشن ویریبل کی مدد سے۔
جاوا اسکرپٹ اپروج کے مسائل:
- سبھی جاوا اسکرپٹ فعال نہیں رکھتے۔
> لیکن ایسوں کی تعداد نہ کے برابر ہے اس لئے یہ مسئلہ زیادہ پریشان کن نہیں۔
- امیج رچ تھیمز۔
> ابتداء میں امیجیز سے پاک تھیمز پر تجربے کیئے جا سکتے ہیں بعد میں آر ٹی ایل اسپیسفک امیجز کا رخ پھیر کر ان کی فائلیں محفوظ کرکے انھیں بھی شامل کیا جا سکتا ہے۔
- انہیرٹینس کے باعث تبدیلی در تبدیلی۔ یعنی بعض ایلیمینٹس کی کچھ پراپرٹیز پیرینٹ ایلیمینٹ سے انہیرٹیڈ ہو تی ہیں اور پیرینٹ میں تبدیلی کرنے کے بعد چائلڈ ایلیمینٹ میں بھی وہ تبدیلی رو نما ہو چکی ہوتی ہے اور چائلڈ ایلیمینٹ میں دوبارہ تبدیلی اسے اس کی پہلی حالت میں لے آئے گی۔
> اس مسئلے کے دو حل نظر میں آ رہے ہیں۔ پہلا یہ کہ پورے ڈاکیومینٹ کے تمام ایلیمینٹس کی مخصوص پراپرٹیز کو ایک عارضی آبجیکٹ میں بطور ریپلیکا محفوظ کر لیا جائے۔ اور بعد اسے ریفرینس مان کر ڈاکیومینٹ میں تبدیلیاں کی جائیں۔ اس طرح ہم ہر بار ہر ایلیمینٹ کی اصلی ابتدئی قدر سے موازنہ کر سکیںگے۔ دوسرا بہتر حل یہ ہے کہ DOM ٹری کو باٹم اپ ایپروچ سے ایکسس کر کے تبدیل کیا جائے۔ اور اس کا سب سے بہتر طریقہ ریکرسیو recursive ٹریورسل ہوگا۔ اس طرح پہلے چائلڈ ایلیمینٹس کی پراپرٹیز تبدیل کی جائیںگی اور بعد میںپیرینٹ کی۔ اور یوں انہیریٹینس کے باعث آنے والے ممکنہ مسئلے سے بچا جا سکے گا۔
- ملٹیپل سیلیکٹرز کے باعث اوور رائڈنگ کا مسئلہ۔ یعنی ایک ہی ایلیمینٹ کئی سی ایس ایس سیلیکٹرس کا ٹارگیٹ ہو سکتا ہے۔ مثلاً tag, class یا id میںسے ایک سے زائد کے لئے سی ایس ایس رولز موجود ہوں جو کی کسی ایک ہی ایلیمنٹ آبجیکٹ پر اثر انداز ہو رہے ہوں۔ اور ان میں سے کنھیں دو میں یکساں تبدیلی اوور رائڈ ہو کر تبدیلی کا اثر زائل کر بیٹھے۔
> اس مسئلے کا واضح حل میرے دماغ میں فی الحال موجود نہیں۔ ہاں سی ایس ایس رولز کی پرایورٹی قانون کو سامنے رکھ کر شاید اس مسئلئ کا حل نکالا جا سکتا ہے۔ اس طرح کے زیادہ اسپیسفک رول کو بعد میں تبدیل کیا جائے۔ خیر تجربہ کرنے سے قبل کچھ کہنا مشکل ہوگا۔ ویسے مجھے لگتا ہے کہ اس میںبعض جاوا اسکرپٹ اور DOM پیچیدگیا مشکل پیدا کریں گی۔ مثلاً یہ جاننا کہ کوئی پراپرٹی ان لائن ڈیفائن ہے یا خارجی سی ایس ایس سے۔ واضح رہے کہ ہم ایچ ٹی ایم ایل ڈاکیومینٹ یا سی ایس ایس فائل کے کنٹینٹ پڑھ کر تبدیلایں نہیںکر رہے بلکہ لوڈیڈ ڈوم کو پڑھ کر تبدیلیاں کر رہے ہیں اس لئے شاید یہ مسئلہ سرے سے آئے ہی نہ بلکہ ڈوم میں وہ اوور رائڈنگ اور پرایورٹی سے متعلق ساری انالسس پہلے سے ہو چکی ہوتی ہے۔
- رن ٹائم میں آنے والی تبدیلیاں جو کسی دوسرے جاوا اسکرپٹ کے باعث رو نما ہوں۔
> قیاس ہے کہ ایسی تبدیلیاں کم ہی تھیمز میں ہوتی ہیں۔ اور اگر ہوئیں بھی تو ان میں دائیں بائیں سے متعلق تبدیلیاں مزید کم ہونگی جنھیں ابتدائی مرحلے میں اگنور کیا جا سکتا ہے۔ بعد میں مخصوص ایوینٹ ہینڈلرز کے ذریعہ شاید ایسی تبدیلیوں کو بھی کنٹرول کیا جا سکے۔
اتدائی ایلگورتھم
حرف آخر
امید ہے کہ احباب ان خطوط پر غور کریںگے اور ممکن ہوا تو تجربے بھی کریں گے۔ نیز اپنی قیمتی رائے سے آگاہ کریں گے۔ اس پورے پراسیس میں جہاں کہیں بھی خامیاں اور بہتری کے امکان ہوں اس پر تجزیہ ضرور کیجئے۔
والسلام
--
ابن سعید
یہاں میں جاوا اسکرپٹ کے ذریعہ ویب سائٹ تھیمز میں دائیں سے بائیں رخ پھیرنے کے امکانات کا جائزہ لینا چاہتا ہوں اور احباب کی رائے کے بعد اگر فیزیبل ہوا اور وقت نے اجازت دیا تو ان خطوط پر کام کرنے کا ارادہ بھی رکھتا ہوں۔
مجھے یقین ہے کہ اس رخ پر سوچنے والا میں پہلا یا اکیلا شخص نہیں ہوں۔ مزید لوگوں نے بھی ایسی کوششیں ضرور کی ہوں گی پر باوجود تلاش کے ایسے مواد پانے میں ناکام رہا۔
موٹیویشن:
اکثر احباب کو اپنے اردو بلاگ کے تھیم کے حوالے سے خصوصاً اس کی دائیں سے بائیں رخ پھیرنے والے مسئلے کو لیکر حیران پریشان پایا ہے۔ اور اعداد و شمار کے جائزہ لینے کے بعد اس نتیجے پر پہونچا ہوں کہ ایسے صارفین کی تعداد بہت ہی قلیل ہے جو جاوا اسکرپٹ غیر فعال کر کے براؤزر استعمال کرتے ہیں۔ لہٰذا ایک ایسے جاوا اسکرپٹ پلگ ان کا استعمال قطعی مناسب ہوگا جو ڈائنامیکلی کسی بھی ویب سائٹ تھیم کا رخ پھیر سکے۔
موجودہ ٹرینڈ:
آر ٹی ایل سپورٹ دینے کا موجودہ ٹرینڈ خاصہ تکلیف دہ اور وقت طلب ہے اور ایچ ٹی ایم ایل و سی ایس ایس میں کافی مہارت کا متقاضی ہے۔ جسے تبدیلیاں کر کر کے نتائج دیکھ کر کیا جاتا ہے۔ بھلا ہو فائر بگ کا جو اس کام میں بہت معاون ثابت ہوتا ہے۔ اس کے علاوہ کچھ اسکرپٹس بھی دستیاب ہیں جو بعض کامپلیکس ایگوریتھمز کا استعمال کرکے دی گئی ایچ ٹی ایم ایل اور سی ایس ایس فائلوں میں خاطر خواہ ان لائن تبدیلیاں کر دیتے ہیں۔ پر یہ طریقہ صد فیصد کامیاب نہیں ہے۔ اور درستگی کے لئے مزید سر مارنے کی ضرورت پڑتی ہے۔ اس قسم کے ایلگورتھم میں سب سے بڑی مصیبت سی ایس ایس پراپرٹیز لکھنے کی بے شمار طریقے ہونا ہے۔ تھیم میں شامل امیجیز مزید مسائل پیدا کرتی ہیں۔ حال ہی میں میں نے سی ایس ایس اوور رائڈنگ کے طریقے کی بابت بھی ذکر کیا تھا جس میں موجودہ سی ایس ایس فائل کے نیچے ایک اور سی ایس ایس فائل شامل کیا جاتا ہے اور جن پراپرٹیز کی قدریں بدلنی ہو تی ہیں انھیں اس میں شامل کیا جاتا ہے اس طرح براؤزر انٹرپریٹ کرتے ہوئے بعد میں آنے والے قاعدے کو حتمی مانتا ہے اور پچھلے کو منسوخ گردانتا ہے۔ پر یہ طریقہ بھی خاصہ وقت طلب ہوتا ہے اور بعض حالات میں مشکل بھی۔ اور میں ذاتی طور پر اس طریقے کو ان لائن تدوین سے بہتر گردانتا ہوں۔
جاوا اسکرپٹ اپروچ:
اس تدبیر میں ایک عدد جاوا اسکرپٹ فائل rtl.js ڈاکیومینٹ ہیڈ میں شامل کر کے اس میں موجود سمت تبدیل کرنے والا فنکشن DOM لوڈ ہونے کے بعد ایکزیکیوٹ کرایا جا سکتا ہے جو تمام ایچ ٹی ایم ایل ایلیمینٹس کی مخصوص پراپرٹیز میں تبدیلیا کر دے۔ اگر دیکھا جائے تو ایس تبدیلیاں صرف چند ایک پراپرٹیز میںکرنے کی ضرورت ہوتی ہے۔ مثلاً
text-align, align, direction, float, border, padding, margin
ان پراپرٹیز میں بھی top اور bottom قدروں کو بدلنے کی ضرورت نہیں صرف right اور left قدروں کو ایک دوسرے سے تبدیل کرنے کی ضرورت ہوتی ہے۔ جنھیں DOM لوڈ ہونے کے بعد جاوا اسکرپٹ کے ذریعہ پڑھ کر تبدیل کیا جا سکتا ہے۔ واضح رہے کے اس طرح کی ویلو سویپنگ کے لئے ایک عارضی ویریبل کی بھی ضرورت ہوگی۔
جاوا اسکرپٹ اپروچ کے فوائد:
- ایک ہی فائل ہر تھیم کے لئے یکساں کار گر ہوگی۔
- ورڈ پریس میں بطور پلگ ان شامل کیا جا سکے گا۔
- اس طرح کی اسکرپٹ بطور بک مارکلیٹ ابھی استعمال کی جا سکے گی۔
- کچھ سیٹنگ ویریبلز کے ذریعہ بعض تبدلیوں کو کسٹمائز بھی کیا جا سکے گا مثلاً بعض لوگوں کو سائڈ بار کا الائنمینٹ بدلنا پسند نہیں ہوتا۔
- سمت تبدیل کرنے کے ساتھ ساتھ فانٹ وغیرہ اوور رائڈ کرنے کے بھی امکانات ہو سکتے ہیں، بدرجہ احسن کسی کنفیگیوریشن ویریبل کی مدد سے۔
جاوا اسکرپٹ اپروج کے مسائل:
- سبھی جاوا اسکرپٹ فعال نہیں رکھتے۔
> لیکن ایسوں کی تعداد نہ کے برابر ہے اس لئے یہ مسئلہ زیادہ پریشان کن نہیں۔
- امیج رچ تھیمز۔
> ابتداء میں امیجیز سے پاک تھیمز پر تجربے کیئے جا سکتے ہیں بعد میں آر ٹی ایل اسپیسفک امیجز کا رخ پھیر کر ان کی فائلیں محفوظ کرکے انھیں بھی شامل کیا جا سکتا ہے۔
- انہیرٹینس کے باعث تبدیلی در تبدیلی۔ یعنی بعض ایلیمینٹس کی کچھ پراپرٹیز پیرینٹ ایلیمینٹ سے انہیرٹیڈ ہو تی ہیں اور پیرینٹ میں تبدیلی کرنے کے بعد چائلڈ ایلیمینٹ میں بھی وہ تبدیلی رو نما ہو چکی ہوتی ہے اور چائلڈ ایلیمینٹ میں دوبارہ تبدیلی اسے اس کی پہلی حالت میں لے آئے گی۔
> اس مسئلے کے دو حل نظر میں آ رہے ہیں۔ پہلا یہ کہ پورے ڈاکیومینٹ کے تمام ایلیمینٹس کی مخصوص پراپرٹیز کو ایک عارضی آبجیکٹ میں بطور ریپلیکا محفوظ کر لیا جائے۔ اور بعد اسے ریفرینس مان کر ڈاکیومینٹ میں تبدیلیاں کی جائیں۔ اس طرح ہم ہر بار ہر ایلیمینٹ کی اصلی ابتدئی قدر سے موازنہ کر سکیںگے۔ دوسرا بہتر حل یہ ہے کہ DOM ٹری کو باٹم اپ ایپروچ سے ایکسس کر کے تبدیل کیا جائے۔ اور اس کا سب سے بہتر طریقہ ریکرسیو recursive ٹریورسل ہوگا۔ اس طرح پہلے چائلڈ ایلیمینٹس کی پراپرٹیز تبدیل کی جائیںگی اور بعد میںپیرینٹ کی۔ اور یوں انہیریٹینس کے باعث آنے والے ممکنہ مسئلے سے بچا جا سکے گا۔
- ملٹیپل سیلیکٹرز کے باعث اوور رائڈنگ کا مسئلہ۔ یعنی ایک ہی ایلیمینٹ کئی سی ایس ایس سیلیکٹرس کا ٹارگیٹ ہو سکتا ہے۔ مثلاً tag, class یا id میںسے ایک سے زائد کے لئے سی ایس ایس رولز موجود ہوں جو کی کسی ایک ہی ایلیمنٹ آبجیکٹ پر اثر انداز ہو رہے ہوں۔ اور ان میں سے کنھیں دو میں یکساں تبدیلی اوور رائڈ ہو کر تبدیلی کا اثر زائل کر بیٹھے۔
> اس مسئلے کا واضح حل میرے دماغ میں فی الحال موجود نہیں۔ ہاں سی ایس ایس رولز کی پرایورٹی قانون کو سامنے رکھ کر شاید اس مسئلئ کا حل نکالا جا سکتا ہے۔ اس طرح کے زیادہ اسپیسفک رول کو بعد میں تبدیل کیا جائے۔ خیر تجربہ کرنے سے قبل کچھ کہنا مشکل ہوگا۔ ویسے مجھے لگتا ہے کہ اس میںبعض جاوا اسکرپٹ اور DOM پیچیدگیا مشکل پیدا کریں گی۔ مثلاً یہ جاننا کہ کوئی پراپرٹی ان لائن ڈیفائن ہے یا خارجی سی ایس ایس سے۔ واضح رہے کہ ہم ایچ ٹی ایم ایل ڈاکیومینٹ یا سی ایس ایس فائل کے کنٹینٹ پڑھ کر تبدیلایں نہیںکر رہے بلکہ لوڈیڈ ڈوم کو پڑھ کر تبدیلیاں کر رہے ہیں اس لئے شاید یہ مسئلہ سرے سے آئے ہی نہ بلکہ ڈوم میں وہ اوور رائڈنگ اور پرایورٹی سے متعلق ساری انالسس پہلے سے ہو چکی ہوتی ہے۔
- رن ٹائم میں آنے والی تبدیلیاں جو کسی دوسرے جاوا اسکرپٹ کے باعث رو نما ہوں۔
> قیاس ہے کہ ایسی تبدیلیاں کم ہی تھیمز میں ہوتی ہیں۔ اور اگر ہوئیں بھی تو ان میں دائیں بائیں سے متعلق تبدیلیاں مزید کم ہونگی جنھیں ابتدائی مرحلے میں اگنور کیا جا سکتا ہے۔ بعد میں مخصوص ایوینٹ ہینڈلرز کے ذریعہ شاید ایسی تبدیلیوں کو بھی کنٹرول کیا جا سکے۔
اتدائی ایلگورتھم
کوڈ:
TRAVERSE(document.body)
function TRAVERSE(obj) begin
if (obj.children?) do
for_each child do
TRAVERSE(child)
end
end
CHANGE(obj)
end
function CHANGE(obj) begin
target_properties = [text-align, align, direction, float, border, padding, margin ...]
if (obj.visible_element?)
for_each target_properties as TP do
SWAP(obj.TP-left, obj.TP-right)
end
end
end
function SWAP(a, b) begin
temp = a
a = b
b = temp
return a, b
end
حرف آخر
امید ہے کہ احباب ان خطوط پر غور کریںگے اور ممکن ہوا تو تجربے بھی کریں گے۔ نیز اپنی قیمتی رائے سے آگاہ کریں گے۔ اس پورے پراسیس میں جہاں کہیں بھی خامیاں اور بہتری کے امکان ہوں اس پر تجزیہ ضرور کیجئے۔
والسلام
--
ابن سعید