متن دوسویه در وب ۱: چیستی، چرایی، چگونگی

ما فارسی‌زبانان بارها با مشکل عدم نمایش صحیح متن‌های فارسی در محیط‌های دیجیتال مواجه شده‌ایم. یکی از این مشکلات، عدم نمایش متن فارسی در جهت صحیح است. در این مطلب در این باره می‌نویسم.

موضوعی که در این مقاله می‌خواهم درباره آن بنویسم موضوعی تخصصی است. این موضوع نه به واسطه تحصیلات آکادمیک بلکه به واسطه مواجهه در فضای عملی به خصوص در فضای وب برای من جذابیت پیدا کرده است. لذا این مقاله نه از جانب یک متخصص بلکه از موضع شخصی است که در لااقل دو-سه سال گذشته با این موضوع به دفعات مواجه بوده و راه‌کارهایی را با آزمون و خطا به دست آورده است که به نظر می‌رسد در عمل می‌توانند مشکلات کاربران زبان‌های راست به چپ و بخصوص کسانی که محتوا به زبان‌های ترکیبی تولید می‌کنند را رفع کند. در این مدت فعالیت‌های مختلفی انجام داده‌ام که از بین آن‌ها می‌توانم به مشارکت فنی و مشاوره‌ای برای افزودن پشتیبانی متن دوسویه به پروژه‌های متعددی ازجمله ماستودون، invidious، پلوم، Sengi و… اشاره کنم.

انگیزهٔ اصلی من برای نوشتن این مطلب، فقدان هر گونه محتوای قابل استفاده و عملی در این خصوص در فضای وب بوده است. از دوستانی که در این زمینه دانش و تخصص دارند درخواست می‌کنم که موارد محل اشکال در این مقاله را گوش‌زد و اصلاح کرده و کمک کنند به غنی‌تر شدن فضای محتوای وب فارسی و حتی انگلیسی برای ارائه راه‌کارهایی جهت رفع مشکلات متعددی که ما فارسی زبان و یا افراد دارای زبان‌های راست به چپ در فضای دیجیتال با آن مواجه می‌شویم.

متن دوسویه چیست؟

قبل از اینکه بخواهم در مورد متن دوسویه صحبت کنیم لازم است که قدری در مورد تفاوت متن ساده و متن غنی مطالبی بنویسم. وقتی از متن غنی صحبت می‌کنیم در واقع درباره متنی حرف می‌زنیم که حاوی نشانه‌گذاری‌های متعددی است که می‌تواند ویژگی‌هایی همچون رنگ، ضخامت، اندازه و غیره را به متن اعمال کند. پردازش‌گرهایی مانند لیبره آفیس رایتر (Libre Office Writer) و یا مایکروسافت آفیس ورد مثال هایی هستند از ویرایشگرهای متن‌های غنی.

هرچند متن‌های غنی همان طور که از اسم‌شان روشن است امکان تولید متن‌های پیچیده با ویژگی‌های متعدد را به ما می‌دهند اما کار با آن ها مستلزم استفاده از نرم افزارهای خاصی است. در موارد زیادی، از دنیای برنامه‌نویسی گرفته تا فضاهای انتشار محتوا در شبکه‌های اجتماعی یا حتی پیام‌رسان‌ها، ما امکان استفاده از متن غنی را نداریم. متن هایی که در شبکه‌های اجتماعی، پیام‌رسانه و حتی بسیاری از وبلاگ‌ها منتشر می‌کنیم متنی ساده هستند.

متن ساده چندین ویژگى مهم دارد. پیش از هر چیز کل محتوا همان متنی است که نوشته می‌شود نه چیزی فراتر از آن. نه رنگی مشخص می‌شود نه اندازه‌ای نه هیچ ویژگی دیگری. همچنین به واسطه ساده بودن محتوا و تمرکز متن ساده روی خود محتوا، امکان نمایش آن به شکل‌های مختلف در پردازش‌گرها یا نمایش دهندگان مختلف وجود دارد. در نهایت در مواردی استفاده از متن ساده به ما این کمک را می‌کند که بین متنی که در ویرایش‌گر می‌بینیم و متنی که نهایتا نمایش داده می‌شود، هم‌خوانی وجود داشته باشد.

یکی از ویژگی‌هایی که برای نمایش متن باید استفاده شود ویژگی جهت متن است. اگر از پردازش‌گرهای متون غنی استفاده کرده باشید حتما دیده‌اید که گزینه‌ای برای تعیین جهت متن به صورت راست به چپ یا چپ به راست وجود دارد. در این حالت، نویسنده به طور صریح اعلام می‌کند که این تکه از نوشته بایستی در این جهت دقیقا مشخص شده نمایش یابد. به لطف وجود این ویژگی در متن‌های غنی، می‌توان اطمینان حاصل کرد که آن متن در تمام محیط‌ها در جهت مشخص شده توسط نویسنده نمایش می‌یابند. اما وقتی وارد فضای متن ساده می‌شویم طبیعتا از چنین ویژگی برخوردار نیستیم. اینجا هیچ گونه نشان گذاری برای ما وجود ندارد. فقط متن است و متن!

حتی در مواردی پیش می‌آید که ما متنی داریم که در میانهٔ آن متن دیگری با زبانی در جهت مخالف قرار دارد. ما به روش نیاز داریم که بتوانیم در همان محل به طور مشخص جهت درست متن را تشخیص داده و نهایتا متن را در جهت درست نمایش دهیم.

چیزی که مسئول پردازش و تصمیم گیری برای چنین مساله‌ای است متن دوسویه (bidirectional text) یا به اختصار bidi خوانده می‌شود. استفاده از متن دوسویه گسترده است. هدف من در این مقاله ارائه راهکارهایی است که می‌تواند به ما کمک کند در مواردی که با متن ساده مواجه هستیم و ابزاری برای تعیین صریح جهت دقیق متن نداریم، و اطمینان نداریم که متن وارد شده به زبان راست به چپ راست یا چپ به راست بتوانیم این متن را در جهت درست نمایش دهیم.

در ادامه درباره شرایط و چگونگی پیاده سازی متن دو سوی صحبت می‌کنم.

چرا به پشتیبانی از متن دوسویه نیاز داریم؟

در بسیاری از موارد وقتی صحبت از رفع مشکل پشتیبانی فارسی (یا کلا متن‌های راست به چپ) پیش می‌آید، ذهن افراد به سمت پشتیبانی از زبان‌های راست به چپ می‌رود. نتیجه هم اغلب این می‌شود که یک حالت خاص راست به چپ به برنامه اضافه می‌شود. شاید این راهکار برای خیلی از موارد راه‌گشا باشد اما مواردی هستند که چنین کاری در آن‌ها، گره و راهی نمی‌گشاید.

فرض کنید یک شبکه اجتماعی داریم. شبکه اجتماعی بر خلاف اغلب وب‌لاگ‌های شخصی یا شرکتی که محتوای تولیدی آن‌ها مشخص است، کاربران متعدد با پس‌زمینه‌ها،‌علایق و حتی زبان‌های مختلف دارد. روی شبکه‌های اجتماعی هم افراد ممکن است راست به چپ محتوا تولید کنند و هم چپ به راست.

بنابراین یکی از چالش‌های ما در نمایش متن این است که تصمیم بگیریم یک متن مشخص را در جهت راست به چپ یا چپ به راست نمایش دهیم. اما حالت‌های ما فقط به انتشار محتوای با زبان‌ها مختلف در شبکه‌های اجتمای یا پیام‌رسان‌ها محدود نیست. در نظر بگیرید وبلاگی دارید (به خصوص وبلاگ‌های برنامه نویسی) که محتوای آن هم به صورت راست به چپ هم چپ به راست منتشر می‌شوند. نویسنده ممکن است در دو پاراگراف به زبان فارسی بنویسد و در پاراگراف بعدی بخواهد متنی از مستندات یک برنامه را منتشر کند که چپ به راست است. یا حالت را در نظر بگیرید که همین برنامه نویس ما بخواهد در وبلاگ‌اش قطع کدی قرار دهد که همه می‌دانیم نود و نه درصد چپ به راست است.

شاید کسی بگوید که خب کلا تمام قسمت مربوط به کد را چپ به راست می‌کنیم اما وضعیت می‌تواند از این هم پیچیده تر باشد. چه می‌شود اگر در همان قطعه کد، توضیحات یا خطوطی به زبان فارسی قرار داشته باشد؟ اینجاست که اهمیت پردازش متن و تشخیص صحیح جهت متن اهمیت پیدا می‌کند.

و نکته ای که نباید فراموش بکنیم این است که اینجا ما با متن ساده سروکار داریم نه متن غنی! این یعنی ما ابزاری برای اعلام جهت دقیق متن وارد شده نداریم. اینجاست که نیاز به الگوریتمی داریم که به ما راه‌کاری نشان دهد که بر اساس آن بتوانیم به طور قابل پیش‌بینی تصمیم بگیریم که جهت یک متن، راست به چپ باشد یا چپ به راست. و این یکی از مهم‌ترین چیزهایی است که در متن دوسویه به دنبال آن هستیم.

چگونگی

الگوریتم‌ها مختلفی برای بحث متن دوسویه وجود دارد. از آنجایی که تخصصی در این بحث ندارم تنها به دو مورد از آنها اشاره می‌کنم. یکی از الگوریتم‌ها بررسی می‌کند که چه میزان از متن وارد شده در محتوا به زبانی راست به چپ نوشته شده است. یعنی به طور پیش فرض متن را چپ به راست در نظر می‌گیرد مگر آنکه بیش از درصد مشخصی از متن به زبانی راست به چپ نوشته شده باشد. این الگوریتم قبلا در ماستودون استفاده شده بود. در گذشته ماستودون متن هر مطلب را پردازش می‌کرد و چنانچه بیش از سی درصد آن را متن راست به چپ تشکیل می‌داد جهت کلی آن مطلب را راست به چپ می‌کرد.

این روش به واسطه مکانیکی بودن مشکلاتی دارد. تعیین جهت متن می‌تواند خارج از کنترل کاربر و خارج از خواست او باشد. بعنوان مثال کاربری ممکن است جمله کوتاهی به زبان فارسی بنویسد مثلا بنویسد «انیشتین گفته است» و بعد نقل قولی به زبان انگلیسی از اون وارد کند. چیزی که انتظار می‌رود این است که متنی که به زبان فارسی نوشته شده است به صورت راست به چپ و نقل قولی که به زبان انگلیسی نوشته شده است چپ به راست نمایش یابد. اما این الگوریتم یا کل متن را چپ به راست و یا راست به چپ نمایش می‌دهد. و مشکل دیگر این است که پیاده‌سازی این الگوریتم در ویرایش‌گر تقریبا ناممکن است. اولا هیچ ویرایش‌گری تا کنون از چنین الگوریتیمی برای تشخیص جهت متن استفاده نمی‌کند. ثانیا، با توجه به این که جهت کلی متن وابسته به دصد حروف راست به چپ یا چپ به راست در کل متن است، نتیجه محاسبه می‌تواند با ورود هر حرف جدید تغییر کند و این، اصلا تجربه کاربری جالبی ارائه نمی‌کند.

افزون بر این، هیچ معیار مشخصی برای تعیین درصد دقیق محاسبه وجود ندارد. این یعنی که با تغییر درصد در نسخه‌های برنامه و یا در برنامه‌های مختلف، نمایش متن می‌تواند به کلی دگرگون شود. و این اصلا مطلوب نیست. در نهایت، استفاده از این الگوریتم در عمل برای کاربر آسان و قابل فهم نیست.

اما الگوریتم دیگری وجود دارد که کاربران با آن آشنا هستند. این الگوریتم بر اساس اولین نویسه یا حرف (قوی) یک متن عمل می‌کند. بر این اساس اگر اولین نویسه از یک متن به زبان راست به چپ باشد کل آن متن راست به چپ نمایش داده شده و اگر به زبان چپ به راست باشد، چپ به راست نمایش داده می‌شود. به کمک این الگوریتم می‌توان هر بند از متن را در جهت متناسب با اولین نویسهٔ آن متن نمایش داد. این روش روش خوبی است. اول از همه این که کاملا قابل پیش‌بینی است. در این روش کاربرد دقیقا می‌داند که اولین حرفی که وارد می‌کند جهت کل متن را مشخص می‌کند. این می‌تواند به کاربر کمک بکند تا در مواردی با اصلاح جمله‌بندی یا در صورت ضرورت با درج نویسه تعیین جهت، از نمایش متن در جهت درست اطمینان حاصل کند. همچنین داشتن این ویژگی که هر تکه از متن می‌تواند جهت مختصر خود را داشته باشد انعطاف پذیری قابل توجهی به این الگوریتم می‌دهد.

جدایی از ویژگی‌های فنی، این الگوریتم برای بسیاری از کاربران آشنا است. تقریبا همه شبکه‌های اجتماعی و پیام‌رسان‌های موجود از این روش استفاده می‌کنند. لذا اگر از چنین روشی در برنامه‌ها استفاده کنیم کاربر آن را می‌شناسد. از این رو، این روش روشی است که من در پیش می‌گیرم و پیشنهاد می‌کنم که دوستان هم از آن استفاده کنند

در مقاله بعدی درباره افزودن پشتیبانی متن دوسویه در محیط وب صحبت خواهم کرد.