Haml:テキスト周囲の空白を制御する


97

Railsテンプレートでは、HAMLを使用してこの効果を実現する最終的なHTMLを実現したいと思います。

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

これを行うためのより良い方法がHamlのヘルパー経由で導入されました:

囲む

= 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
いいタイミングです。Hamlのソースを読んで、これらについて知りました。どうやら、彼らはしばらくの間存在していた。彼らがメインリファレンスページにそれらを文書化していないのは奇妙です...
Groxx

1
答えを広げて、これらのヘルパーを使用して(おそらくsucceed具体的に)OPの例を表現するように示すことができますか?私にはそれはまだ明白ではなく少し醜いようです:gist.github.com/1665374
John

16
(upvotesに見カウントながら)私は何かが欠けていますような気がしますが、成功末尾にカンマがあってもレンダリングされるので、バリアントは、オリジナルのものと同等ではありません@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」の最後に追加することを除いて、これを回避する方法はまだわかりません。

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;、そしてこれはいつもあなたが望むものではありません。
Andrew

1
Andrewのコメントに加えて、単なる空白の&#032;代わりに&nbsp;を使用してください。
Daniel AR Werner

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のソリューションを使用します:)
Matchu

これは、テキストファイルを生成するhamlに関して非常に役立ちます。私の場合、「if」によってその一部が決定された1行がありましたが、それは改行を取り除かず、改行の前にコンマを移動するだけなので、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}

補間でのリテラル文字列の外観は好きではありませんが、以前に宣言された文字列または動的に生成された文字列で使用しました。


んー それがそのようなことへの私の一般的なアプローチですが、私はそこでコンディショナルを使用することを考えたことはありませんでした。私が使用していた実際のテンプレートが文の後半よりも少し複雑であることが判明したのは残念です...しかし、それは間違いなく覚えておく価値があります-ありがとう!
マッチュ2009

5

これを行うと、先行スペースを維持できます。

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

スペースは引用符で囲まれています。


3

十分に文書化されていませんが、これは、ヘルパーではなく、ASCIIスペース(&#32;)と組み合わせたHAML空白保持(>)を使用して完全に実現されます。

%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

山かっこの「空白のマンチング」構文があります。それ以外の場合は、そのためのヘルパーメソッドを記述します。


その仕事のヘルパーはどのくらい正確ですか?えっと、私が思いつくものを見てみましょう...
マッチ2009

空白のマンチングに関しては、それが何らかのタグ定義にない場合、その構文を機能させる方法を理解することができません。私はそれを間違っているのですか、それともその構文はタグなしでは機能しませんか?
マッチュ2009

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で完全な静的Webページを書くようなことを言及していますが、それは私がやっていることではありません。私が提供したコードスニペットは、ほぼ完全な.hamlファイルです。リンクとコンマが含まれているという事実は、どちらの方法でも実際には何も示していません。
Matchu

1
ああ、なるほど。私は自分の答えを編集しましたが、解決策はそのままにしています。
ビスケット、

これはうまくいくかもしれませんが、マークアップを読みにくくすることになると思います。代わりに、HAMLの空白修飾子<と>を使用してください。他の人が言及したように、HAMLをクリーンで読みやすく維持しています。
ToddH 2011年

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コードの結果を出力するために使用されますが、ここでは目的を果たします。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.