Xterm.js: Поддержка языков RTL

Созданный на 13 июн. 2017  ·  17Комментарии  ·  Источник: xtermjs/xterm.js

Проблема нижнего уровня: https://github.com/Microsoft/vscode/issues/28571

Когда мы установили ширину символов Юникода в https://github.com/sourcelair/xterm.js/issues/467, это сломало символы языка RTL, поскольку теперь они отображаются в обратном порядке (LTR). Мы могли бы отменить это только для диапазонов символов RTL, но мы должны сделать правильное исправление и перевернуть строки, чтобы они действительно находились в сетке символов, поскольку новая модель выбора полагается на то, что все символы идеально выстраиваются в сетке https: // github. com / sourcelair / xterm.js / pull / 670

В идеале перекомпоновка строки https://github.com/sourcelair/xterm.js/issues/622 должна выполняться до этого, чтобы было легче изменить содержимое нескольких строк.

Terminal.app:

image

Код VS 1.13 (предложения поменяны местами):

image

@ mostafa69d @CherryDT была бы полезна небольшая информация по рассматриваемым языкам:

  1. Где следует переворачивать строки. Для иврита / арабского / персидского языков можно ли перевернуть целые непрерывные последовательности символов между символами ascii?
  2. Как символы должны взаимодействовать с такими символами, как 0–9 или знаки препинания?

Полезные ссылки:

arei18n arerenderer typenhancement

Самый полезный комментарий

@Tyriar
Прежде всего, я дам вам очень краткое представление об арабском и персидском языках, возможно, это поможет вам (я не уверен, что иврит такой же).
В арабском и персидском языках алфавиты похожи на «آ», «ب», «س» и так далее. И слова составлены этими алфавитами (очевидно) с совсем другим правилом по сравнению, например, с английским.
Разница в том, что у нас есть более одной формы для некоторого алфавита, такого как «س». Первая форма - «س», вторая - «سـ», вторая - «ـسـ» и последняя - «ـس». И каково использование этих форм? В зависимости от того, где находится алфавит в слове, форма используемого нами алфавита варьируется. Например, для упомянутого алфавита «س» мы используем форму «سـ», когда слово начинается с этого алфавита, например «سلام». Вот в чем проблема и собственно разница между таким языком, как английский и персидский или арабский. Мы генерируем слова на этих языках, объединяя различные формы этих алфавитов (в некоторых случаях мы соединяем их вместе). Я снова подчеркиваю это правило: мы генерируем эти слова, объединяя формы, а не алфавиты (что всегда является объединением алфавитов на английском языке), вы можете увидеть несколько примеров ниже:
у нас есть алфавиты "ک" "ن" "ا" "د" "ی"
Я составляю эти слова по только что упомянутым алфавитам: نادان, یاد, دکان
Итак, чтобы подвести итог и дать вам представление о том, что произошло на опубликованных мною снимках экрана, терминал разбивает слова на алфавиты и меняет их местами (так что дело не только в реверсировании). Взгляните на слова, которые я создал, и алфавиты, о которых я упоминал ранее. Теперь терминал 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, например
<p>اینجا را بخوانید</p> которых упоминал @CherryDT , есть некоторые незначительные ошибки, с которыми у меня нет проблем, и я нашел быстрые решения для них (но все же, если вам нужны какие-то подробности о них, дайте мне знать)

Все 17 Комментарий

На самом деле это намного сложнее и включает в себя состояние и даже зеркальное отображение определенных персонажей. Я бы сказал, что это отдельная наука. (И я глубоко уважаю тех людей, которые написали надежные библиотеки рендеринга текста, которые должным образом обрабатывают все проблемы BiDi, так что _I_ не нужно возиться с этим, если честно.)

Смотрите также:
https://en.wikipedia.org/wiki/Bi-directional_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» и заканчиваю между двумя словами на иврите, я выбираю «Песня מדינת», а в консоли я выбираю «Песня ומבינה».

См. Пример:
Image

Однако это все равно будет лучше, чем то, как Sublime Text «работает» в прошлый раз, когда я проверял, потому что там вы увидите, что одна вещь выбрана, но скопируете другую, что очень раздражает.

@Tyriar
Прежде всего, я дам вам очень краткое представление об арабском и персидском языках, возможно, это поможет вам (я не уверен, что иврит такой же).
В арабском и персидском языках алфавиты похожи на «آ», «ب», «س» и так далее. И слова составлены этими алфавитами (очевидно) с совсем другим правилом по сравнению, например, с английским.
Разница в том, что у нас есть более одной формы для некоторого алфавита, такого как «س». Первая форма - «س», вторая - «سـ», вторая - «ـسـ» и последняя - «ـس». И каково использование этих форм? В зависимости от того, где находится алфавит в слове, форма используемого нами алфавита варьируется. Например, для упомянутого алфавита «س» мы используем форму «سـ», когда слово начинается с этого алфавита, например «سلام». Вот в чем проблема и собственно разница между таким языком, как английский и персидский или арабский. Мы генерируем слова на этих языках, объединяя различные формы этих алфавитов (в некоторых случаях мы соединяем их вместе). Я снова подчеркиваю это правило: мы генерируем эти слова, объединяя формы, а не алфавиты (что всегда является объединением алфавитов на английском языке), вы можете увидеть несколько примеров ниже:
у нас есть алфавиты "ک" "ن" "ا" "د" "ی"
Я составляю эти слова по только что упомянутым алфавитам: نادان, یاد, دکان
Итак, чтобы подвести итог и дать вам представление о том, что произошло на опубликованных мною снимках экрана, терминал разбивает слова на алфавиты и меняет их местами (так что дело не только в реверсировании). Взгляните на слова, которые я создал, и алфавиты, о которых я упоминал ранее. Теперь терминал 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, например
<p>اینجا را بخوانید</p> которых упоминал @CherryDT , есть некоторые незначительные ошибки, с которыми у меня нет проблем, и я нашел быстрые решения для них (но все же, если вам нужны какие-то подробности о них, дайте мне знать)

После обновления моего vscode все поменялось местами, это очень плохо, пожалуйста, решите эту проблему
Я хочу понизить версию, версия Witch в порядке?

@ mostafa69d, к счастью, на иврите, которого почти не существует. Буквы иврита остаются в основном одинаковыми в любом положении внутри слова, за исключением нескольких букв: כ, которое превращается в ך, затем מ, которое превращается в ם, затем נ, которое превращается в ן, затем פ, которое превращается в ף, и, наконец, צ, которое превращается в ץ. Думаю, это упрощает форматирование иврита.

Однако это все еще отдельные символы (с точки зрения кодировки символов) и всегда отображаются одинаково. Они не меняют внешний вид при перемещении. (Работа писателя - использовать правильную букву - софит или нет - в нужном месте.)

Проблема с разделением символов заключается в том, что когда они заключены в диапазон один за другим, потребуется соединение, и он не будет отображать форму (арабские буквы).

Чтобы устранить проблему, эти символы должны находиться в одном диапазоне или вообще не переносить их.

В списке юникода все эти буквы
Арабский (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://opensource.com/life/16/3/twisted-road-right-left-language-support

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

у вас есть пример другого терминала, который с этим справляется?

mlterm кажется лучше, чем средний (не веб-терминал).
2018-11-15-023232_577x981_scrot
Он написан курсивом, но в некоторых случаях обрезается, я думаю, что это можно решить, изменив шрифт, этот абзац был скопирован из Википедии, синие символы - это метка RTL, вот как vim выводит их, а mlterm отображает их синим цветом.

API объединения символов может решить эту проблему, мы, вероятно, могли бы сделать все смежные арабские / ивриты / и т. Д. символы Юникода соединяются и отображаются в одном глифе.

Как бы то ни было, консоль отладки хорошо работает с текстами RTL. Вот что я пробовал:
code
И это результат на консоли отладки:
debug
Но терминал все тот же:
terminal

Я использую VS Code - Insiders v1.31.0.

@babakks Насколько мне известно, только два терминала в системе Linux могут правильно выводить RTL, konsole и mlterm , они доступны во всех репозиториях дистрибутивов.

@ elieobeid7 @babakks Терминал Mac OS правильно выводит 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 учитывает ли это тот факт, что мы можем использовать поддержку двунаправленного

@Tyriar Извини, Тириар, но это все равно неправильно. Я прокомментировал запрос на перенос.
https://github.com/xtermjs/xterm.js/pull/1899#issuecomment -455333377

Спецификация определяет, как должен выглядеть холст после получения некоторых данных. Спецификации не важно, что такое серверная часть эмулятора терминала (например, графический холст, браузер (HTML DOM) или другой эмулятор терминала (tmux)), задача эмулятора терминала - реализовать указанное поведение любыми способами. .

И один из аспектов указанного поведения заключается в том, что в некоторых случаях ячейки символов необходимо перемешивать в соответствии с алгоритмом BiDi (только для целей отображения, не влияя на фактическое хранилище), потому что это единственный разумный способ получить простые утилиты, такие как "cat "произвести желаемый результат; и в некоторых других случаях ячейки нельзя переставлять, потому что это единственный способ vim / emacs / кто бы ни мог делать свои собственные BiDi. Есть escape-последовательности, управляющие этим поведением. И в этой истории есть гораздо больше, чем это.

См. Опубликованный проект спецификации BiDi по адресу https://terminal-wg.pages.freedesktop.org/bidi/ . Комментарии, идеи по улучшению и т. Д. Приветствуются в его системе отслеживания проблем.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги