Haml: Metnin etrafındaki beyaz boşluğu kontrol edin


97

Rails şablonumda, HAML kullanarak bu efekte son HTML'yi elde etmek istiyorum:

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

Yaklaşan şablon:

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

Bununla birlikte, bunun bağlantı ve virgül arasında bir boşluk oluşturduğunu not edebilirsiniz. Bu boşluktan kaçınmanın pratik bir yolu var mı? Etiketlerin etrafındaki boşlukları kaldırmak için sözdizimi olduğunu biliyorum, ancak bu aynı sözdizimi yalnızca metne uygulanabilir mi? Bunu başarmak için ekstra işaretleme çözümünü gerçekten sevmiyorum.

Yanıtlar:


211

Bunu yapmanın daha iyi bir yolu Haml'ın yardımcıları aracılığıyla tanıtıldı:

çevrelemek

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

başarılı :

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

önce :

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

Orijinal soruyu cevaplamak için:

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
Üretir:
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met

1
Güzel zamanlama, bunları Haml'ın kaynağını okuyarak öğrendim. Görünüşe göre bir süredir buralardalar. Bunları ana referans sayfasında belgelememeleri garip ...
Groxx

1
Cevabınızı genişletebilir ve OP örneğini bu yardımcıları kullanarak (muhtemelen succeedözellikle) ifade edebilir misiniz ? Bana hala açık olmayan ve biraz çirkin görünüyor: gist.github.com/1665374
John

16
(Upvotes üzerinde seyir sayarken) bir şey eksik gibi hissediyorum, ama başarılı sondaki virgül bile işlenecek çünkü varyant, orijinal birine eşdeğer değildir @condition == falsebu virgül önce alandan daha fazla çirkin olan.
Nash Bridges

2
Başarılı olmaktansa prekede kullanarak doğru sonucu almayı başardım. Şerefe!
Cam

40

Bunu Haml'ın "beyaz boşlukları kırp" değiştiricisini kullanarak da yapabilirsiniz. Takma >etrafında eklenmesini boşluk engelleyecek bir Haml ilanından sonra:

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

üretir:

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

Bununla birlikte, görebileceğiniz gibi, >değiştirici, bağlantının önündeki beyaz boşluğu da kaldırarak sözcükler ve bağlantı arasındaki istenen boşluğu kaldırır. Henüz bunun güzel bir yolunu bulamadım &nbsp;, "Önce ben yapacağım" ın sonuna eklemek dışında , şöyle:

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

Sonunda, okunması zor pek çok enterpolasyon olmadan istenen çıktıyı üretir:

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
Bunu Haml hile sayfasından aldığımı söylemeyi unuttum, bu çok faydalı: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise

3
Etiketlerle çalışır ancak ifadelerle çalışmaz; Örneğinizde ifadesini bir etikete dönüştürdünüz. Bende de aynı sorun var ve maalesef bu bir çözüm değil.
Teflon Ted

1
Bunun &nbsp;için özel bir anlamı olduğunu söyleyebilirim, sıradan bir boşluk değil - bölünmeyen boşluktur, yani kelime sarma sırasında tarayıcının kelimeleri birbirine bağlı tutmak için her şeyi yapacağı &nbsp;ve bu her zaman istediğiniz şey olmadığı anlamına gelir .
Andrew

1
Andrew'un yorumuna ek olarak, sadece düz bir boşluk &#032;yerine kullanın &nbsp;.
Daniel AR Werner

12

Pekala, kararlaştırdığım çözüm şu:

Yardımcı

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

Görünüm

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

Bu şekilde, beyaz boşluk varsayılan olarak hariç tutulur, ancak yine de onu "\ n" satırıyla açıkça ekleyebilirim. (Çift ters eğik çizgiye ihtiyacı vardır çünkü aksi takdirde HAML bunu gerçek bir satırsonu olarak yorumlar.) Orada daha iyi bir seçenek olup olmadığını bana bildirin!


Dünyaya not: Sonunda aklıma geldim ve bunları yardımcılara taşıdım: P
Matchu

Dünyaya bir not daha: Bugünlerde Groxx'un çözümünü kullanıyorum :)
Matchu

Bir metin dosyası oluşturan haml söz konusu olduğunda bu çok yararlıdır! Benim durumumda, mysamillidea'nın çözümüyle düzeltemediğim bir "eğer" tarafından bir kısmına karar verildiği bir satırım vardı, çünkü satır satırsonlarından kurtulmaz, sadece virgülü satırsonu satırından önce taşır. (Orijinal sorunun cevabı için mysmallidea's en iyisi olduğunu kabul etsem de.)
cesoid

6

HAML'nin 'aligator sözdizimini' kullanabilirsiniz

Boşluk Kaldırma:> ve <

ve <size bir etiketin yanındaki boşluk üzerinde daha fazla kontrol sağlar. > bir etiketi çevreleyen tüm boşlukları kaldırırken, <bir etiketin içindeki tüm boşlukları hemen kaldırır. Onları beyaz boşluğu yiyen timsahlar olarak düşünebilirsiniz:> etiketin dışında yüzler ve dışarıdaki beyaz boşluğu yer ve <etikete bakar ve içerideki beyaz boşluğu yer. Bir etiket tanımının sonuna, sınıf, id ve öznitelik bildirimlerinden sonra ancak / veya = öncesine yerleştirilirler.

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


5

Bu tür şeylere bir kez yaklaştığım yaklaşım, dize enterpolasyonu kullanmaktır:

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

Enterpolasyondaki değişmez dizenin görünümünü beğenmiyorum, ancak daha önce bildirilmiş dizelerle veya dinamik olarak oluşturulmuş dizelerle kullandım.


Mhm. Bu tür şeylere genel yaklaşımım bu, ancak oradaki koşullu ifadeyi kullanmayı hiç düşünmemiştim. Kullandığım asıl şablonun bir cümlenin ikinci yarısından biraz daha karmaşık olması çok yazık ... ama bu kesinlikle hatırlamaya değer - teşekkürler!
Matchu

5

Öndeki boşluğu korumak için bunu yapabilirsiniz:

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

Boşluk tırnak içindedir.


3

İyi belgelenmemiş olmasına rağmen, bu, yardımcılarla değil, bir ASCII alanıyla (& # 32;) birleştirilen HAML beyaz boşluk koruması (>) kullanılarak temiz bir şekilde elde edilir:

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

Bu, istediğinizi üretecektir:

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

Ancak, sayfaya gereksiz ASCII karakterleri eklediği için (ancak yine de yardımcıları kullanmaktan daha verimli) HAML'nin bunu yapmanın daha iyi bir yolunu bulması gerektiğini kabul ediyorum.


1

Açılı ayraç "boşlukları yerinden oynatma" sözdizimi vardır, aksi takdirde bunun için bir yardımcı yöntem yazın.


Bu işe tam olarak nasıl yardımcı olur? Meh, ne bulabileceğime bir
bakacağım

Beyaz boşlukları çiğnemeye gelince, bir tür etiket tanımında değilse bu sözdiziminin nasıl çalışmasını sağlayamıyorum. Yanlış mı yapıyorum yoksa bu sözdizimi bir etiket olmadan çalışmıyor mu?
Matchu

1

Benzer bir sorunla karşılaştım ve bunu buldum, bu yüzden yardımcı bir yöntem gerektirmeyen başka bir çözüm göndereceğimi düşündüm. Bağlantıyı ve if ifadelerini sarmak için Ruby enterpolasyonunu # {} kullanın:

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}

Bu 3.0.18'de çalışır, önceki sürümlerde de çalışabilir.


Kabul edilirse, Haml içerik için tasarlanmamıştır. Yine de orada bahsettiğimiz içerik bu değil. Bu bir şablon. Bu blog gönderisinin yazarı, Haml'da tam bir statik web sayfası yazmak gibi şeylere atıfta bulunuyor, bu benim yaptığım şey değil. Sağladığım kod parçacığı hemen hemen tam bir .hamldosya - bir bağlantı ve bir virgül içermesi, her iki şekilde de hiçbir şeyi belirtmiyor.
Maç

1
Ah, anlıyorum. Cevabımı düzenledim ve çözümü kendi başına bıraktım.
biscuits

Bu işe yarayabilirken, işaretlemeyi okumayı zorlaştırdığını düşünüyorum. Bunun yerine, HAML'nizi temiz ve okunabilir tutan diğer kişilerin de belirttiği gibi <ve> HAML boşluk değiştiricilerini kullanın.
ToddH

1

Geçmişte kullandığım bir başka seçenek daha:

- if @condition
  %span> , then some more text after the link.

0

Ayrıca her zaman şunları da yapabilirsiniz:

= link_to url_path do 
  = ["part_1", "part_2"].join(", ")

0

Çalıştığım çözüm:

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

Sen kullanabilirsiniz =olsa =çıkışa Raylar kod sonucunu kullanılır, ama burada sunucu amaçlı olacak.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.