Haml: Mengontrol spasi di sekitar teks


97

Di template Rails saya, saya ingin menyelesaikan HTML akhir untuk efek ini menggunakan HAML:

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

Template yang mendekati:

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

Namun, Anda dapat mencatat bahwa ini menghasilkan spasi antara tautan dan koma. Apakah ada cara praktis untuk menghindari whitespace ini? Saya tahu ada sintaks untuk menghapus spasi di sekitar tag, tetapi dapatkah sintaks yang sama ini diterapkan hanya pada teks? Saya benar-benar tidak suka solusi markup ekstra untuk mencapai ini.

Jawaban:


210

Cara yang lebih baik untuk melakukan ini telah diperkenalkan melalui pembantu Haml:

mengelilingi

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

berhasil :

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

mendahului :

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

Untuk menjawab pertanyaan awal:

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

1
Waktu yang tepat, saya baru tahu tentang ini dengan membaca sumber Haml. Rupanya mereka sudah ada cukup lama. Aneh bahwa mereka tidak mendokumentasikannya di halaman referensi utama ...
Groxx

1
Dapatkah Anda memperluas jawaban Anda dan menunjukkan untuk mengekspresikan contoh OP menggunakan bantuan ini (mungkin succeedsecara khusus)? Bagi saya ini masih tampak tidak jelas dan sedikit jelek: gist.github.com/1665374
Yohanes

16
Saya merasa seperti saya kehilangan sesuatu (saat melihat jumlah upvote), tetapi varian yang berhasil tidak setara dengan yang asli, karena tanda koma akan ditampilkan meskipun @condition == false, yang lebih jelek daripada spasi sebelum koma ini.
Nash Bridges

2
Saya berhasil mendapatkan hasil yang benar dengan menggunakan precede, daripada berhasil. Bersulang!
Cam

40

Anda juga dapat melakukan ini menggunakan pengubah "trim whitespace" Haml. Memasukkan >setelah deklarasi Haml akan mencegah penambahan spasi di sekitarnya:

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

menghasilkan:

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

Namun, seperti yang Anda lihat, >pengubah juga menghapus spasi di depan tautan, menghapus spasi yang diinginkan antara kata dan tautan. Saya belum menemukan cara yang bagus untuk menyiasatinya, kecuali untuk menambahkan &nbsp;di akhir "Saya akan dulu", seperti ini:

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

Yang akhirnya menghasilkan keluaran yang diinginkan tanpa banyak interpolasi yang sulit dibaca:

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
Lupa menyebutkan bahwa saya mendapatkan ini dari lembar contekan Haml, yang sangat membantu: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise

3
Ia bekerja dengan tag tetapi bukan ekspresi; dalam contoh Anda, Anda telah mengubah ekspresinya menjadi tag. Saya memiliki masalah yang sama dan sayangnya ini bukan solusi.
Teflon Ted

1
Saya akan berkomentar bahwa &nbsp;memiliki arti khusus untuk itu, ini bukan whitespace biasa - ini adalah whitespace non-breaking, yang berarti bahwa selama word-wrapping browser akan melakukan segalanya untuk menjaga kata-kata tetap terikat &nbsp;dan ini tidak selalu yang Anda inginkan.
Andrew

1
Selain komentar Andrew, gunakan &#032;sebagai pengganti &nbsp;spasi kosong biasa.
Daniel AR Werner

12

Baiklah, inilah solusi yang saya selesaikan:

Pembantu

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

Melihat

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

Dengan cara itu, spasi kosong dikecualikan secara default, tetapi saya masih bisa secara eksplisit memasukkannya dengan baris "\ n". (Perlu garis miring terbalik ganda karena jika tidak, HAML menafsirkannya sebagai baris baru yang sebenarnya.) Beri tahu saya jika ada opsi yang lebih baik di luar sana!


Catatan untuk dunia: Saya akhirnya bangun dan memindahkan ini ke pembantu: P
Matchu

Catatan lain untuk dunia: hari ini, saya menggunakan solusi
Groxx

Ini sangat membantu jika menyangkut haml yang menghasilkan file teks! Dalam kasus saya, saya memiliki satu baris di mana bagiannya ditentukan oleh "jika", yang tidak dapat saya perbaiki dengan solusi mysamillidea karena tidak menghilangkan baris baru, ia hanya memindahkan koma sebelum baris baru. (Meskipun saya setuju bahwa untuk jawaban atas pertanyaan awal mysmallidea adalah yang terbaik.)
cesoid

6

Anda dapat menggunakan 'sintaks aligator' dari HAML

Penghapusan Ruang Putih:> dan <

dan <memberi Anda kontrol lebih besar atas spasi kosong di dekat tag. > akan menghapus semua spasi yang mengelilingi tag, sementara <akan menghapus semua spasi langsung di dalam tag. Anda dapat menganggap mereka sebagai aligator yang memakan spasi:> menghadap keluar dari tag dan memakan spasi putih di luar, dan <menghadapi ke dalam tag dan memakan spasi putih di dalam. Mereka ditempatkan di akhir definisi tag, setelah kelas, id, dan deklarasi atribut tetapi sebelum / atau =.

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


5

Setelah pendekatan yang saya lakukan untuk hal semacam ini adalah dengan menggunakan interpolasi string:

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

Saya tidak suka tampilan string literal dalam interpolasi, tetapi saya telah menggunakannya dengan string yang dinyatakan sebelumnya atau string yang dibuat secara dinamis sebelumnya.


Mhm. Itulah pendekatan umum saya untuk hal-hal seperti itu, tetapi saya tidak pernah berpikir untuk menggunakan kondisional di sana. Sangat disayangkan bahwa template sebenarnya yang saya gunakan ternyata sedikit lebih kompleks daripada hanya paruh kedua kalimat ... tapi itu pasti perlu diingat - terima kasih!
Matchu

5

Anda dapat melakukan ini untuk menjaga ruang terdepan:

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

Spasi ada di tanda kutip.


3

Meskipun tidak terdokumentasi dengan baik, ini dicapai dengan rapi menggunakan pelestarian spasi putih HAML (>) yang dikombinasikan dengan ruang ASCII (& # 32;), dan tidak dengan pembantu:

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

Ini akan menghasilkan apa yang Anda inginkan:

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

Tapi saya setuju, HAML perlu menemukan cara yang lebih baik untuk melakukan ini, karena ia menambahkan karakter ASCII yang tidak perlu ke halaman (tetapi masih lebih efisien daripada menggunakan pembantu).


1

Ada sintaks "whitespace munching" braket sudut, jika tidak, tulis metode pembantu untuk itu.


Bagaimana tepatnya seorang penolong untuk pekerjaan itu? Meh, saya akan melihat apa yang bisa saya
hasilkan

Adapun whitespace mengunyah, saya tidak dapat mengetahui cara membuat sintaks itu berfungsi jika tidak ada pada semacam definisi tag. Apakah saya hanya salah melakukannya, atau apakah sintaks itu tidak berfungsi tanpa tag?
Matchu

1

Saya menemukan masalah serupa dan menemukan ini jadi saya pikir saya akan memposting solusi lain yang tidak memerlukan metode penolong. Gunakan interpolasi Ruby # {} untuk menggabungkan tautan dan pernyataan 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}

Ini berfungsi di 3.0.18, ini juga dapat berfungsi di rilis sebelumnya.


Memang, Haml tidak dirancang untuk konten. Namun, ini bukanlah konten yang kita bicarakan di sana. Itu sebuah template. Penulis posting blog itu mengacu pada hal-hal seperti menulis halaman web statis penuh di Haml, yang bukan itu yang saya lakukan. Cuplikan kode yang saya berikan adalah .hamlfile lengkap - fakta bahwa itu menyertakan tautan dan koma tidak benar-benar menunjukkan apa pun.
Matchu

1
Ah, begitu. Saya telah mengedit jawaban saya, membiarkan solusi berdiri sendiri.
biskuit

Meskipun ini mungkin berhasil, saya pikir itu membuat markup sulit dibaca. Alih-alih, cukup gunakan pengubah spasi putih HAML <dan> seperti yang disebutkan orang lain yang membuat HAML Anda tetap bersih dan dapat dibaca.
ToddH

1

Namun opsi lain yang saya gunakan di masa lalu:

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

0

Anda juga selalu bisa melakukan:

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

0

Solusi yang saya dapatkan adalah:

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

Anda dapat menggunakan =, meskipun =digunakan untuk menampilkan hasil dari kode Rails, tetapi di sini akan menjadi server tujuan.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.