Хамл:Управляйте пробелами вокруг текста
-
19-09-2019 - |
Вопрос
В моем шаблоне 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
Однако вы можете обратить внимание, что при этом между ссылкой и запятой образуется пробел.Есть ли какой-нибудь практический способ избежать этого пробела?Я знаю, что есть синтаксис для удаления пробелов вокруг тегов, но может ли этот же синтаксис быть применен только к тексту?Мне действительно не нравится решение с дополнительной разметкой для достижения этой цели.
Решение
Лучший способ сделать это был представлен с помощью помощников 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
Другие советы
Вы также можете сделать это с помощью модификатора 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
Однако, как вы можете видеть, >
модификатор также удаляет пробел перед ссылкой, удаляя желаемый пробел между словами и ссылкой.Я пока не придумал, как обойти это, кроме как добавить
до конца "Я буду первым", вот так:
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
Хорошо, вот решение, на котором я останавливаюсь:
Помощник
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
Таким образом, пробелы по умолчанию исключены, но я все равно могу явно включить их в строку " ".(Для этого нужна двойная обратная косая черта, потому что в противном случае HAML интерпретирует ее как фактический перевод строки.) Дайте мне знать, если есть вариант получше!
Вы можете использовать "синтаксис aligator" HAML
Удаление пробелов:> и <
и < дает вам больше контроля над пробелом рядом с тегом.> удалит все пробелы, окружающие тег, в то время как < немедленно удалит все пробелы внутри тега.Вы можете думать о них как об аллигаторах, поедающих пробелы:> выходит за пределы тега и съедает пробел снаружи, и < обращен к тегу и съедает пробел с внутренней стороны.Они помещаются в конец определения тега, после объявлений класса, идентификатора и атрибута, но перед / или = .
http://haml.info/docs/yardoc/file .ССЫЛКА.html#пробелы_удаление__и_
Единственный подход, который я применил к такого рода вещам, заключается в использовании интерполяции строк:
I will first #{link_to 'Link somewhere'}#{', then render this half of the sentence if a condition is met' if condition}
Мне не нравится внешний вид литеральной строки при интерполяции, но я уже использовал ее с ранее объявленными строками или динамически генерируемыми строками.
Вы можете сделать это, чтобы сохранить ведущее пространство:
%a{:href => 'http://example.com'}>= ' link somewhere'
Пробел находится в кавычках.
Хотя это не очень хорошо документировано, это достигается с помощью сохранения пробелов 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 на страницу (но это все равно более эффективно, чем использование помощников).
Существует синтаксис "заглатывания пробелов" в угловых скобках, в противном случае напишите для него вспомогательный метод.
Я столкнулся с похожей проблемой и нашел это, поэтому я подумал, что опубликую другое решение, которое не требует вспомогательного метода.Используйте Ruby interpolation #{} для переноса инструкций link и 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, это также может работать в более ранних версиях.
Еще один вариант, который я использовал в прошлом:
- if @condition
%span> , then some more text after the link.
Вы также всегда могли бы сделать:
= link_to url_path do
= ["part_1", "part_2"].join(", ")
Решение, которое я получил, работая, это:
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-кода, но здесь он будет соответствовать назначению сервера.
В сохранить функция сработала для меня
.white-space-pre= preserve "TEXT"