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

Лично, я всегда находил термин "синтаксическим сахаром" неоднозначный. Я имею в виду, хотите ли Вы стать техническими, примерно что-нибудь кроме основной арифметики, если оператор и goto являются синтаксическим сахаром.

я думаю, что имеет в виду большинство людей, когда они отклоняют "синтаксический сахар", то, что функция языка делает, что-то усложнило чрезмерно простой. Самым известным примером этого является Perl. Но так как я не эксперт по Perl, я дам Вам пример того, о чем я говорю в Python (взятый от этот вопрос ):

reduce(list.__add__, map(lambda x: list(x), [mi.image_set.all() for mi in list_of_menuitems]))

Это - очевидная попытка создания чего-то более простого, которое уводят ужасно, ужасно неправильно.

Но это вовсе не значит я нахожусь на стороне удаления таких функций все же. Я думаю, что такие функции просто должны быть использованы тщательно.

96
задан Arslan Ali 24 November 2015 в 10:04
поделиться

6 ответов

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

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

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

5
ответ дан 24 November 2019 в 05:32
поделиться

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

Помощник

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

12
ответ дан 24 November 2019 в 05:32
поделиться

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

1
ответ дан 24 November 2019 в 05:32
поделиться

Вы также можете сделать это, используя модификатор 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
39
ответ дан 24 November 2019 в 05:32
поделиться

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

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

Пробел заключен в кавычки.

5
ответ дан 24 November 2019 в 05:32
поделиться

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

3
ответ дан 24 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: