Хамл:Управляйте пробелами вокруг текста

StackOverflow https://stackoverflow.com/questions/1311428

  •  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

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

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

Помощник

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

Это даст то, что вы хотите:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top