Способы имитации еще не реализованного HTML-тега <bdi>? - PullRequest
6 голосов
/ 04 ноября 2011

Цель тега <bdi> в HTML5 состоит в том, чтобы изолировать двунаправленный текст от его контекста. И это именно то, что я ищу.

Имя пользователя слева направо отображается так:

Welcome, Generic User. [Logout]

С именем пользователя справа налево это превратится в ужасную вещь:

Welcome, [tougoL] .resU cireneG

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

Проблема в том, что ни один браузер пока не поддерживает тег <bdi>, поэтому я бродил, есть ли способ его симулировать? Какие HTML-теги могут изолировать это? Я знаю <span> и <div> нет.

Я бы не хотел удалять все символы BIDI, но, как я вижу, важность правильного отображения моего сайта> право на участие пользователей, говорящих на двух языках.

Ответы [ 2 ]

4 голосов
/ 17 декабря 2011

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

User (N badges) wrote:

сделает это, если пользователь будет заменен наимя арабскими буквами, скажем, أحمد, а N были заменены на число, скажем, 3. Тогда рендеринг будет

أحمد (3 значка):

Технически это неошибка;это следует из правил двунаправленности Unicode - сильная направленность арабских букв справа налево (RTL) влияет на символы со слабой направленностью, такие как круглые скобки.Но это все неправильно в практическом плане, конечно.Любая строка, которая может содержать символы RTL в общем контексте слева направо, должна быть защищена, изолирована.В документах HTML есть три способа сделать это:

  • Уровень символов: используйте управляющие символы U + 202B (встраивание справа налево, RLE) перед и U + 202C (направленное форматирование pop, PDF) после строки.В HTML вы можете использовать &#x202b; и &#x202c; для них.Это поддерживается IE 9, но не большинством других браузеров.
  • Уровень разметки: используйте разметку <bdi>.Как уже упоминалось, он еще не поддерживается браузерами.
  • Таблица стилей: используйте unicode-bidi: embed.Обычно это поддерживается современными браузерами.

Вы можете комбинировать подход таблиц стилей с подходом разметки.Это логично, и в будущих браузерах этот двойной подход будет работать даже при отключенных таблицах стилей:

<script>
document.createElement('bdi');
</script>
<style>
bdi { unicode-bidi: bidi-override; }
</style>
...
<bdi>أحمد</bdi> (3 badges) wrote:

Код скрипта предназначен для того, чтобы старые версии IE распознавали элемент <bdi>, так чтостили будут влиять на это.Это, конечно, потерпит неудачу, когда сценарии отключены, поэтому было бы немного безопаснее использовать <span> с классом, и вы все равно можете обернуть его внутри <bdi>.Таким образом, альтернатива

<style>
.bdi { unicode-bidi: bidi-override; }
</style>
...
<bdi><span class=bdi>أحمد</span></bdi> (3 badges) wrote:
4 голосов
/ 04 ноября 2011

С именем пользователя справа налево это превратилось бы в эту ужасную вещь

Не должно.Текст в (например) арабском имени пользователя будет отображаться справа налево, но это не повлияет на поток латинского текста вокруг него.

Проблема, о которой вы можете подумать, заключается в том, что имя пользователя содержитUnicode BDO (двунаправленное переопределение) управляющий символ.Это влияет на весь последующий текст, который следует за ним, что часто является плохой вещью для веб-сайтов, шаблонизирующих текст в HTML.

Вероятно, наиболее простым решением этой проблемы является фильтрация ввода для удаления управляющих символов, как обычных символов ASCII (0x00–0x1F) и Unicode.Существует группа символов, обозначенная Unicode и W3 как неподходящая для использования в разметке в этом примечании , которую веб-приложения обычно хотят удалить из данных.Он включает в себя символы BDO и несколько других, которые могут вызывать утечку нечетных эффектов за пределы собственного фрагмента текста.

...