Haml: управление пробелами вокруг текста - PullRequest
94 голосов
/ 21 августа 2009

В моем шаблоне 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

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

Ответы [ 13 ]

206 голосов
/ 08 июня 2011

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

объемный

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

1010 * успех *:

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
39 голосов
/ 07 октября 2009

Вы также можете сделать это, используя модификатор 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
12 голосов
/ 21 августа 2009

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

Helper

def one_line(&block)
  haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n")
end

View

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

6 голосов
/ 24 февраля 2015

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

Удаление пробелов:> и <</p>

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

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

5 голосов
/ 17 октября 2009

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

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

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

5 голосов
/ 21 августа 2009

Как только я прибег к подобным вещам, я использую интерполяцию строк:

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

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

3 голосов
/ 16 ноября 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 на страницу (но это все же более эффективно, чем использование помощников).

1 голос
/ 13 апреля 2013

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

- if @condition
  %span> , then some more text after the link.
1 голос
/ 19 сентября 2010

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

1 голос
/ 21 августа 2009

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

...