Использование только CR как разрыва строки внутри предварительного тега не работает - PullRequest
4 голосов
/ 06 мая 2011

На работе мы наткнулись на то, что Bugzilla создала вывод HTML, который приводил к слишком длинным строкам, потому что браузер не ломал их. Это происходило в Chrome, но не в Firefox 3.5, поэтому нам было все равно. Но Firefox 4 ведет себя так же, как Chrome, поэтому нам пришлось искать другой обходной путь.

Пример:

<code><html>
  <body>
    <pre>
      Lorem ipsum dolor sit amet, consetetur sadipscing elitr,&#013;sed diam nonumy eirmod tempor invidunt ut labore et&#013;dolore magna aliquyam erat, sed diam voluptua. At vero eos&#013;et accusam et justo duo dolores et ea rebum. Stet clita kasd&#013;gubergren, no sea takimata sanctus est Lorem ipsum dolor sit&#013;amet.&#013;
    

Сервер использует только CR в качестве перевода строки, что очень редко, и обычные альтернативы (CR + LF, только LF) работают правильно, поэтому правильный способ исправить это - сказать серверу Bugzilla использовать один из этих разрывов строки методы. Во всяком случае, мне любопытно, почему это не работает, и игнорирование переносов строк кажется "правильным" способом для браузеров.

Кроме того, я нашел странный локальный обходной путь для Chrome и FF 4 с использованием скрипта Greasemonkey (модифицированная версия эта ):

var els = document.getElementsByTagName("*");
for(var i = 0, l = els.length; i < l; i++) {
  var el = els[i];
  el.innerHTML = el.innerHTML;
}

Кажется, это не повлияет на страницу, но с помощью этого сценария разрывы строк неожиданно отображаются правильно.

Итак, мои вопросы:

  1. Является ли Chrome / FF 4 «правильным» способом обработки разрывов строк такого типа внутри <pre>?
  2. Почему работает этот скрипт Greasemonkey?

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Сценарий GM работает, потому что, очевидно, JS преобразует CR (\r) в LF (\n), динамически при записи в DOM.

См. этот тест на jsFiddle . Обратите внимание, как CR (десятичное 13) в конце 2-й строки преобразуется в LF (десятичное 10).

3 голосов
/ 07 мая 2011

Да, HTML RFC определяет разрыв строки как: http://www.w3.org/TR/html401/struct/text.html#line-breaks

Разрыв строки определяется как возврат каретки (), перевод строки () или возврат каретки /пара перевода строки.Все разрывы строк представляют собой пробелы.

Однако возврат каретки в исходное положение встречается крайне редко.Я не удивлен, что это не работает.Но технически я бы сказал, что FF4 и Chrome ошибаются.

Не уверен, почему работает ваш скрипт greasemonkey.Я предполагаю, что получение el.innerHTML - это преобразование CR в CR-LF или LF.

...