Haml:控制文本周围的空白

时间:2009-08-21 11:30:11

标签: ruby-on-rails 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

但是,您可能会注意到这会在链接和逗号之间产生一个空格。有没有实用的方法来避免这个空白?我知道有删除标签周围空格的语法,但这种语法是否只能应用于文本?我真的不喜欢额外标记的解决方案来实现这一点。

13 个答案:

答案 0 :(得分:206)

通过Haml的帮手介绍了更好的方法:

surround

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

succeed

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

答案 1 :(得分:39)

您也可以使用Haml的“trim whitespace”修饰符来完成此操作。在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

答案 2 :(得分: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会将其解释为实际换行符。)请告诉我是否有更好的选择!

答案 3 :(得分:6)

您可以使用&#39; aligator语法&#39; HAML

  

删除空白:&gt;和&lt;

     

和&lt;让您更好地控制标签附近的空白。 &GT;将删除标签周围的所有空格,而&lt;将立即删除标记内的所有空格。您可以将它们视为鳄鱼吃空白:&gt;面对标签并吃掉外面的空白,&lt;面对标签并吃掉内部的空白。它们放在标签定义的末尾,在类,id和属性声明之后,但在/或=之前。

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

答案 4 :(得分:5)

一旦接近我就采用了这种方法就是使用字符串插值:

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

我不喜欢插值中文字字符串的外观,但我之前使用它与先前声明的字符串或动态生成的字符串。

答案 5 :(得分:5)

您可以这样做以保持领先空间:

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

空格在引号中。

答案 6 :(得分:3)

尽管没有详细记录,但使用HAML空白保留(&gt;)和ASCII空间(&amp;#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字符(但它仍然比使用帮助器更有效)。

答案 7 :(得分:1)

有尖括号“whitespace munching”语法,否则为它编写辅助方法。

答案 8 :(得分: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,它也可以在早期版本中使用。

答案 9 :(得分:1)

我过去使用过的另一种选择:

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

答案 10 :(得分:0)

您也可以随时:

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

答案 11 :(得分: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代码的结果,但在这里它将用于服务目的。

答案 12 :(得分:0)

preserve功能对我有用

public bool IsInBetween(DateTime target, DateTime start, DateTime end) { return start <= target && target <= end; }