从Haml输出中自动删除所有换行符

Jo *_*iss 4 haml ruby-on-rails ruby-on-rails-3

我在Rails 3应用程序中使用Haml,它的新行让我疯了!例如,

%span
  foo
Run Code Online (Sandbox Code Playgroud)

呈现为

<span>
foo
</span>
Run Code Online (Sandbox Code Playgroud)

但我更愿意

<span>foo</foo>
Run Code Online (Sandbox Code Playgroud)

原因(除了更清晰的XML)是额外的换行是我的Selenium测试的一个问题,因为它们搞乱了做XPath查询的能力"//span[.='foo']".所以我不得不写'\nfoo\n'(ew!),或者使用//span[contains(text(), 'foo')],它们的匹配范围太广了.

我知道我可以使用鳄鱼操作符("<"和">")去除空格,但由于我没有希望新行出现在输出中的情况,我最后会添加它们机械地在每条线的末端.而这似乎非常不明智.

所以现在我看到两个解决方案:

  1. 强制Haml永远不会发出新行,除非它们来自Ruby表达式.我看到围绕Haml代码传播的一些nuke_inner_whitespace/ nuke_outer_whitespace变量可能会起作用,但我不确定如何在不诉诸无偿的猴子修补的情况下改变它们.
  2. 挂钩到Rails以应用于gsub!("\n", "")所有呈现的HTML.(对于textarea和pre,我仍然可以使用~ "foo\nbar"Haml发射foo&#x000A;bar.)但是哪里是正确的地方挂钩Rails?我在代码中有点迷失.

任何指针或其他建议赞赏!

更新:我已经在下面使用了Jason的猴子补丁一段时间了,我开始认为它不值得.例如,如果我想获得<span>[del]</span> <span>foo</span>,很难在核心之间没有空白区域.即使以下内容也会[del]foo在页面上呈现:

%span
  = '[del] '
%span
  foo
Run Code Online (Sandbox Code Playgroud)

所以我想我会回去手动添加鳄鱼操作员(参见下面的自我回答).活到老,学到老.

再次感谢杰森!:)

Jas*_*red 11

如果在元素名称的末尾放置一个小于号的符号,则内容周围的空格将被抑制:

%span<
  foo
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Haml参考中的空白删除.

似乎没有任何干净的方法强制所有标签上的这些标志,但以下猴子补丁适用于Haml 3.0.24:

module Haml::Precompiler
  def parse_tag_with_nuked_whitespace(line)
    result = parse_tag_without_nuked_whitespace line
    unless result.size == 9 && [false,true].include?(result[4]) && [false,true].include?(result[5])
      raise "Unexpected parse_tag output: #{result.inspect}"
    end
    result[4] = true # nuke_outer_whitespace
    result[5] = true # nuke_inner_whitespace
    result
  end
  alias_method_chain :parse_tag, :nuked_whitespace
end
Run Code Online (Sandbox Code Playgroud)

分叉Haml并为引擎选项添加一个选项以永远核对空格可能并不困难.如果启用,parse_tag方法可以检查此选项,并将内部和外部标志设置为true.我会将此作为练习留给读者.:)