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

97

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

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

Matchu
источник

Ответы:

211

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

окружать

= 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
Райан Криспин Хениз
источник
1
Хорошее время, я только что узнал об этом, прочитав источник Хэмла. По-видимому, они существуют какое-то время. Странно, что они не документируют их на главной справочной странице ...
Groxx
1
Можете ли вы расширить свой ответ и показать, чтобы выразить пример OP с использованием этих помощников (предположительно succeedспециально)? Мне это все еще кажется неочевидным и немного некрасивым: gist.github.com/1665374
Джон,
16
Я чувствую, что я что - то отсутствую (глядя на upvotes счета), но успех вариант не эквивалентен исходной, так как конечная запятая будет оказана даже если @condition == false, что более уродливое , чем пространство перед этой запятой.
Nash Bridges
2
Мне удалось получить правильный результат, используя прецедент, а не преуспеть. Ура!
Cam
40

Вы также можете сделать это с помощью модификатора 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
Райан Криспин Хениз
источник
1
Забыл упомянуть, что я взял это из шпаргалки Haml, которая очень мне
Райан Криспин Хенез,
3
Он работает с тегами, но не с выражениями; в вашем примере вы изменили его выражение на тег. У меня такая же проблема, и, к сожалению, это не решение.
Teflon Ted
1
Я хотел бы отметить, что это &nbsp;имеет особое значение, это не обычные пробелы - это неразрывные пробелы, что означает, что во время переноса слов браузер будет делать все, чтобы слова были связаны &nbsp;вместе, а это не всегда то, что вы хотите.
Эндрю
1
В дополнение к комментарию Эндрю используйте &#032;вместо &nbsp;простого пробела.
Daniel AR Werner
12

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

Помощник

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

Matchu
источник
Примечание для мира: в конце концов я поумнел и
передал
Еще одно примечание для мира: в эти дни я использую решение
Groxx
Это очень полезно, когда речь идет о haml, который генерирует текстовый файл! В моем случае у меня была одна строка, часть которой была решена с помощью «если», что я не мог исправить с помощью решения mysamillidea, потому что оно не избавляется от символов новой строки, а просто перемещает запятую перед новой строкой. (Хотя я согласен с тем, что для ответа на исходный вопрос лучше всего подходит mysmallidea.)
cesoid
6

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

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

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

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}

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

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

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

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

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

тонкий человек
источник
3

Хотя это плохо документировано, это достигается с помощью сохранения пробелов 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

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

Эндрю Вит
источник
Как именно в этом будет работать помощник? Мех, я посмотрю, что я могу придумать ...
Matchu
Что касается пережевывания пробелов, я не могу понять, как заставить этот синтаксис работать, если он не в каком-то определении тега. Я просто делаю это неправильно, или этот синтаксис не работает без тега?
Matchu
1

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

печенье
источник
Конечно, Haml не предназначен для содержания. Однако это не тот контент, о котором мы говорим. Это шаблон. Автор этого сообщения в блоге имеет в виду такие вещи, как написание полной статической веб-страницы в Haml, а я этим не занимаюсь. Приведенный мной фрагмент кода представляет собой практически полный .hamlфайл - тот факт, что он включает ссылку и запятую, в любом случае ничего не означает.
Matchu
1
Ах я вижу. Я отредактировал свой ответ, оставив решение само по себе.
печенье
Хотя это может сработать, я думаю, что это затрудняет чтение разметки. Вместо этого просто используйте модификаторы пробелов HAML <и>, как упоминали другие люди, которые сохраняют ваш HAML чистым и читаемым.
ToddH
1

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

- if @condition
  %span> , then some more text after the link.
Коллин
источник
0

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

= link_to url_path do 
  = ["part_1", "part_2"].join(", ")
Бэкерман
источник
0

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

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

Арслан Али
источник