QA@IT

Hamlでerbの「-%>」(直後の改行を出力しない)を実現するには?

3240 PV

Hamlでerbの「-%>」(直後の改行を出力しない)を実現するにはどうすればいいのでしょう?

例:

%td
  - 5.times do


● ● ● ● ●

※上記の●を半角スペース無しで表示したいです。

  • hamlで「<% foo = 'bar' -%>」みたいな式を「- foo = 'bar'」と書くと、その場合は画面に改行は出力されないと感じましたが、たぶんお求めの回答は違うのかなあ、とも思うので、ヒントとしてもう少し具体的な例をいただけると助かります。 -
  • コメントありがとうございます。
    実際にやりたい例を追記してみました。
    -

回答

たしかに、hamlだとイテレータで回しながらそのまま出力すると改行が入りますね。

hamlにはタグ内外の空白を除去するための記法はあるのですが(リファレンスの「Whitespace Removal: > and <」に載ってます)、そのためにはタグが必要です。

空白除去記法の置き場所は、タグの定義のclass,id,属性の後ろかつ'/'や'='の前で、記法を簡単に説明すると次の通りです。

  • >: タグの周囲の空白を取り除く(鰐がタグの外側の空白を食べる、と覚える)
  • <: タグの中の空白を取り除く(鰐がタグの中にある空白を食べる、と覚える)
  • ><: 上記2つの合わせ技(「こうですかわかりません!」と覚える)

これを踏まえると、パッと思いつく作戦は2つあります。

1. あらかじめ文字列を組み立てておいて、一回で表示する

%td<
  = (1..5).each_with_object(''){|_, s| s << '●' }

とすれば、出力は以下のようになるので、●の間の改行ぶんの空白は出なくなります(私はよくこのやり方でやってます)。

<td>●●●●●</td>

2. spanタグで囲う

たとえばspanで囲めば、空白除去の記法を普通に使えるので、こう書けます。

%td
  -5.times do
    %span><

この場合、出力は次の通りです:

<td><span></span><span></span><span></span><span></span><span></span></td>

参考になれば幸いです。

編集 履歴 (1)
  • ありがとうございます。
    正に、やりたい事がそのまま実現出来そうです。
    ●の部分を画像にしたい時とかも2.の方法で出来そうですね。
    -

タグが付いている場合の改行の追い出しは kakutani さんがおっしゃられているので、
タグ無しの場合(上記のコード例の場合限定)で、

%td<
  = "●" * 5
-#出力:<td>●●●●●</td>

というように、事前に文字列を組み立てるのが一番簡単だと思います。

編集 履歴 (1)
  • "●" * 5 !! -
  • おー、なるほど。
    これはこれでスマートですね。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。