Troika: Поддержка макета текста справа налево

Созданный на 5 апр. 2021  ·  11Комментарии  ·  Источник: protectwise/troika

Вместо полноценного расширенного решения для формирования текста (например, harfbuzz.wasm) мне бы хотелось получить некоторую базовую готовую поддержку макета RTL. Typr уже включает некоторый уровень поддержки замены арабских глифов, хотя я не знаю, насколько это полно.

Я уже добавил очень простую логику макета/обертки RTL. Давайте воспользуемся этой проблемой, чтобы отследить ошибки с этим и другими пробелами в поддержке.

Временная тестовая страница: https://troika-examples.netlify.app/#text -rtl

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

Я предложил более полную реализацию определения типа соединения; логика, которую я адаптировал из Opentype.js, оказалась неполной. Новая реализация фактически включает сильно сжатую версию определений типов соединения Unicode, поэтому теперь она должна обрабатывать все соединяемые символы на арабском и других языках. Это также дает приличное ускорение по сравнению с кодом Typr.

@MichaelHazani , так как вы вызвались протестировать иврит, я думаю, что это готово для вас сейчас. Вы можете использовать эту тестовую страницу, где я добавил пару шрифтов иврита в раскрывающийся список «Шрифт», и вы можете ввести свой собственный текст. Спасибо!

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

Во-первых, я хочу поблагодарить вас за работу над этим. Многим будет полезна поддержка арабской и RTL-раскладок.
Я сделал несколько первых тестов, стандартный арабский текст в основном хорошо поддерживается шрифтами cairo, Lemonada, Scheherazade (без Tachkil).

Я тестировал эти 2 правила для арабского языка:

  1. Хороши ли 3 формы написания иероглифов (одна в начале, в середине, в конце) и соединения (вязь).
  2. Тачкил, который представляет собой набор указаний для произношения ُ َ ً ٌ (не используется в большинстве текстов, которые вы найдете в Интернете, за исключением редких случаев)

В мурзе некоторые внутренние буквы не соединены (вместо внутренней ставится окончательная форма буквы или иным образом)
arabicTachkil

С тачкилом одни шрифты работали нормально, а другие либо меняли форму символа рядом с ним. Некоторые работали с текстом, который я написал в поле, а не с скопированным текстом.

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

Это быстрый тест, который я сделал, мне нужно проверить больше и дать вам больше деталей, где что-то странное. (Мне также нужно проверить шрифты, некоторые шрифты не содержат необходимых символов)

Большое спасибо! Я рад слышать, что у него достойное начало.

Интересно, что результат замены позиции слова зависит от шрифта. Логика определения положения слова в Typr всегда одинакова, поэтому должно быть что-то другое в том, как эти шрифты кодируют свои замены, которые Typr не обрабатывает. Я специально посмотрю на Мирзу, чтобы увидеть, смогу ли я определить разницу.

Поскольку я не знаю этих символов и, следовательно, не могу сам определить правильное и неправильное, было бы очень полезно, если бы вы могли дать мне несколько целевых тестов с ожидаемыми результатами, может быть, просто отдельные слова, что-то вроде:

Введите текст: ххх
Должно выглядеть так: [изображение]
Выглядит правильно в шрифте A: [изображение]
Выглядит неправильно в шрифте B: [изображение]

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

Я добавил код с грубой поддержкой двунаправленного макета. Прямо сейчас это чисто ручное использование управляющих символов LRO/RLO/PDF для определения диапазонов направлений. Полностью автоматический двунаправленный текст намного сложнее, и я все еще не могу понять его масштабы, но возможность раскладывать диапазоны (с переносом строк и выделением!) является важным началом.

image

Мне очень жаль, что я не оставил отзыв вчера. Я думал о том, чтобы провести полный тест на выходных, но я думаю, что лучше делать это поэтапно.
Начнем со шрифтов, которые работают очень хорошо (с некоторыми шрифтами могут быть проблемы). Я использовал шрифт Scheherazade, но Cairo и Lemonada дают тот же результат.
Шрифты Mirza и Amiri всегда показывают несвязанные буквы.
Шрифты Noto Sans, Roboto вообще не работают.

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

  1. Вместо окончательной формы у нас есть внутренняя форма.
  2. Внутри слова вместо начальной формы мы имеем внутреннюю форму. (внутри слова некоторые буквы не имеют лигатуры)
  3. Когда у нас есть число сразу после слова (كم2), мы сохраняем форму окончания.
  4. числа перевернуты.

arabThree

Текст, который я использовал:
№ 2.
№ 2
بِسم اللَّه الرحمن الرحيم
بِسمِ اللَّهِ الرَّحمٰنِ الرَّحيمِ

Этот ответ содержит изображение того, как рисуются буквы
https://www.quora.com/How-can-one-read-Arabic-as-the-letters-are-all-connected-to-each-other/answer/Hashem-Mohamed-4

Большое спасибо за этот размеченный тестовый пример, это очень полезно !!! Это действительно помогает мне понять вещи.

Логика Typr для определения позиции слова определенно ошибочна; Я заменил его логикой, адаптированной из opentype.js, и теперь результат кажется намного лучше:

image

Я внесу свой вклад в исправление Typr после дальнейшего тестирования.

Проблема «цифры перевернуты» будет решена с помощью работы BiDi, которую я начал. На данный момент это можно обойти с помощью явных символов LRO/PDF.

Продолжайте в том же духе! 🤩

Это было быстро.
Что ж, я не нашел чего-то, что требует дополнительных исправлений, кроме того, что можно сделать с помощью упомянутой вами работы BiDi (числа и скобки можно широко использовать с арабским текстом).
Можете ли вы показать пример использования символов LRO/PDF? Мне не удалось воспроизвести пример смешанного текста самостоятельно.

Последнее, что не связано с арабским текстом, но может быть связано с рендерингом SDF, это то, что некоторые символы имеют черный цвет внутри, когда 2 символа соединены вместе, как здесь.
image
image
а иногда и внутри одного персонажа
image
Это видно только со шрифтом Lemonda. Шахерезада, Каир работают нормально (может быть, потому что персонажи соединяются в нужном месте).
(Похоже на логическую операцию в инструменте векторного рендеринга.)

И еще раз спасибо за вашу работу.

Спасибо! В настоящее время я работаю над добавлением полной реализации алгоритма двунаправленного ввода, который, я думаю, должен решить все другие проблемы, которые вы описали до сих пор.

Текст «BiDi 1» в раскрывающемся списке примера содержит пример LRO/PDF, но пока не беспокойтесь об этом, это всего лишь временная мера, которая в любом случае неверна. Истинное биди будет лучше.

Думаю, проблема логического заполнения с этим шрифтом такая же, как обсуждалась в № 57.

Теперь у нас есть полная поддержка биди!

image

На странице с примером есть пара фрагментов двунаправленного текста, но попробуйте их с собственным смешанным текстом rtl+ltr.

Это превратилось в классический пример того, как я проваливаюсь в кроличью нору; Я не нашел подходящей реализации JS bidi и не хотел вводить fribidi.wasm, поэтому решил попробовать новую реализацию JS в качестве проекта по ночам и выходным. Вот https://github.com/lojjic/bidi-js! Мне нужно добавить туда некоторые документы, но они полностью соответствуют официальным тестам двунаправленного текста, довольно малы (~ 10 КБ) и довольно быстры, хотя, вероятно, их можно было бы больше оптимизировать.

Я очень доволен этим решением и тем, как мало оно увеличивает размер пакета. Я думаю, что сейчас мы очень близки к полной поддержке RTL. Однако мне нужно пересмотреть логику форм присоединения, я понял, что логика, которую я адаптировал из opentype.js, обрабатывает только арабские сценарии, но не другие, которые также выполняют присоединение.

Я предложил более полную реализацию определения типа соединения; логика, которую я адаптировал из Opentype.js, оказалась неполной. Новая реализация фактически включает сильно сжатую версию определений типов соединения Unicode, поэтому теперь она должна обрабатывать все соединяемые символы на арабском и других языках. Это также дает приличное ускорение по сравнению с кодом Typr.

@MichaelHazani , так как вы вызвались протестировать иврит, я думаю, что это готово для вас сейчас. Вы можете использовать эту тестовую страницу, где я добавил пару шрифтов иврита в раскрывающийся список «Шрифт», и вы можете ввести свой собственный текст. Спасибо!

Выглядит отлично!
(«Ну, кажется, тест прошел успешно. Пунктуация там, где она должна быть; выравнивание по правому краю выглядит хорошо. Оба шрифта отображают иврит так, как он должен отображаться. Переключение на английский язык, то есть это слово, не нарушает выравнивание. Отличная работа!")
image

Я выпустил v0.41.0 с проделанной здесь работой. Несомненно, есть и другие RTL-скрипты, которые потребуют дополнительной специализированной обработки, но это дает достаточно прочную основу, и я думаю, что мы можем обрабатывать их в каждом конкретном случае. И всегда есть возможность разрешить дополнительный плагин Harfbuzz (#91) для некоторых более сложных/непонятных случаев.

Еще раз спасибо @boulabiar и @MichaelHazani за вашу неоценимую помощь!!! 🎉

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