Haml: контроль пробелов вокруг текста
В моем шаблоне Rails я хотел бы сделать окончательный HTML для этого, используя HAML:
I will first <a href="#" onclick="location.href='http://example.com'; return false;">link somewhere</a>, then render this half of the sentence if a condition is met
Шаблон, который близок:
I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
, then render this half of the sentence if a condition is met
Однако вы можете заметить, что это создает пробел между ссылкой и запятой. Есть ли какой-либо практический способ избежать этого пробела? Я знаю, что там синтаксис для удаления пробелов вокруг тегов, но может ли этот же синтаксис применяться только к тексту? Мне действительно не нравится решение дополнительной разметки, чтобы выполнить это.
Ответы
Ответ 1
Лучший способ сделать это был введен через помощников Хамла:
= surround '(', ')' do
%a{:href => "food"} chicken
Производит:
(<a href='food'>chicken</a>)
click
= succeed '.' do
%a{:href=>"thing"} here
Производит:
click
<a href='thing'>here</a>.
= precede '*' do
%span.small Not really
Производит:
*<span class='small'>Not really</span>
Чтобы ответить на исходный вопрос:
I will first
= succeed ',' do
= link_to 'link somewhere', 'http://example.com'
- if @condition
then render this half of the sentence if a condition is met
Производит:
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met
Ответ 2
Вы также можете сделать это, используя модификатор Haml "trim whitespace". Вставка >
после объявления Haml будет препятствовать добавлению пробелов:
I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
, then render this half of the sentence if a condition is met
производит:
I will first<a href='http://example.com'>link somewhere</a>, then render this half of the sentence if a condition is met
Однако, как вы можете видеть, модификатор >
также удаляет пробелы перед ссылкой, удаляя нужное пространство между словами и ссылкой. Я еще не догадался об этом, за исключением добавления
в конец "Я сначала", например:
I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
, then render this half of the sentence if a condition is met
Что, наконец, дает желаемый результат без большого количества трудночитаемой интерполяции:
I will first <span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met
Ответ 3
Хорошо, вот решение, на котором я опираюсь:
Помощник
def one_line(&block)
haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n")
end
Вид
I will first
- one_line do
= link_to 'link somewhere', 'http://example.com'
- if @condition
, then render this half of the sentence
\\n
if a condition is met
Таким образом, по умолчанию исключение пробелов исключается, но я все же могу явно включить его в строку "\n". (Для этого нужна двойная обратная косая черта, потому что в противном случае HAML интерпретирует ее как фактическую строку новой строки.) Сообщите мне, есть ли там лучший вариант!
Ответ 4
Вы можете использовать синтаксис "aligator" для HAML
Удаление пробелов: > и <
и < дайте вам больше контроля над пробелами рядом с тегом. > удалит все пробелы, окружающие тег, в то время как < удалит все пробелы сразу в теге. Вы можете думать о них как о аллигаторах, которые едят пробелы: > обращается лицом к тегу и ест пустое пространство снаружи, сталкивается с тегом и ест пустое пространство внутри. Theyre помещается в конце определения тега после объявлений класса, id и атрибутов, но до/или =.
http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_
Ответ 5
Когда-то подход, который я использовал для этого, - использовать интерполяцию строк:
I will first #{link_to 'Link somewhere'}#{', then render this half of the sentence if a condition is met' if condition}
Мне не нравится внешний вид литеральной строки в интерполяции, но раньше я использовал ее с ранее объявленными строками или динамически сгенерированными строками.
Ответ 6
Вы можете сделать это, чтобы сохранить ведущее пространство:
%a{:href => 'http://example.com'}>= ' link somewhere'
Пробел находится в кавычках.
Ответ 7
Несмотря на то, что документация не была хорошо документирована, это достигается с помощью сохранения пробелов HAML ( > ) в сочетании с пространством ASCII (& # 32;), а не с помощью помощников:
%a{:href=>'/home'}> Home link
, 
%a{:href=>'/page'} Next link
Это приведет к тому, что вы хотите:
<a href='/home'>Anchor text</a>, 
<a href='/page'>More text</a>
Но я согласен, HAML должен придумать лучший способ сделать это, поскольку он добавляет ненужные символы ASCII на страницу (но он по-прежнему более эффективен, чем использование помощников).
Ответ 8
Там синтаксис угловой скобки "whitespace munching", иначе напишите для него вспомогательный метод.
Ответ 9
Я столкнулся с подобной проблемой и нашел это, поэтому я подумал, что опубликую другое решение, которое не требует вспомогательного метода. Используйте интерполяцию Ruby # {}, чтобы обернуть ссылки и операторы if:
I will first
#{link_to 'link somewhere', 'http://example.com'}#{if true : ", then render this half of the sentence if a condition is met" end}
Это работает в версии 3.0.18, оно также может работать в более ранних версиях.
Ответ 10
Еще один вариант, который я использовал в прошлом:
- if @condition
%span> , then some more text after the link.
Ответ 11
Вы также всегда можете делать:
= link_to url_path do
= ["part_1", "part_2"].join(", ")
Ответ 12
Решение, которое я получил, это:
I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
= ", then render this half of the sentence if a condition is met"
Вы можете использовать =
, хотя =
используется для вывода результата кода Rails, но здесь он будет использовать сервер.
Ответ 13
Функция preserve работала для меня
.white-space-pre= preserve "TEXT"