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

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

Відповіді:


210

Кращий спосіб зробити це було введено через помічників Хамла:

оточити

= 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
Гарний термін, я щойно дізнався про них, прочитавши джерело Хамля. Мабуть, вони були деякий час. Як не
дивно,

1
Чи можете ви розширити свою відповідь і показати, щоб висловити приклад OP, використовуючи ці помічники (імовірно, succeedконкретно)? Для мене це все ще здається неочевидним і трохи потворним: gist.github.com/1665374
Джон

16
Я відчуваю, що мені щось не вистачає (дивлячись на кількість підрахунків), але варіант успіху не є еквівалентним оригіналу, тому що третя кома буде виведена, навіть якщо @condition == falseце некрасиво, ніж пробіл перед цією комою.
Неш Мости

2
Мені вдалося отримати правильний результат, скориставшись попереднім, а не успішним. Ура!
Камер

40

Ви також можете зробити це за допомогою модифікатора 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

1
Забув згадати, що я отримав це з шпаргалки Haml, що дуже корисно: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise

3
Він працює з тегами, але не з виразами; у вашому прикладі ви змінили його вираз на тег. У мене те саме питання, і, на жаль, це не є рішенням.
Тефлоновий Тед

1
Я зауважу, що &nbsp;це має особливе значення, це не звичайний пробіл - це нерозривна пробіл, а це означає, що під час перенесення текстового браузера буде зроблено все, щоб слова були пов'язані між &nbsp;собою, і це не завжди те, що ви хочете.
Андрій

1
Окрім коментаря Ендрю, використовуйте &#032;замість &nbsp;просто простого пробілу.
Даніель АР Вернер

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 трактує це як фактичний новий рядок.) Дайте мені знати, чи є кращий варіант там!


Примітка до світу: Я врешті-решт подумав і перемістив їх до помічників: P
Матву

Ще одна світова нота: сьогодні я використовую рішення
Groxx

Це дуже корисно, коли мова йде про haml, який генерує текстовий файл! У моєму випадку у мене був один рядок, де частина його вирішувалась "якщо", яку я не зміг виправити рішенням mysamillidea, оскільки він не позбувся нових рядків, він просто переміщує кому перед новим рядком. (Хоча я згоден, що для відповіді на оригінальне запитання mysmallidea найкраще.)
цезоїд

6

Ви можете використовувати 'синтаксис аллігатора' HAML

Видалення пробілів:> та <

і <дати вам більше контролю над пробілом біля тегу. > видалить усе пробіли, що оточують тег, тоді як <видалить все пробіли безпосередньо в тезі. Ви можете думати про них як про алігаторів, які їдять пробіл:> обличчя поза тегом і їсть пробіл ззовні, а <обличчя в тег і їсть пробіл з внутрішньої сторони. Вони розміщуються в кінці визначення тегів після оголошень класу, id та атрибутів, але перед / або =.

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}

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


Гмм. Це мій загальний підхід до подібних речей, але я ніколи не думав використовувати там умовне. Прикро, що власне шаблон, який я використовував, виявився трохи складнішим, ніж лише друга половина речення ... але це, безумовно, варто пам’ятати - дякую!
Матву

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

Існує синтаксис кутової дужки "пробіл", інакше напишіть для нього допоміжний метод.


Як саме помічник для цієї роботи? Ме, я подивлюсь, що я можу придумати ...
Матчу

Що стосується жування простору пробілів, я не можу розробити, як змусити цей синтаксис працювати, якщо він не визначений у визначеному тезі. Я просто роблю це неправильно, чи цей синтаксис не працює без тегу?
Матчу

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файлом - той факт, що він містить посилання та кому, насправді нічого не вказує.
Матчу

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, але тут він буде сервером призначення.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.