web-dev-qa-db-ja.com

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

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

ただし、これにより、リンクとコンマの間にスペースが生じることに注意してください。この空白を回避する実用的な方法はありますか?タグの周囲の空白を削除する構文があることは知っていますが、この同じ構文をテキストだけに適用できますか?私はこれを達成するための余分なマークアップのソリューションが本当に好きではありません。

94
Matchu

これを行うためのより良い方法は、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

= 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
207
BoosterStage

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&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
39
BoosterStage

さて、私が解決しようとしているソリューションは次のとおりです。

ヘルパー

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は実際の改行として解釈するため、二重バックスラッシュが必要です。)より良いオプションがあるかどうかを教えてください!

12
Matchu

HAMLの「アリゲーター構文」を使用できます

空白の削除:>および<

および<タグの近くの空白をより詳細に制御できます。 >はタグを囲むすべての空白を削除し、<はタグ内のすべての空白をすぐに削除します。それらは、ワニが空白を食べていると考えることができます。タグ定義の最後、クラス、ID、および属性宣言の後、/または=の前に配置されます。

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

6
Yo Ludke

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

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

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

5
thethinman

私がこの種のことに取り組んだアプローチは、文字列補間を使用することです。

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

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

5
Chuck

十分に文書化されていませんが、これは、HAMLホワイトスペース保存(>)とASCIIスペース(&#32;))を組み合わせて、ヘルパーではなくきれいに実現します。

%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文字をページに追加しますが、ヘルパーを使用するよりも効率的です)、これを行うより良い方法を考え出す必要があります。

3
ojak

山括弧「空白むしゃむしゃ」構文があります。そうでない場合は、ヘルパーメソッドを記述します。

1
Andrew Vit

過去に使用したことのある別のオプション:

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

私は同様の問題に遭遇し、これを見つけたので、ヘルパーメソッドを必要としない別のソリューションを投稿すると思いました。 Ruby Interpolation#{}を使用して、リンクと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で機能しますが、以前のリリースでも機能する場合があります。

1
biscuits

私が働いた解決策は次のとおりです。

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

0
Arslan Ali

preserve 関数は私のために働いた

.white-space-pre= preserve "TEXT"

0
gtournie

また、常に行うことができます:

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