Haml: Kontroluj białe znaki wokół tekstu

97

W moim szablonie Railsów chciałbym uzyskać ostateczny kod HTML w tym celu za pomocą HAML:

I will first <a href="http://example.com">link somewhere</a>, then render this half of the sentence if a condition is met

Szablon, który się zbliża:

I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
  , then render this half of the sentence if a condition is met

Możesz jednak zauważyć, że tworzy to spację między łączem a przecinkiem. Czy jest jakiś praktyczny sposób na uniknięcie tych białych znaków? Wiem, że istnieje składnia do usuwania białych znaków wokół tagów, ale czy tę samą składnię można zastosować tylko do tekstu? Naprawdę nie podoba mi się rozwiązanie z dodatkowymi znacznikami, aby to osiągnąć.

Matchu
źródło

Odpowiedzi:

211

Lepszy sposób na zrobienie tego został wprowadzony przez pomocników Hamla:

otaczać

= surround '(', ')' do
  %a{:href => "food"} chicken
Produkuje:
(<a href='food'>chicken</a>)

odnieść sukces :

click
= succeed '.' do
  %a{:href=>"thing"} here
Produkuje:
click
<a href='thing'>here</a>.

poprzedzać :

= precede '*' do
  %span.small Not really
Produkuje:
*<span class='small'>Not really</span>

Aby odpowiedzieć na pierwotne pytanie:

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
Produkuje:
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met
Ryan Crispin Heneise
źródło
1
Niezłe wyczucie czasu, właśnie się o tym dowiedziałem czytając źródło Hamla. Najwyraźniej już od jakiegoś czasu. Dziwne, że nie dokumentują ich na głównej stronie referencyjnej ...
Groxx
1
Czy możesz rozszerzyć swoją odpowiedź i pokazać, jak wyrazić przykład PO, używając tych pomocników (prawdopodobnie succeedkonkretnie)? Dla mnie to wciąż wydaje nieoczywiste i trochę brzydki: gist.github.com/1665374
Jan
16
Czuję, że czegoś mi brakuje (patrząc na liczbę głosów za), ale wariant sukcesu nie jest równoważny z oryginalnym, ponieważ końcowy przecinek zostanie renderowany, nawet jeśli @condition == false, co jest bardziej brzydkie niż spacja przed tym przecinkiem.
Nash Bridges
2
Udało mi się uzyskać poprawny wynik, używając metody poprzedzającej, zamiast udać się. Twoje zdrowie!
Cam
40

Możesz to również zrobić za pomocą modyfikatora Hamla „trymowanie białych znaków”. Wstawienie >po deklaracji Haml zapobiegnie dodawaniu wokół niej białych znaków:

I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
  , then render this half of the sentence if a condition is met

produkuje:

I will first<a href='http://example.com'>link somewhere</a>, then render this half of the sentence if a condition is met

Jednak, jak widać, >modyfikator usuwa również białe znaki przed łączem, usuwając pożądaną przestrzeń między słowami a łączem. Nie wymyśliłem jeszcze ładnego sposobu na obejście tego, z wyjątkiem dodania &nbsp;na końcu „Najpierw będę”, na przykład:

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

Który w końcu daje pożądane wyjście bez wielu trudnych do odczytania interpolacji:

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
Ryan Crispin Heneise
źródło
1
Zapomniałem wspomnieć, że dostałem to z ściągawki Haml, co jest bardzo pomocne: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise
3
Działa z tagami, ale nie z wyrażeniami; w twoim przykładzie zmieniłeś jego wyrażenie na tag. Mam ten sam problem i niestety nie jest to rozwiązanie.
Teflon Ted
1
Chciałbym zauważyć, że &nbsp;ma to szczególne znaczenie, nie jest to zwykły biały znak - to nierozerwalny biały znak, co oznacza, że ​​podczas zawijania tekstu przeglądarka zrobiłaby wszystko, aby słowa były ze &nbsp;sobą powiązane, a nie zawsze tego chcesz.
Andrew,
1
Oprócz komentarza Andrzeja, użyj &#032;zamiast &nbsp;zwykłej białej spacji.
Daniel AR Werner,
12

W porządku, oto rozwiązanie, na którym się decyduję:

Pomocnik

def one_line(&block)
  haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n")
end

Widok

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

W ten sposób białe znaki są domyślnie wykluczone, ale nadal mogę jawnie dołączyć je linią „\ n”. (Wymaga podwójnego odwrotnego ukośnika, ponieważ w przeciwnym razie HAML interpretuje go jako rzeczywisty znak nowej linii.) Daj mi znać, jeśli jest lepsza opcja!

Matchu
źródło
Uwaga dla świata: w końcu zmądrzałem i przeniosłem to do pomocników: P
Matchu
Kolejna uwaga dla świata: obecnie używam rozwiązania Groxx :)
Matchu
Jest to bardzo pomocne, jeśli chodzi o haml, który generuje plik tekstowy! W moim przypadku miałem jedną linię, w której część z nich została ustalona przez „if”, czego nie mogłem naprawić za pomocą rozwiązania mysamillidea, ponieważ nie usuwa nowych linii, po prostu przesuwa przecinek przed nową linią. (Chociaż zgadzam się, że odpowiedź na pierwotne pytanie jest najlepsza.)
cesoid.
6

Możesz użyć „składni aligatora” HAML

Usuwanie białych znaków:> i <

i <daje ci większą kontrolę nad spacjami w pobliżu tagu. > usunie wszystkie białe spacje otaczające znacznik, natomiast <usunie wszystkie spacje bezpośrednio w tagu. Możesz myśleć o nich jako o aligatorach zjadających białe znaki:> wychodzi poza znacznik i zjada białą przestrzeń na zewnątrz, a <kieruje się w stronę znacznika i zjada białe znaki w środku. Są umieszczane na końcu definicji znacznika, po deklaracjach class, id i atrybutów, ale przed / lub =.

http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_

Yo Ludke
źródło
5

Kiedyś podejście do tego rodzaju rzeczy polegało na zastosowaniu interpolacji ciągów:

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

Nie podoba mi się wygląd literału ciągu w interpolacji, ale użyłem go wcześniej z wcześniej zadeklarowanymi ciągami lub dynamicznie generowanymi ciągami.

Głaskanie pod brodę
źródło
Mhm. Takie jest moje ogólne podejście do takich rzeczy, ale nigdy nie myślałem o użyciu tam warunku. Szkoda, że ​​rzeczywisty szablon, którego używałem, okazał się nieco bardziej złożony niż tylko druga połowa zdania ... ale zdecydowanie warto o tym pamiętać - dzięki!
Matchu
5

Możesz to zrobić, aby zachować wiodącą spację:

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

Spacja jest w cudzysłowie.

Thethinman
źródło
3

Chociaż nie jest to dobrze udokumentowane, można to łatwo osiągnąć dzięki zachowaniu białych znaków HAML (>) w połączeniu ze spacjami ASCII (& # 32;), a nie za pomocą pomocników:

%a{:href=>'/home'}> Home link
,&#32; 
%a{:href=>'/page'} Next link

Dzięki temu uzyskasz to, czego chcesz:

<a href='/home'>Anchor text</a>,&#32;
<a href='/page'>More text</a>

Ale zgadzam się, HAML musi wymyślić lepszy sposób na zrobienie tego, ponieważ dodaje niepotrzebne znaki ASCII do strony (ale nadal jest bardziej wydajne niż używanie pomocników).

ojak
źródło
1

Istnieje składnia nawiasów ostrych "munching białych znaków", w przeciwnym razie napisz dla niej metodę pomocniczą.

Andrew Vit
źródło
Jak dokładnie pomocnik do tej pracy? Ech, zobaczę, co dam
radę
Jeśli chodzi o żucie białych znaków, nie mogę wymyślić, jak sprawić, by ta składnia działała, jeśli nie ma jej w jakiejś definicji znacznika. Czy robię to źle, czy ta składnia nie działa bez tagu?
Matchu
1

Natknąłem się na podobny problem i znalazłem to, więc pomyślałem, że opublikuję inne rozwiązanie, które nie wymaga metody pomocniczej. Użyj interpolacji języka Ruby # {}, aby zawinąć link i instrukcje 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}

Działa to w 3.0.18, może też działać we wcześniejszych wersjach.

Biszkopty
źródło
To prawda, Haml nie jest przeznaczony do treści. Nie jest to jednak treść, o której tu mówimy. To szablon. Autor tego wpisu na blogu ma na myśli takie rzeczy, jak pisanie pełnej statycznej strony internetowej w języku Haml, co nie jest tym, co robię. Podany przeze mnie fragment kodu to prawie pełny .hamlplik - fakt, że zawiera link i przecinek, tak naprawdę niczego nie wskazuje.
Matchu
1
O, rozumiem. Zredagowałem odpowiedź, pozostawiając rozwiązanie samoistne.
biszkopty
Chociaż może to działać, myślę, że utrudnia to odczytanie znaczników. Zamiast tego po prostu użyj modyfikatorów białych znaków HAML <i>, jak wspominali inni ludzie, dzięki czemu HAML jest czysty i czytelny.
ToddH,
1

Jeszcze inna opcja, z której korzystałem w przeszłości:

- if @condition
  %span> , then some more text after the link.
colllin
źródło
0

Zawsze możesz też zrobić:

= link_to url_path do 
  = ["part_1", "part_2"].join(", ")
bcackerman
źródło
0

Rozwiązanie, które uzyskałem, to:

I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
  = ", then render this half of the sentence if a condition is met"

Możesz użyć =, chociaż =jest używany do wyświetlania wyniku kodu Rails, ale tutaj będzie służył celowi.

Arslan Ali
źródło
0

Funkcja zachowania zadziałała dla mnie

.white-space-pre= preserve "TEXT"

gtournie
źródło