Экранирование возврата строки / конца строки в шаблонах ERB - PullRequest
6 голосов
/ 11 мая 2011

Мне нужно иметь возможность форматировать непечатные логические строки в ERB, не влияя на возможный текстовый вывод шаблона.На данный момент, я не думаю, что ERB поддерживает такое экранирование.

Это мой первый крупный проект на Ruby.Я пишу генератор кода.Мои шаблоны будут включать в себя значительное количество условных выражений и перечислений.Чтобы сделать шаблон читаемым и обслуживаемым, мне нужно иметь возможность форматировать логический код и комментарии без искажения конечного результата.

Например, предположим, мне нужен вывод:

Starting erbOutput
1
2
3
4
Ending erbOutput

Я наивно написал шаблон примерно так:

require 'erb'
h=<<H
Starting erbOutput
<%# comment %>
<%5.times do |e|%>
<%=e.to_s  %>
<%end %>
<%# comment %>
Ending erbOutput
H
s=ERB.new(h).result
puts s

... но это выдает

Starting erbOutput


0

1

2

3

4


Ending erbOutput

Прямая печать:

"Starting erbOutput\n\n\n0\n\n1\n\n2\n\n3\n\n4\n\n\nEnding erbOutput\n"

... проясняет, что возврат строки логической строки и строки комментария включается в вывод ERB.

Я могу получить желаемый результат, поместив шаблон в такую ​​неловкую форму:

h=<<H
Starting erbOutput<%# comment %>
<%5.times do |e|%><%=e.to_s  %>
<%end %><%# comment %>Ending erbOutput
H

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

Есть ли способ избежать или иным образом подавить возврат строк логики и строк комментариев в ERB?Обрабатывает ли это один из других общедоступных шаблонных модулей Ruby?

В случае, если это имеет значение, я работаю в MacRuby 0.10 (реализует Ruby 1.9.2) на MacOS 10.6.7.

Ответы [ 4 ]

4 голосов
/ 11 мая 2011

Знак минус?

<%# comment -%>
<% 5.times do |e| -%>
<%= e.to_s  -%>
<% end -%>
<%# comment -%>
3 голосов
/ 12 мая 2011

Как предполагают Ром и Кайл, вы можете передавать параметры в ERB.new, но тогда вы не получите разрывы строк там, где хотите.

require 'erb'
h=<<H
Starting erbOutput
<%# comment %>
<%5.times do |e|%>
<%=e.to_s  %>
<%end %>
<%# comment %>
Ending erbOutput
H
s=ERB.new(h, nil, '<>').result
puts s

дает вам

Starting erbOutput
01234Ending erbOutput

Так что вам нужно явно вставить дополнительные строки

require 'erb'
h=<<H
Starting erbOutput
<%# comment %>
<%5.times do |e|%>
<%=e.to_s  %>

<%end %>
<%# comment %>
Ending erbOutput
H
s=ERB.new(h, nil, '<>').result
puts s

Это даст:

Starting erbOutput
0
1
2
3
4
Ending erbOutput
1 голос
/ 11 мая 2011

Вы можете изменить настройки для erb. Вот краткое руководство: http://www.ruby -forum.com / topic / 55298

0 голосов
/ 11 мая 2011

erb -T 1 foo.erb

Полагаю, в библиотеке есть эквивалентный параметр (вероятно, параметр trim_mode ctor).

...