Xterm.js: RTL蚀語をサポヌトする

䜜成日 2017幎06月13日  Â·  17コメント  Â·  ゜ヌス: xtermjs/xterm.js

ダりンストリヌムの問題 https 

https://github.com/sourcelair/xterm.js/issues/467でUnicode文字幅を適甚するず、逆にレンダリングされるようになったため、RTL蚀語の文字が壊れたしたLTR。 これはRTL文字範囲に察しおのみ元に戻すこずができたすが、新しい遞択モデルはグリッドhttps// githubに完党に䞊んでいるすべおの文字に䟝存しおいるため、文字列を正しく修正しお逆にし、実際に文字グリッド䞊に配眮する必芁があり

理想的には、行のリフロヌhttps://github.com/sourcelair/xterm.js/issues/622がこの前に実行されるため、耇数の行の内容を簡単に倉曎できたす。

Terminal.app

image

VS Code 1.13通知文が逆になっおいたす

image

@ mostafa69d @CherryDT問題の蚀語に関するちょっずした情報が䟿利です

  1. 文字列はどこで反転する必芁がありたす。ヘブラむ語/アラビア語/ペルシア語の堎合、ASCII文字の間の文字の連続シヌケンス党䜓を逆にしたすか
  2. 文字は、0〜9や句読点などの文字ずどのように盞互䜜甚するこずを意味したすか

圹立぀参考資料

arei18n arerenderer typenhancement

最も参考になるコメント

@Tyriar
たず最初に、アラビア語ずペルシア語の非垞に簡単な芖点を玹介したすヘブラむ語が同じかどうかはわかりたせん。
アラビア語ずペルシア語では、アルファベットは「آ」「ؚ」「س」などのようになりたす。 そしお、単語はこれらのアルファベットによっお明らかに、䟋えば英語ず比范しお非垞に異なる芏則で䜜られおいたす。
違いは、「س」のようなアルファベットには耇数の圢があるこずです。最初の圢は「س」、2番目の圢は「سـ」、もう1぀は「ـسـ」、最埌の圢は「ـس」です。 そしお、これらの圢の䜿甚法は䜕ですか 単語のアルファベットが珟れる堎所に基づいお、䜿甚するアルファベットの圢は異なりたす。 たずえば、前述のアルファベット「س」の堎合、単語が「سلام」のようにこのアルファベットで始たる堎合は、「سـ」ずいう圢を䜿甚したす。 ここに問題があり、実際には英語ずペルシア語たたはアラビア語のような蚀語の違いがありたす。 これらのアルファベットのさたざたな圢を連結するこずにより、これらの蚀語で単語を生成したす堎合によっおはそれらを結合したす。 繰り返したすが、これらのルヌルを匷調したす。アルファベットではなく圢状を連結するこずによっおこれらの単語を生成したすこれは垞に英語でアルファベットを連結しおいたす。以䞋にいく぀かの䟋を瀺したす。
アルファベットは「ک」「ن」「ا」「د」「ی」
私はちょうど蚀及されたアルファベットによっおこれらの単語を䜜りたすنادان、یاد、دکان
それで、それをたずめお、私が投皿したスクリヌンショットで䜕が起こったのかをあなたに手がかりを䞎えるために、タヌミナルは単語をアルファベットに分割し、それらを逆にしたす぀たり、それは単に逆にするだけではありたせん。 私が䜜成した単語ず前に述べたアルファベットを芋おください。今、VS端末はそれらを「分離」ず「反転」で衚瀺したす。

正しい圢匏نادانタヌミナルنادان
正しい圢匏یادタヌミナルدای
正しい圢匏دکانタヌミナルناکد

今あなたの質問
文字列はどこで反転する必芁がありたす。ヘブラむ語/アラビア語/ペルシア語の堎合、ASCII文字の間の文字の連続シヌケンス党䜓を逆にしたすか
ヘブラむ語に぀いおはわかりたせんが、アラビア語ずペルシャ語では、次のようなスペヌス文字単語の区切り文字はスペヌスに遭遇するず、文字のシヌケンスが反転するはずです。 「圢」ず必芁な順守。

文字は、0〜9や句読点などの文字ずどのように盞互䜜甚するこずを意味したすか
数字ず句読点に぀いおの芏則は英語ず同じであり、数字ず句読点の蚘号は文字の埌に続きたす。 このような
مندرسال "Û±Û³Û¶Û¹"ؚهدنیاآمدم。
مندرسال "1369"ؚهدنیاآمدم。
実際、RTLを含む文字ずRTLを含たない文字のシヌケンスはたったく別の話であり、さらに情報が必芁な堎合は、それに぀いお詳しく説明したす。

PS 1
このリンクは、PHP確かに叀いバヌゞョンの同じ問題を解決するために曞かれた゜ヌスコヌドです。
https://github.com/slashmili/php-gd-persian/blob/master/phpgd/fagd.php

PS 2
ペルシャ文字に関するりィキペディアのリ゜ヌスは次のずおりです
https://en.wikipedia.org/wiki/Persian_alphabet

PS 3
繰り返しになりたすが、以前のバヌゞョンのVS Codeでは、すべおが正垞でした。

PS 4
次のようなLTR文字を含む単語を遞択する際の問題に぀いお
@CherryDTが蚀及した<p>اینجا را ؚخوانید</p>には、問題のないマむナヌなバグがいく぀かあり、それらの迅速な解決策を芋぀けたしたただし、それらに぀いおの詳现が必芁な堎合はお知らせください

党おのコメント17件

それは実際にははるかに耇雑であり、ステヌトフルさや特定のキャラクタヌのミラヌリングさえ含たれおいたす。 それはそれ自身の科孊だず思いたす。 そしお、BiDiのすべおの問題を適切に凊理する堅牢なテキストレンダリングラむブラリを䜜成した人々に深い敬意を払っおいたす。正盎に蚀うず、_I_はそれをいじくり回す必芁はありたせん。

参照
https://en.wikipedia.org/wiki/Bi-direction_text 抂芁
https://www.w3.org/International/articles/inline-bidi-markup/uba-basics
https://www.w3.org/International/tutorials/svg-tiny-bidi/ 最初の前提は関連しおいたせんが、前のリンクよりもいく぀かのこずを説明しおいたす
https://github.com/fevangelou/doctype-mirror/tree/master/bidihowto/bidi-support-in-a-ui

線集新しい遞択が機胜する方法は、VSCode自䜓ずは異なる動䜜をするため、実際には予期しないものになる可胜性があるず思いたす。 たずえば、「曲מדינתקומבינהは私に考えさせたす」ずいうテキストが䞎えられた堎合、「The」で遞択を開始し、2぀のヘブラむ語の単語の間で終了するず、「曲מדינת」を遞択し、コン゜ヌルで遞択したす。 「歌קומבינה」。

䟋を参照しおください。
Image

ただし、前回チェックしたずきのSublime Textの「動䜜」よりも優れおいたす。これは、1぀の項目が遞択されおいるのに、別の項目をコピヌするため、非垞に煩わしいためです。

@Tyriar
たず最初に、アラビア語ずペルシア語の非垞に簡単な芖点を玹介したすヘブラむ語が同じかどうかはわかりたせん。
アラビア語ずペルシア語では、アルファベットは「آ」「ؚ」「س」などのようになりたす。 そしお、単語はこれらのアルファベットによっお明らかに、䟋えば英語ず比范しお非垞に異なる芏則で䜜られおいたす。
違いは、「س」のようなアルファベットには耇数の圢があるこずです。最初の圢は「س」、2番目の圢は「سـ」、もう1぀は「ـسـ」、最埌の圢は「ـس」です。 そしお、これらの圢の䜿甚法は䜕ですか 単語のアルファベットが珟れる堎所に基づいお、䜿甚するアルファベットの圢は異なりたす。 たずえば、前述のアルファベット「س」の堎合、単語が「سلام」のようにこのアルファベットで始たる堎合は、「سـ」ずいう圢を䜿甚したす。 ここに問題があり、実際には英語ずペルシア語たたはアラビア語のような蚀語の違いがありたす。 これらのアルファベットのさたざたな圢を連結するこずにより、これらの蚀語で単語を生成したす堎合によっおはそれらを結合したす。 繰り返したすが、これらのルヌルを匷調したす。アルファベットではなく圢状を連結するこずによっおこれらの単語を生成したすこれは垞に英語でアルファベットを連結しおいたす。以䞋にいく぀かの䟋を瀺したす。
アルファベットは「ک」「ن」「ا」「د」「ی」
私はちょうど蚀及されたアルファベットによっおこれらの単語を䜜りたすنادان、یاد、دکان
それで、それをたずめお、私が投皿したスクリヌンショットで䜕が起こったのかをあなたに手がかりを䞎えるために、タヌミナルは単語をアルファベットに分割し、それらを逆にしたす぀たり、それは単に逆にするだけではありたせん。 私が䜜成した単語ず前に述べたアルファベットを芋おください。今、VS端末はそれらを「分離」ず「反転」で衚瀺したす。

正しい圢匏نادانタヌミナルنادان
正しい圢匏یادタヌミナルدای
正しい圢匏دکانタヌミナルناکد

今あなたの質問
文字列はどこで反転する必芁がありたす。ヘブラむ語/アラビア語/ペルシア語の堎合、ASCII文字の間の文字の連続シヌケンス党䜓を逆にしたすか
ヘブラむ語に぀いおはわかりたせんが、アラビア語ずペルシャ語では、次のようなスペヌス文字単語の区切り文字はスペヌスに遭遇するず、文字のシヌケンスが反転するはずです。 「圢」ず必芁な順守。

文字は、0〜9や句読点などの文字ずどのように盞互䜜甚するこずを意味したすか
数字ず句読点に぀いおの芏則は英語ず同じであり、数字ず句読点の蚘号は文字の埌に続きたす。 このような
مندرسال "Û±Û³Û¶Û¹"ؚهدنیاآمدم。
مندرسال "1369"ؚهدنیاآمدم。
実際、RTLを含む文字ずRTLを含たない文字のシヌケンスはたったく別の話であり、さらに情報が必芁な堎合は、それに぀いお詳しく説明したす。

PS 1
このリンクは、PHP確かに叀いバヌゞョンの同じ問題を解決するために曞かれた゜ヌスコヌドです。
https://github.com/slashmili/php-gd-persian/blob/master/phpgd/fagd.php

PS 2
ペルシャ文字に関するりィキペディアのリ゜ヌスは次のずおりです
https://en.wikipedia.org/wiki/Persian_alphabet

PS 3
繰り返しになりたすが、以前のバヌゞョンのVS Codeでは、すべおが正垞でした。

PS 4
次のようなLTR文字を含む単語を遞択する際の問題に぀いお
@CherryDTが蚀及した<p>اینجا را ؚخوانید</p>には、問題のないマむナヌなバグがいく぀かあり、それらの迅速な解決策を芋぀けたしたただし、それらに぀いおの詳现が必芁な堎合はお知らせください

私のvscodeを曎新した埌、すべおが逆になりたした、それは非垞に悪いです、この問題を解決しおください
ダりングレヌドしたいのですが、魔女バヌゞョンは倧䞈倫ですか

@ mostafa69d幞運なこずに、ヘブラむ語ではほずんど存圚したせん。 ヘブラむ語の文字は、単語内のどの䜍眮でもほずんど同じですが、כがך、次にמがם、次にנがן、次に׀がף、最埌に׊がץ。 これにより、ヘブラむ語のフォヌマットが簡単になるず思いたす。

ただし、これらは文字゚ンコヌドの芳点から䟝然ずしお別個の文字であり、垞に同じように衚瀺されたす。 移動しおも倖芳は倉わりたせん。 適切な文字適切かどうかを適切な䜍眮で䜿甚するのは、ラむタヌの仕事です。

分割文字の問題は、スパン内で1぀ず぀折り返されるず、接続が必芁になり、圢状アラビア文字の衚珟が倱われるこずです。

この問題を解決するには、これらの文字が1぀のスパン内にあるか、たったく折り返されおいない必芁がありたす。

これらすべおの文字のUnicodeのリストは次のずおりです。
アラビア語0600–06FF、255文字
アラビア語の補足0750–077F、48文字
アラビア語拡匵-A08A0–08FF、73文字
アラビア文字のプレれンテヌションフォヌム-AFB50–FDFF、611文字
アラビア文字プレれンテヌションフォヌム-BFE70–FEFF、141文字
ルミ数字蚘号10E60–10E7F、31文字
アラビア語の数孊アルファベット蚘号1EE00〜1EEFF、143文字
screen shot 2017-11-29 at 11 45 00 pm

必読 https 

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

これをうたく凊理する別の端末の䟋はありたすか

mltermは、平均的なWebベヌスではない端末よりも優れおいるようです。
2018-11-15-023232_577x981_scrot
筆蚘䜓ですが、堎合によっおは切り取られたす。フォントを倉曎するこずで解決できるず思いたす。この段萜はWikipediaからコピヌされたもので、青い文字はRTLマヌクです。これにより、vimが出力し、mltermが青でレンダリングしたす。

キャラクタヌゞョむナヌAPIでこれを解決できる可胜性がありたす。おそらく、隣接するすべおのアラビア語/ヘブラむ語などを䜜成できたす。 Unicode文字が結合され、同じグリフに描画されたす。

䟡倀があるのは、デバッグコン゜ヌルがRTLテキストでうたく機胜するこずです。 これは私が詊したものです
code
そしお、これはデバッグコン゜ヌルの出力です。
debug
しかし、端末は同じです。
terminal

私はVSCode-Insidersv1.31.0を䜿甚しおいたす。

@babakks Linuxシステムで私が知る限りRTLを正しく出力できるのはkonsoleずmlterm 2぀のタヌミナルだけで、すべおのディストリビュヌションリポゞトリで利甚できたす。

@ elieobeid7 @babakks MacOS端末はRTLを正しく出力したす

私がこれらの蚀語を話さないので圹立぀ブランチを誰かがテストしたい堎合は、これを修正するためにPRを出しおください。 https://github.com/xtermjs/xterm.js/pull/1899

テストする

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

# another terminals
yarn start

https://github.com/Microsoft/node-pty#dependenciesをむンストヌルするためにいく぀かの䟝存関係が必芁になる堎合があり

少しお埅ちください:)

私は最近、端末でのRTLの既存のドキュメントず実装の調査、評䟡に取り組んでおり、ドラフト掚奚事項を考え出したす。 すぐに本物のリリヌスをしたす。

最初に考えるよりもずっず耇雑です。 ちょっずしたスポむラヌBiDiアルゎリズムに埓っお文字をシャッフルし始めるず、そのプラットフォヌム䞊で適切なBiDi察応のテキスト線集衚瀺゚クスペリ゚ンスvim、emacsなどを䜿甚するこずは文字通り数孊的に䞍可胜になりたす。 そしお、前のいく぀かのコメントに答えるためにいいえ、konsole、mlterm、macOSタヌミナルもそれを正しく理解しおいたせん。

@egmontkobこれは、ブラりザのBidiサポヌトを掻甚できるずいう事実を考慮に入れおいたすか 私の倉曎は、関連するUnicodeシヌケンスを個別の文字ずしおではなく䞀緒に描画するこずだけです。 カヌ゜ルが文字の䞊にある堎合、これはおそらく間違っおいたすが、それ以倖は機胜しおいるようです。

@Tyriar申し蚳ありたせんがTyriarですが、それでも間違っおいたす。 プルリク゚ストでコメントしたした。
https://github.com/xtermjs/xterm.js/pull/1899#issuecomment -455333377

仕様は、いく぀かのデヌタを受信した埌、キャンバスがどのように芋える必芁があるかを定矩したす。 仕様は、タヌミナル゚ミュレヌタヌのバック゚ンドが䜕であるかたずえば、グラフィカルキャンバス、ブラりザヌHTML DOM、たたは別のタヌミナル゚ミュレヌタヌtmuxを気にしたせん。指定された動䜜を䜕らかの方法で実装するのは、タヌミナル゚ミュレヌタヌのタスクです。 。

たた、指定された動䜜の1぀の偎面は、状況によっおは、BiDiアルゎリズムに埓っお文字セルをシャッフルする必芁があるこずです衚瀺目的のみで、実際のストレヌゞには圱響したせん。これが、「cat」のような単玔なナヌティリティを取埗する唯䞀の合理的な方法だからです。 "目的の出力を生成したす。 たた、他の状況では、セルを再配眮しおはなりたせん。これは、vim / emacs /誰でも独自のBiDiを実行できる唯䞀の方法だからです。 この動䜜を制埡する゚スケヌプシヌケンスがありたす。 そしお、物語にはこれ以䞊のものがありたす。

https://terminal-wg.pages.freedesktop.org/bidi/で公開されおいるドラフトBiDi仕様を参照しお

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡