رفتن به محتوا

کارهای پیشین

چند پروژه پیش‌تر بخش‌هایی از این مسئله را هدف گرفته‌اند. پیش از ساختن هر چیزی، کد هر کدام را خواندیم، نه فقط README آن را، و آنچه واقعاً انجام می‌دهد را بر نُه لایهٔ خودمان نگاشتیم.

۱۰پروژه، خوانده‌شده در سطح کد
۰پروژه پهنا را حل کرده (لایهٔ ۳)
۰پروژه به مالتی‌پلکسرها پرداخته (لایهٔ ۸)
۲پروژه فایل مجوز ندارد

پوشش لایه‌ها

هر سطر یک پروژه است و هر ستون یکی از نُه لایهٔ ما. در طول سطر ببینید هر پروژه چه چیزی را پوشش می‌دهد، و در طول ستون ببینید چه کسی به یک لایه پرداخته است.

کاملنیمهغایبدر مخزن نیست
۱رمزگذاری۲ورودی۳پهنا۴شکل‌دهی۵دوجهتی۶مکان‌نما و کپی۷قلم‌ها۸مالتی‌پلکسر۹برنامه‌ها و TUI
RtlTerminal◐نیمه◐نیمه◐نیمه●کامل◐نیمه●کامل◐نیمه·غایب◐نیمه
termenal-web·غایب◐نیمه◐نیمه●کامل◐نیمه●کامل◐نیمه·غایب◐نیمه
termux-app-arabic·غایب·غایب◐نیمه●کامل◐نیمه◐نیمه·غایب·غایب·غایب
Tarminal?در مخزن نیست?در مخزن نیست?در مخزن نیست?در مخزن نیست·غایب?در مخزن نیست◐نیمه·غایب?در مخزن نیست
Terminal-ar·غایب·غایب·غایب◐نیمه◐نیمه◐نیمه◐نیمه·غایب◐نیمه
ar-terminal·غایب◐نیمه·غایب◐نیمه◐نیمه◐نیمه◐نیمه·غایب◐نیمه
estaterm·غایب◐نیمه·غایب◐نیمه◐نیمه·غایب·غایب·غایب◐نیمه
bidiscope·غایب·غایب·غایب◐نیمه◐نیمه◐نیمه·غایب·غایب◐نیمه
fa-console●کامل◐نیمه·غایب◐نیمه◐نیمه◐نیمه◐نیمه·غایب·غایب
rtl-terminal·غایب·غایب·غایب·غایب◐نیمه·غایب·غایب·غایب◐نیمه

پروژه‌ها

رندرکنندهٔ بافر منطقیMIT

RtlTerminal

شبیه‌ساز ترمینال · ویندوز (WPF + ConPTY)

شکل‌دهی
WPF، واژه‌به‌واژه
دوجهتی
حدسی و دست‌ساز

جدی‌ترین کار پیشین: بافر منطقی، کپی منطقی و نگاشت کلیک به جای منطقی. اما دوجهتی‌اش UAX #9 نیست و واژه‌ها را در خانه‌ها فشرده می‌کند.

خواندن یادداشت‌ها ←
رندرکنندهٔ بافر منطقیMIT

termenal-web

ترمینال مرورگر (نمونهٔ اولیه) · مرورگر + Node PTY

شکل‌دهی
HarfBuzz، برای هر تکهٔ یک‌جهته
دوجهتی
سطوح UAX #9؛ جهت پاراگراف با اکثریت

بهترین طرح مرجع: نگاشت منطقی↔دیداری برای هر سطر و کپی منطقی. هستهٔ WASM و رندر WebGPU که ادعا می‌کند در کد نیست.

خواندن یادداشت‌ها ←
رندرکنندهٔ بافر منطقیGPLv3

termux-app-arabic

شبیه‌ساز ترمینال (انشعاب) · اندروید

شکل‌دهی
HarfBuzz سیستم، با کل سطر
دوجهتی
UAX #9 برای هر سطر، پایهٔ LTR

اثبات مفهومی در حدود ۳۰۰ خط، فقط در لایهٔ رندر. لمس و انتخاب به متن منطقی برنمی‌گردند، آزمونی ندارد و همیشه روشن است.

خواندن یادداشت‌ها ←
پوستهMIT

Tarminal

شبیه‌ساز ترمینال (پوستهٔ SwiftTerm) · macOS

شکل‌دهی
کدی در مخزن ندارد
دوجهتی
ندارد

پوسته‌ای بدون هیچ کد عربی، دوجهتی یا پهنای خودش. آنچه باید مطالعه شود خود SwiftTerm است.

خواندن یادداشت‌ها ←
رندرکنندهٔ بافر منطقیبدون مجوز

Terminal-ar

لایهٔ رویی روی xterm.js (Electron) · ویندوز / لینوکس

شکل‌دهی
Chromium، برای هر بخش
دوجهتی
حدسی، برای هر بخش

قابل استفاده نیست (ادعای MIT بدون فایل مجوز). مکان‌نمای آینه‌شده با متن نمی‌خواند و آزمونی ندارد.

خواندن یادداشت‌ها ←
رندرکنندهٔ بافر منطقیبدون مجوز

ar-terminal

لایهٔ رویی VS Code + بازنویسی PTY · VS Code

شکل‌دهی
Chromium / فرم‌های نمایشی
دوجهتی
Blink سطربه‌سطر / bidi-js پخته در متن

قابل استفاده نیست (بدون مجوز). مسیر اصلی کپی را منطقی نگه می‌دارد اما مکان‌نما و انتخاب ناهمخوان‌اند؛ مسیر دوم همان ترفند ترتیب دیداری است.

خواندن یادداشت‌ها ←
بازنویس متنApache-2.0

estaterm

پراکسی PTY · لینوکس

شکل‌دهی
FriBidi ← فرم‌های نمایشی
دوجهتی
UAX #9 (FriBidi)، تکه‌تکه

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

خواندن یادداشت‌ها ←
بازنویس متنMIT

bidiscope

کتابخانه + لایهٔ رویی xterm.js · جاوااسکریپت / مرورگر

شکل‌دهی
جدول دست‌ساز ← فرم‌های نمایشی
دوجهتی
UAX #9 ناقص (بدون BD13)

ایدهٔ درست (لایهٔ رویی بافر را منطقی نگه می‌دارد)، اجرای نادرست. ادعای ۹۹٫۹۱٪ انطباقش اثبات نشده است.

خواندن یادداشت‌ها ←
بازنویس متنMIT

fa-console

پوشش stdout پایتون · کنسول ویندوز

شکل‌دهی
arabic-reshaper ← فرم‌های نمایشی
دوجهتی
python-bidi یا وارونه‌سازی کل سطر

برای لایهٔ ۱ ارزشمند است (راه‌اندازی UTF-8، یکسان‌سازی ي/ك به ی/ک). بخش نمایشش ترفند ترتیب دیداری است و ANSI را خراب می‌کند.

خواندن یادداشت‌ها ←
افزونهٔ پرامپتیMIT

rtl-terminal

افزونهٔ Claude Code (فقط پرامپت) · Claude Code

شکل‌دهی
ندارد
دوجهتی
از مدل می‌خواهد نویسهٔ کنترلی بگذارد

فقط چند فایل Markdown: بدون هوک، بدون تشخیص، بدون هیچ اجبار. ارزش برداشتن: جداسازی مسیرها با LRI…PDI و مجموعه‌آزمونش.

خواندن یادداشت‌ها ←

آنچه این پروژه‌ها به ما می‌گویند

  1. ۱

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

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

  2. ۲

    مسئلهٔ پهنا حل نشده است

    هیچ پروژه‌ای متن شکل‌داده‌شدهٔ فارسی را با شبکهٔ خانه‌ها هماهنگ نمی‌کند؛ گلیف‌ها فشرده، بریده یا سرریز می‌شوند. این پرسش اصلی پژوهش است.

  3. ۳

    مالتی‌پلکسرها: صفر از ده

    همهٔ پیاده‌سازی‌های سمت ترمینال هر سطر فیزیکی را یک پاراگراف دوجهتی می‌گیرند؛ پس در قاب‌بندی tmux یا Zellij، تکه‌های راست‌به‌چپ از مرز قاب‌ها رد می‌شوند. کسی به آن نپرداخته است.

  4. ۴

    کسی بر سر مالکیت دوجهتی توافق نمی‌کند

    همه دوجهتی را بی‌قیدوشرط یا حدسی اعمال می‌کنند، حتی درون برنامه‌های تمام‌صفحه. هیچ‌کدام از حالت‌های صریح پیش‌نویس BiDi in Terminal Emulators استفاده نمی‌کند.

  5. ۵

    ورودی نادیده گرفته شده است

    هیچ پروژه‌ای ترکیب IME، ورود نیم‌فاصله یا حرکت منطقی مکان‌نما هنگام تایپ را مدیریت نمی‌کند.

  6. ۶

    READMEها اغراق می‌کنند

    پنج پروژه بیش از آنچه کدشان دارد ادعا می‌کنند و دو پروژه بدون فایل مجوز ادعای MIT دارند. کارنامهٔ ما اندازه می‌گیرد و ادعا را تکرار نمی‌کند، حتی ادعای خودمان را.

ارزش برداشتن

ازچه چیزیلایه
termenal-webجایگشت colToVisual / visualToCol برای هر سطر؛ شکل‌دهی هر تکهٔ یک‌جهته با جهت صریح۵ · ۶
RtlTerminalانتخاب متن با جای منطقی و نگاشت کلیک به جای منطقی، همراه با آزمون؛ پهنای صفر برای اعراب و نیم‌فاصله۳ · ۶
termux-app-arabicشکل‌دهی کل تکه با زمینهٔ کامل سطر؛ کشیدن مکان‌نما به‌صورت لایهٔ جدا؛ پایهٔ LTR تا جابه‌جایی محلی بماند۴ · ۵
fa-consoleراه‌اندازی UTF-8؛ یکسان‌سازی ي/ك به ی/ک و رقم‌ها؛ قاعدهٔ «داده‌های برنامه منطقی می‌مانند»۱
estatermترتیب فراخوانی FriBidi (نه مسیر خروجی‌اش)۵
rtl-terminalجداسازی مسیرها و کد با LRI…PDI؛ مجموعه‌آزمون پیش و پس۵ · آزمون
  • مسئلهٔ #553 در Neovim، «پشتیبانی از زبان‌های دوجهتی»: از سال ۲۰۱۴ باز است و ۴۷ نظر دارد. این مسئله بیش از یک دهه قدمت دارد.
  • BiDi in Terminal Emulators (اگمونت کوبلینگر، ۲۰۱۹): پیش‌نویس استانداردی برای اینکه دوجهتی کار ترمینال است یا برنامه. VTE آن را پیاده کرده؛ هیچ‌یک از این ده پروژه از آن استفاده نمی‌کند.
  • موتورها: HarfBuzz برای شکل‌دهی؛ FriBidi و ICU برای UAX #9. هر پروژه‌ای که شکل‌دهی را درست انجام داد، آن را به موتوری از همین دست سپرد.

یک پروژهٔ مهدی بانشی · mbaneshi.ir