Xterm.js: Mendukung bahasa RTL

Dibuat pada 13 Jun 2017  ·  17Komentar  ·  Sumber: xtermjs/xterm.js

Masalah hilir: https://github.com/Microsoft/vscode/issues/28571

Ketika kami menerapkan lebar karakter unicode di https://github.com/sourcelair/xterm.js/issues/467 ini merusak karakter bahasa RTL karena sekarang dirender secara terbalik (LTR). Kami dapat mengembalikannya hanya untuk rentang karakter RTL tetapi kami harus melakukan perbaikan yang benar dan membalikkan string sehingga mereka benar-benar berada di kisi karakter karena model pemilihan baru bergantung pada semua karakter yang berbaris sempurna di kisi https://github. com/sourcelair/xterm.js/pull/670

Idealnya reflow baris https://github.com/sourcelair/xterm.js/issues/622 akan dilakukan sebelum ini sehingga lebih mudah untuk mengubah konten beberapa baris.

Terminal.app:

image

Kode VS 1.13 (kalimat pemberitahuan dibalik):

image

@mostafa69d @CherryDT sedikit info tentang bahasa yang dimaksud akan berguna:

  1. Di mana string harus dibalik. untuk Ibrani/Arab/Persia, apakah saya membalikkan seluruh urutan karakter yang berkelanjutan di antara karakter ascii?
  2. Bagaimana karakter dimaksudkan untuk berinteraksi dengan karakter seperti 0-9 atau tanda baca?

Referensi yang berguna:

arei18n arerenderer typenhancement

Komentar yang paling membantu

@Tyriar
Pertama-tama saya akan memberi Anda perspektif yang sangat singkat tentang bahasa Arab dan Persia mungkin itu membantu Anda (saya tidak yakin apakah bahasa Ibraninya sama).
Dalam bahasa Arab dan Persia, alfabetnya seperti "آ" "ب" "س" dan seterusnya. Dan kata-kata yang dibuat oleh alfabet ini (jelas) dengan aturan yang sangat berbeda dibandingkan dengan misalnya bahasa Inggris.
Perbedaannya adalah kita memiliki lebih dari satu bentuk untuk beberapa alfabet seperti "س". Bentuk pertama adalah "س" dan yang kedua adalah " ", yang lainnya adalah "ـسـ" dan yang terakhir adalah "ـس". Dan apa gunanya bentuk-bentuk ini? Berdasarkan di mana alfabet dalam sebuah kata muncul, bentuk alfabet yang kita gunakan bervariasi. Misalnya, untuk alfabet yang disebutkan "س" kami menggunakan bentuk "سـ" ketika sebuah kata dimulai dengan alfabet ini seperti "سلام". Inilah masalahnya dan sebenarnya perbedaan antara bahasa seperti bahasa Inggris dan Persia atau Arab. Kami menghasilkan kata-kata dalam bahasa-bahasa ini dengan menggabungkan berbagai bentuk alfabet ini (kami menyatukannya dalam beberapa kasus). Sekali lagi saya menyoroti aturan ini: kami menghasilkan kata-kata ini dengan menggabungkan bentuk bukan abjad (Yang selalu menggabungkan abjad dalam bahasa Inggris) Anda dapat melihat beberapa contoh di bawah ini:
kami memiliki huruf "ک" "ن" "ا" "د" "ی"
Saya membuat kata-kata ini dengan abjad yang baru saja disebutkan : ادان , اد,دکان
Jadi, untuk membungkusnya dan memberi Anda petunjuk tentang apa yang terjadi di tangkapan layar yang saya posting, terminal memecah kata-kata menjadi abjad dan membalikkannya. (Jadi ini bukan hanya tentang membalikkan). Lihatlah kata-kata yang saya buat dan abjad yang saya sebutkan sebelumnya, Sekarang terminal VS menunjukkannya "dipisahkan" dan "dibalik".

Format yang benar: نادان Terminal: ا ا
Format yang benar:یاد Terminal: ا
Format yang benar: ان Terminal: ا

Sekarang pertanyaan Anda:
Di mana string harus dibalik. untuk Ibrani/Arab/Persia, apakah saya membalikkan seluruh urutan karakter yang berkesinambungan di antara karakter ascii?
Saya tidak tahu apa-apa tentang bahasa Ibrani, tetapi dalam bahasa Arab dan Persia, urutan karakter harus terbalik ketika mereka menemukan karakter spasi (Pemisah kata adalah spasi) seperti ini:" ال " tetapi tetap harus menjaga "bentuk" dan kepatuhan yang diperlukan.

Bagaimana karakter dimaksudkan untuk berinteraksi dengan karakter seperti 0-9 atau tanda baca?
Tentang angka dan tanda baca aturannya sama dengan bahasa Inggris dan angka dan tanda baca mengikuti karakter. seperti ini:
?من ال "۱۳۶۹" ا .
ال "1369" ا .
Sebenarnya urutan karakter yang mengandung karakter RTL dan non-RTL adalah cerita yang sangat berbeda dan jika Anda memerlukan informasi lebih lanjut, saya dapat menguraikannya.

PS 1:
Tautan ini di sini adalah kode sumber yang ditulis untuk menyelesaikan masalah yang sama di PHP (pasti versi lama) Anda dapat melihatnya
https://github.com/slashmili/php-gd-persian/blob/master/phpgd/fagd.php

PS 2:
Berikut adalah sumber di wikipedia tentang karakter Persia
https://en.wikipedia.org/wiki/Persian_alphabet

PS 3:
Sekali lagi, saya harus menyebutkan bahwa di versi VS Code sebelumnya, semuanya baik-baik saja.

PS 4:
Tentang masalah memilih kata yang mengandung beberapa karakter LTR seperti
<p>اینجا را بخوانید</p> yang disebutkan @CherryDT , ada beberapa bug kecil yang saya tidak punya masalah dengan mereka dan saya menemukan solusi cepat untuk mereka. (Tapi tetap jika Anda memerlukan penjelasan tentang itu, beri tahu saya)

Semua 17 komentar

Ini sebenarnya jauh lebih rumit dan mencakup statefulness dan bahkan mencerminkan karakter tertentu. Saya akan mengatakan itu adalah ilmunya sendiri. (Dan saya sangat menghormati orang-orang yang menulis perpustakaan rendering teks yang kuat yang menangani semua masalah BiDi dengan benar, jadi _I_ tidak perlu dipusingkan dengan itu, jujur.)

Lihat juga:
https://en.wikipedia.org/wiki/Bi-directional_text (ikhtisar bagus)
https://www.w3.org/International/articles/inline-bidi-markup/uba-basics
https://www.w3.org/International/tutorials/svg-tiny-bidi/ (premis awal tidak terkait tetapi menjelaskan beberapa hal lebih baik daripada tautan sebelumnya)
https://github.com/fevangelou/doctype-mirror/tree/master/bidihowto/bidi-support-in-a-ui

EDIT: Saya pikir cara kerja seleksi baru sebenarnya tidak terduga karena akan berperilaku berbeda dari VSCode itu sendiri. Misalnya, dengan teks "Lagu membuat saya berpikir", ketika saya mulai memilih di "The" dan diakhiri di antara dua kata Ibrani, saya akan memilih "Lagu ", sedangkan di konsol saya akan memilih "Lagu ".

Lihat contoh:
Image

Namun itu masih akan lebih baik daripada bagaimana Sublime Text "bekerja" terakhir kali saya periksa, karena di sana Anda akan melihat satu hal yang dipilih tetapi menyalin yang lain, yang sangat mengganggu.

@Tyriar
Pertama-tama saya akan memberi Anda perspektif yang sangat singkat tentang bahasa Arab dan Persia mungkin itu membantu Anda (saya tidak yakin apakah bahasa Ibraninya sama).
Dalam bahasa Arab dan Persia, alfabetnya seperti "آ" "ب" "س" dan seterusnya. Dan kata-kata yang dibuat oleh alfabet ini (jelas) dengan aturan yang sangat berbeda dibandingkan dengan misalnya bahasa Inggris.
Perbedaannya adalah kita memiliki lebih dari satu bentuk untuk beberapa alfabet seperti "س". Bentuk pertama adalah "س" dan yang kedua adalah " ", yang lainnya adalah "ـسـ" dan yang terakhir adalah "ـس". Dan apa gunanya bentuk-bentuk ini? Berdasarkan di mana alfabet dalam sebuah kata muncul, bentuk alfabet yang kita gunakan bervariasi. Misalnya, untuk alfabet yang disebutkan "س" kami menggunakan bentuk "سـ" ketika sebuah kata dimulai dengan alfabet ini seperti "سلام". Inilah masalahnya dan sebenarnya perbedaan antara bahasa seperti bahasa Inggris dan Persia atau Arab. Kami menghasilkan kata-kata dalam bahasa-bahasa ini dengan menggabungkan berbagai bentuk alfabet ini (kami menyatukannya dalam beberapa kasus). Sekali lagi saya menyoroti aturan ini: kami menghasilkan kata-kata ini dengan menggabungkan bentuk bukan abjad (Yang selalu menggabungkan abjad dalam bahasa Inggris) Anda dapat melihat beberapa contoh di bawah ini:
kami memiliki huruf "ک" "ن" "ا" "د" "ی"
Saya membuat kata-kata ini dengan abjad yang baru saja disebutkan : ادان , اد,دکان
Jadi, untuk membungkusnya dan memberi Anda petunjuk tentang apa yang terjadi di tangkapan layar yang saya posting, terminal memecah kata-kata menjadi abjad dan membalikkannya. (Jadi ini bukan hanya tentang membalikkan). Lihatlah kata-kata yang saya buat dan abjad yang saya sebutkan sebelumnya, Sekarang terminal VS menunjukkannya "dipisahkan" dan "dibalik".

Format yang benar: نادان Terminal: ا ا
Format yang benar:یاد Terminal: ا
Format yang benar: ان Terminal: ا

Sekarang pertanyaan Anda:
Di mana string harus dibalik. untuk Ibrani/Arab/Persia, apakah saya membalikkan seluruh urutan karakter yang berkesinambungan di antara karakter ascii?
Saya tidak tahu apa-apa tentang bahasa Ibrani, tetapi dalam bahasa Arab dan Persia, urutan karakter harus terbalik ketika mereka menemukan karakter spasi (Pemisah kata adalah spasi) seperti ini:" ال " tetapi tetap harus menjaga "bentuk" dan kepatuhan yang diperlukan.

Bagaimana karakter dimaksudkan untuk berinteraksi dengan karakter seperti 0-9 atau tanda baca?
Tentang angka dan tanda baca aturannya sama dengan bahasa Inggris dan angka dan tanda baca mengikuti karakter. seperti ini:
?من ال "۱۳۶۹" ا .
ال "1369" ا .
Sebenarnya urutan karakter yang mengandung karakter RTL dan non-RTL adalah cerita yang sangat berbeda dan jika Anda memerlukan informasi lebih lanjut, saya dapat menguraikannya.

PS 1:
Tautan ini di sini adalah kode sumber yang ditulis untuk menyelesaikan masalah yang sama di PHP (pasti versi lama) Anda dapat melihatnya
https://github.com/slashmili/php-gd-persian/blob/master/phpgd/fagd.php

PS 2:
Berikut adalah sumber di wikipedia tentang karakter Persia
https://en.wikipedia.org/wiki/Persian_alphabet

PS 3:
Sekali lagi, saya harus menyebutkan bahwa di versi VS Code sebelumnya, semuanya baik-baik saja.

PS 4:
Tentang masalah memilih kata yang mengandung beberapa karakter LTR seperti
<p>اینجا را بخوانید</p> yang disebutkan @CherryDT , ada beberapa bug kecil yang saya tidak punya masalah dengan mereka dan saya menemukan solusi cepat untuk mereka. (Tapi tetap jika Anda memerlukan penjelasan tentang itu, beri tahu saya)

Setelah Memperbarui vscode saya, Semuanya terbalik, Itu Sangat buruk, Tolong Selesaikan masalah ini
Saya ingin menurunkan versi, versi Penyihir oke?

@mostafa69d untungnya cukup dalam bahasa Ibrani yang nyaris tidak ada. Huruf Ibrani sebagian besar tetap sama dalam posisi apa pun di dalam sebuah kata, selain beberapa huruf yaitu yang berubah menjadi , lalu yang berubah menjadi , lalu yang berubah menjadi , lalu yang berubah menjadi dan akhirnya yang berubah menjadi . Ini membuat bahasa Ibrani lebih mudah untuk diformat, saya kira.

Namun ini masih karakter yang terpisah (dalam hal pengkodean karakter) dan selalu menampilkan yang sama. Mereka tidak mengubah penampilan saat dipindahkan. (Tugas penulis adalah menggunakan huruf yang tepat - pas atau tidak - pada posisi yang tepat.)

Masalah dengan karakter yang membelah adalah ketika mereka dibungkus dalam rentang satu per satu itu akan membutuhkan koneksi dan itu akan kehilangan mewakili bentuk (huruf Arab).

Untuk memperbaiki masalah karakter ini harus berada dalam satu rentang atau tidak membungkusnya sama sekali.

Daftar unicode semua huruf ini adalah
Arab (0600–06FF, 255 karakter)
Suplemen Bahasa Arab (0750–077F, 48 karakter)
Arabic Extended-A (08A0–08FF, 73 karakter)
Formulir Presentasi Bahasa Arab-A (FB50–FDFF, 611 karakter)
Formulir Presentasi Bahasa Arab-B (FE70–FEFF, 141 karakter)
Simbol Angka Rumi (10E60–10E7F, 31 karakter)
Simbol Abjad Matematika Arab (1EE00—1EEFF, 143 karakter)
screen shot 2017-11-29 at 11 45 00 pm

bacaan wajib: https://opensource.com/life/16/3/twisted-road-right-left-language-support

dari https://github.com/Microsoft/vscode/issues/28571#issuecomment -307991443

apakah Anda memiliki contoh terminal lain yang menangani ini dengan baik?

mlterm tampaknya lebih baik daripada terminal rata-rata (berbasis non-web).
2018-11-15-023232_577x981_scrot
Ini kursif tetapi dalam beberapa kasus terputus, saya pikir itu dapat diselesaikan dengan mengubah font, paragraf ini disalin dari Wikipedia, karakter biru adalah tanda RTL, begitulah cara vim mengeluarkannya dan mlterm merendernya dengan warna biru.

API penggabung karakter mungkin dapat menyelesaikan ini, kami mungkin dapat membuat semua bahasa Arab/Ibrani/dll yang berdekatan. karakter unicode bergabung dan digambar dalam mesin terbang yang sama.

Untuk apa nilainya, konsol debug bekerja dengan baik dengan teks RTL. Ini yang saya coba:
code
Dan ini adalah output pada konsol debug:
debug
Tapi terminalnya masih sama:
terminal

Saya menggunakan Kode VS - Insiders v1.31.0.

@babakks Hanya dua Terminal sejauh yang saya tahu di sistem Linux yang dapat menampilkan RTL dengan benar, konsole dan mlterm , mereka tersedia di semua repo distro.

@elieobeid7 @babakks terminal Mac OS mengeluarkan RTL dengan benar

Keluarkan PR untuk memperbaikinya, jika ada yang ingin menguji cabang yang akan berguna karena saya tidak berbicara bahasa ini. https://github.com/xtermjs/xterm.js/pull/1899

Untuk mengetes:

git clone https://github.com/Tyriar/xterm.js
cd xterm.js
git checkout 701_rtl_support
yarn
yarn watch

# another terminals
yarn start

Anda mungkin memerlukan beberapa dependensi untuk diinstal https://github.com/Microsoft/node-pty#dependencies

Tolong tunggu sebentar :)

Saya baru-baru ini bekerja mempelajari, mengevaluasi dokumen yang ada dan implementasi RTL di terminal, dan menghasilkan rekomendasi (draf). Saya akan segera merilisnya sekarang.

Ini jauh lebih rumit daripada yang pertama kali dipikirkan. Sedikit spoiler: Jika Anda mulai mengacak karakter sesuai dengan algoritma BiDi, secara harfiah, secara matematis terbukti tidak mungkin untuk memiliki pengalaman menonton pengeditan teks BiDi-aware yang tepat (misalnya vim, emacs ...) di atas platform itu . (Dan untuk menanggapi beberapa komentar sebelumnya: tidak, konsole, mlterm, dan Terminal macOS juga tidak benar.)

@egmontkob apakah ini memperhitungkan fakta bahwa kami dapat memanfaatkan dukungan bidi browser? Semua perubahan saya adalah memaksa urutan unicode terkait untuk digambar bersama bukan sebagai karakter yang terpisah. Ini mungkin salah ketika kursor berada di atas karakter tetapi tampaknya berfungsi selain itu.

@Tyriar Maaf Tyriar, tapi masih salah. Saya berkomentar di bawah permintaan tarik.
https://github.com/xtermjs/xterm.js/pull/1899#issuecomment -455333377

Spec mendefinisikan bagaimana kanvas perlu terlihat, setelah menerima beberapa data. Spesifikasi tidak peduli apa backend emulator terminal (misalnya kanvas grafis, atau browser (HTML DOM), atau emulator terminal lain (tmux)), itu tugas emulator terminal untuk menerapkan perilaku yang ditentukan dengan cara apa pun .

Dan satu aspek dari perilaku yang ditentukan adalah bahwa dalam beberapa keadaan, sel karakter perlu diacak sesuai dengan algoritma BiDi (hanya untuk tujuan tampilan, tidak memengaruhi penyimpanan sebenarnya), karena itulah satu-satunya cara yang masuk akal untuk mendapatkan utilitas sederhana seperti "cat " menghasilkan keluaran yang diinginkan; dan dalam beberapa keadaan lain sel tidak boleh diatur ulang, karena itulah satu-satunya cara vim/emacs/siapa pun dapat melakukan BiDi mereka sendiri. Ada urutan pelarian yang mengendalikan perilaku ini. Dan masih banyak lagi cerita dari ini.

Silakan lihat draf spesifikasi BiDi yang dipublikasikan di https://terminal-wg.pages.freedesktop.org/bidi/ . Komentar, ide perbaikan, dll. diterima di sana di pelacak masalah.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat