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

= surround '(', ')' do
  %a{:href => "food"} chicken
Производит:
(<a href='food'>chicken</a>)

succeed:

click
= succeed '.' do
  %a{:href=>"thing"} here
Производит:
click
<a href='thing'>here</a>.

precede:

= 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

Однако, как вы можете видеть, модификатор > также удаляет пробелы перед ссылкой, удаляя нужное пространство между словами и ссылкой. Я еще не догадался об этом, за исключением добавления &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

Ответ 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
,&#32; 
%a{:href=>'/page'} Next link

Это приведет к тому, что вы хотите:

<a href='/home'>Anchor text</a>,&#32;
<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"