Подчеркнуть / микротемблейт заменить разрывы строк - странное поведение - PullRequest
13 голосов
/ 07 октября 2011

Я использую шаблон Underscore (который основан на Microtemplate Джона Резига) и всякий раз, когда я пытаюсь заменить разрывы строк внутри него, я получаю странное поведение.Например, если у меня есть такой текст:

var message = 'Line1\r\n\r\nLine2';

, я могу правильно заменить разрывы строк тегами br, если я сделаю это:

$('#example1_no_template').html(message.replace(/\r?\n/g, '<br />'));

Однако, если я попытаюсь заменить строкуразрывы внутри шаблона Underscore с приведенным ниже примером кода, я не вставляю теги br:

<script id="template1" type="text/html">
    <%= message.replace(/\r?\n/g, '<br />') %>
</script>

<script>
var template1 = _.template($('#template1').html());
$('#example1_template').html(template1({ message: message }));
</script>

И странным образом, если я изменяю свое регулярное выражение внутри шаблона на следующее, то я получаю всевиды тегов br, вставленные повсюду:

<script id="template3" type="text/html">
    <%= message.replace(/[\r\n?]/g, '<br /><br />') %>
</script>

Все эти поведения показаны в этой скрипке: http://jsfiddle.net/GHtDY/5/

Есть идеи, что происходит?Можно ли заменить разрывы строк внутри шаблона?

1 Ответ

8 голосов
/ 07 октября 2011

Интересно, в парсере шаблонов Underscore есть какая-то ошибка?Если вы используете синтаксис объекта RegExp вместо литерального синтаксиса regex:

<script id="template1" type="text/html">
    <%= message.replace(new RegExp('\r?\n', 'g'), '<br />') %>
</script>

, тогда вы начнете получать ожидаемые результаты: http://jsfiddle.net/ambiguous/GHtDY/6/

Ваш пример "фанки выходных данных":

<%= message.replace(/[\r\n?]/g, '<br /><br />') %>

выходит просто так, потому что Underscore заменяет n на ваши элементы <br>.В любом случае, этот класс символов должен соответствовать любому отдельному символу CR, LF или вопросительному знаку, и это не то, что вы пытаетесь сделать в любом случае.

Я подозреваю, что синтаксический анализатор шаблонов Underscore имеет некоторые проблемы с некоторыми литералами регулярных выражений;вы заметите, что /\s/g не работает так, как ожидалось.В частности, кажется, что возникают некоторые проблемы при разборе escape-последовательностей, таких как \r и \s внутри литерала регулярных выражений.Например, это:

<script id="template1" type="text/html">
    <%= message.replace(/\d/g, '<br /><br />') %>
</script>

не работает должным образом, когда message содержит несколько цифр, но использование new RegExp

<script id="template1" type="text/html">
    <%= message.replace(new RegExp('\d', 'g'), '<br /><br />') %>
</script>

работает должным образом.

...