Haml: контроль пробелов вокруг текста

В моем шаблоне Rails я хотел бы выполнить окончательный HTML для этого с помощью HAML:

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
= link_to 'link somewhere', 'http://example.com'
- if @condition
  , then render this half of the sentence if a condition is met

Однако вы можете заметить, что это создает пробел между ссылкой и запятой. Есть ли какой-нибудь практический способ избежать этого пробела? Я знаю, что есть синтаксис для удаления пробелов вокруг тегов, но можно ли применить тот же синтаксис только к тексту? Мне действительно не нравится решение дополнительной разметки для достижения этой цели.


person Matchu    schedule 21.08.2009    source источник


Ответы (13)


Лучший способ сделать это был представлен с помощью хелперов Haml:

окружение

= surround '(', ')' do
  %a{:href => "food"} chicken
Produces:
(<a href='food'>chicken</a>)

успешно:

click
= succeed '.' do
  %a{:href=>"thing"} here
Produces:
click
<a href='thing'>here</a>.

предшествовать:

= precede '*' do
  %span.small Not really
Produces:
*<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
Produces:
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met
person Ryan Crispin Heneise    schedule 08.06.2011
comment
Хорошее время, я только что узнал об этом, прочитав источник Haml. Судя по всему, они были здесь некоторое время. Странно, что они не документируют их на главной справочной странице... - person Groxx; 11.06.2011
comment
Можете ли вы расширить свой ответ и показать, как выразить пример OP, используя этих помощников (предположительно, succeed конкретно)? Мне это все еще кажется неочевидным и немного некрасивым: gist.github.com/1665374 - person John; 24.01.2012
comment
Я чувствую, что что-то упускаю (при просмотре количества голосов), но вариант succeed не эквивалентен исходному варианту, потому что конечная запятая будет отображаться, даже если @condition == false, что более уродливо, чем пробел перед этой запятой. - person Nash Bridges; 29.06.2012
comment
Мне удалось получить правильный результат, используя предшествование, а не успех. Ваше здоровье! - person Cam; 20.10.2014

Вы также можете сделать это, используя модификатор Haml "обрезать пробелы". Вставка > после объявления 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

Однако, как видите, модификатор > также убирает пробел перед ссылкой, удаляя нужный пробел между словами и ссылкой. Я еще не придумал, как это обойти, кроме как добавить &nbsp; в конец «сначала буду», вот так:

I will first&nbsp;
%a{:href => 'http://example.com'}> link somewhere
- if @condition
  , then render this half of the sentence if a condition is met

Что, наконец, дает желаемый результат без большого количества трудночитаемой интерполяции:

I will first&nbsp;<span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met
person Ryan Crispin Heneise    schedule 07.10.2009
comment
Забыл упомянуть, что я получил это из шпаргалки Haml, которая очень полезна: cheat.errtheblog.com /s/хамл - person Ryan Crispin Heneise; 07.10.2009
comment
Он работает с тегами, но не с выражениями; в вашем примере вы изменили его выражение на тег. У меня такая же проблема, и, к сожалению, это не решение. - person Teflon Ted; 22.10.2009
comment
Я хотел бы отметить, что &nbsp; имеет особое значение, это не обычный пробел - это неразрывный пробел, что означает, что во время переноса слов браузер сделает все, чтобы слова, связанные с &nbsp;, были вместе, а это не всегда то, что вы хотите . - person Andrew; 03.02.2013
comment
В дополнение к комментарию Эндрю используйте &#032; вместо &nbsp; для простого пробела. - person Daniel A. R. Werner; 10.04.2016

Хорошо, вот решение, на котором я остановился:

Помощник

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 интерпретирует его как настоящую новую строку.) Дайте мне знать, если есть вариант получше!

person Matchu    schedule 21.08.2009
comment
Примечание для мира: в конце концов я поумнел и переместил их в помощники: P - person Matchu; 29.01.2010
comment
Еще одно замечание для мира: сейчас я использую решение Groxx :) - person Matchu; 14.07.2011
comment
Это очень полезно, когда речь идет о haml, который создает текстовый файл! В моем случае у меня была одна строка, часть которой была определена с помощью if, которую я не мог исправить с помощью решения mysamillidea, потому что оно не избавляется от новых строк, а просто перемещает запятую перед новой строкой. (Хотя я согласен с тем, что для ответа на исходный вопрос лучше всего подходит mysmallidea.) - person cesoid; 13.07.2015

Вы можете использовать «синтаксис алигатора» HAML

Удаление пробелов: > и ‹

и ‹ дают вам больше контроля над пробелами рядом с тегом. > удалит все пробелы вокруг тега, а ‹ удалит все пробелы непосредственно внутри тега. Вы можете думать о них как об аллигаторах, поедающих пробелы: > сталкивается с тегом и поедает пробелы снаружи, а ‹ сталкивается с тегом и поедает пробелы внутри. Они помещаются в конце определения тега, после объявлений класса, идентификатора и атрибута, но перед / или =.

http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_

person Yo Ludke    schedule 24.02.2015

Когда-то подход, который я использовал для такого рода вещей, заключался в использовании интерполяции строк:

I will first #{link_to 'Link somewhere'}#{', then render this half of the sentence if a condition is met' if condition}

Мне не нравится внешний вид литеральной строки в интерполяции, но раньше я использовал ее с ранее объявленными строками или динамически сгенерированными строками.

person Chuck    schedule 21.08.2009
comment
Ммм. Это мой общий подход к подобным вещам, но я никогда не думал использовать там условное выражение. Жаль, что фактический шаблон, который я использовал, оказался немного сложнее, чем просто вторая половина предложения ... но это определенно стоит запомнить - спасибо! - person Matchu; 22.08.2009

Вы можете сделать это, чтобы сохранить ведущее пространство:

%a{:href => 'http://example.com'}>= ' link somewhere'

Пробел в кавычках.

person thethinman    schedule 17.10.2009

Хотя это не очень хорошо задокументировано, это достигается с помощью сохранения пробелов HAML (>) в сочетании с пробелом ASCII (& # 32;), а не с помощью помощников:

%a{:href=>'/home'}> Home link
,&#32; 
%a{:href=>'/page'} Next link

Это произведет то, что вы хотите:

<a href='/home'>Anchor text</a>,&#32;
<a href='/page'>More text</a>

Но я согласен, HAML должен придумать лучший способ сделать это, так как он добавляет на страницу ненужные символы ASCII (но это все же более эффективно, чем использование помощников).

person ojak    schedule 16.11.2009

Там есть синтаксис угловой скобки «пережевывание пробелов», в противном случае напишите для него вспомогательный метод.

person Andrew Vit    schedule 21.08.2009
comment
Как именно помощник для этой работы? Мех, я посмотрю, что я могу придумать... - person Matchu; 21.08.2009
comment
Что касается пережевывания пробелов, я не могу понять, как заставить этот синтаксис работать, если он не относится к какому-то определению тега. Я просто делаю это неправильно, или этот синтаксис не работает без тега? - person Matchu; 21.08.2009

Я столкнулся с похожей проблемой и нашел это, поэтому решил опубликовать другое решение, которое не требует вспомогательного метода. Используйте интерполяцию 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, может работать и в более ранних версиях.

person biscuits    schedule 18.09.2010
comment
Конечно, Haml не предназначен для контента. Однако это не то содержание, о котором мы говорим. Это шаблон. Автор этого сообщения в блоге имеет в виду такие вещи, как написание полной статической веб-страницы на Haml, что я не делаю. Фрагмент кода, который я предоставил, представляет собой почти полный файл .haml — тот факт, что он включает ссылку и запятую, на самом деле ни о чем не говорит. - person Matchu; 19.09.2010
comment
Ах я вижу. Я отредактировал свой ответ, оставив решение самостоятельно. - person biscuits; 19.09.2010
comment
Хотя это может работать, я думаю, что это делает разметку трудночитаемой. Вместо этого просто используйте модификаторы пробелов HAML ‹ и ›, как упоминали другие люди, которые сохраняют ваш HAML чистым и удобочитаемым. - person ToddH; 19.03.2011

Еще один вариант, который я использовал в прошлом:

- if @condition
  %span> , then some more text after the link.
person colllin    schedule 13.04.2013

Вы также всегда можете сделать:

= link_to url_path do 
  = ["part_1", "part_2"].join(", ")
person bcackerman    schedule 10.09.2014

Решение, которое я получил, это:

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, но здесь он будет служить цели.

person Arslan Ali    schedule 24.11.2015

У меня сработала функция preserve.

.white-space-pre= preserve "TEXT"

person gtournie    schedule 20.04.2017