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

但是,您可能会注意到,这会在链接和逗号之间产生一个空格。有什么实际的方法可以避免这种空白?我知道可以删除标记周围的空格的语法,但是可以将这种语法仅应用于文本吗?我真的不喜欢额外标记的解决方案来完成此任务。

Answers:


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 2011年

1
您可以使用这些帮助程序(大概是succeed专门的)来扩展答案并显示以表达OP的示例吗?在我看来,它仍然看起来并不明显且有点丑陋:gist.github.com/1665374
约翰

16
我感觉好像丢失了一些东西(在查看投票数时),但是成功的变体与原始变体并不等效,因为即使@condition == false,尾部逗号也将被呈现,这比该逗号前的空格更丑陋。
纳什桥

2
我设法通过使用先行而不是成功来获得正确的结果。干杯!
2014年

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&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,2009年

3
它适用于标签,但不适用于表达式;在您的示例中,您已将他的表达式更改为标签。我有同样的问题,很遗憾,这不是解决方案。
铁氟龙泰德

1
我想说&nbsp;一下,它有特殊的意义,它不是普通的空格-它是不间断的空格,这意味着在换行浏览器期间,浏览器会尽一切努力使单词保持&nbsp;在一起,而这并非总是您想要的。
安德鲁

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
Matchu 2010年

世界的另一个注意事项:这些天,我使用Groxx的解决方案:)
Matchu 2011年

这对于生成文本文件的haml很有帮助!在我的情况下,我有一行,其中一部分是由“ if”决定的,我不能用mysamillidea的解决方案解决此问题,因为它不会删除换行符,只是将逗号移到换行符之前。(尽管我同意对于mysmallidea的原始问题的答案是最好的。)
cesoid 2015年

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}

我不喜欢插值中原义字符串的外观,但是我已经将其与先前声明的字符串或之前动态生成的字符串一起使用。


嗯 那是我处理类似问题的通用方法,但我从未想过在其中使用条件。可惜我使用的实际模板比句子的后半部分要复杂得多……但这绝对值得记住,谢谢!
Matchu

5

您可以这样做以保持领先地位:

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

空格在引号中。


3

尽管没有充分记录,但这可以使用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字符(但它比使用帮助器更为有效)。


1

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


那个助手将如何工作?恩,我会看看我能想到的...
Matchu

至于空格压缩,如果不在某种标记定义上,我就无法弄清楚该语法如何工作。我只是在做错什么,还是没有标记该语法不起作用?
Matchu

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编写完整的静态网页之类的事情,这不是我正在做的事情。我提供的代码片段几乎是完整的.haml文件-事实上,它包含一个链接和一个逗号并不能真正表明任何一种方式。
Matchu

1
知道了 我已经编辑了答案,使解决方案能够独立运行。
饼干2010年

尽管这可能行得通,但我认为这使阅读标记变得困难。相反,就像其他人提到的那样,仅使用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代码的结果,但是这里它将达到服务器的目的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.