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

Ruby on rails 自动从Haml输出中删除所有换行符,ruby-on-rails,haml,ruby-on-rails-3,Ruby On Rails,Haml,Ruby On Rails 3,我在Rails 3应用程序中使用Haml,它的新词让我发疯!比如说, %span foo 呈现为 <span> foo </span> 因此,我想我要回到手动添加alligator操作符(见下面我的自我回答)。生活和学习 再次感谢杰森!:) 有几种方法: %span foo %span= "foo" - foo = ["f", "o", "o"].join("") %span= foo %span #{"foo"} - foo = ["f", "o", "

我在Rails 3应用程序中使用Haml,它的新词让我发疯!比如说,

%span
  foo
呈现为

<span>
foo
</span>
因此,我想我要回到手动添加alligator操作符(见下面我的自我回答)。生活和学习

再次感谢杰森!:)

有几种方法:

%span foo

%span= "foo"

- foo = ["f", "o", "o"].join("")
%span= foo

%span #{"foo"}

- foo = ["f", "o", "o"].join("")
%span #{foo}

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

%span<
  foo

可能不难找到Haml,并在引擎选项中添加一个选项,以始终使用nuke空格。如果启用,parse_标记方法可以检查此选项,并将内部和外部标志设置为true。我将把这作为练习留给读者。:)

好吧,我想我会尝试自我回答我的问题——可能没有干净/合理的方法删除所有换行符,但也许我实际上并不需要。对于典型的XPath测试表达式来说,如果内联元素周围没有换行符就足够了


因此,我想我将只放置一个内部空格吃符(),类似于@yfeldblum的答案,我决定简单地在换行符上拆分,在空格上联接,以避免在呈现到js中的html中出现换行符。例如:

- content = capture_haml do
  %div
    %ul
      %li Stuff
# ...
然后后来,

:javascript
  var stuff = "#{content.split("\n").join(" ")}";
  // ...

嗯,说得好。虽然很多次,而不是一个“foo”"表达式中,我在元素中有大量的HAML代码。因此,我认为将其与%元素放在同一行中并不是一个通用的解决方案。使用HAML多行语法可以将代码分散到多行中,但HAML将其视为一行。实际上,我相信多行运算符只能跨Ruby代码,而不是嵌套的HAML代码。多行运算符也将跨越文本,包括嵌套的HAML。请尝试。请注意,这将在输出中包括每个管道字符前面的所有空格,最后一个除外。Hm,我不确定您的意思。“%p |\n␣␣%span |\n␣␣␣␣text |“将导致%span text

听起来不是忘恩负义,但我实际上写了“我知道我可以使用alligator运算符(“”)去除空白”…;-)如果不查阅参考资料,我不会问任何问题,因为这是值得的。对不起。乔:我加了一个猴子补丁来做你想做的事。看不到更干净的方式。哇,太酷了——谢谢!把这个放在config/initializers/haml_nuke_whitespace.rb中对我来说非常有用。随着猴子补丁的出现,这是令人惊讶的美丽。我会记得别名法。此外,forking HAML添加一个适当的选项已适当添加到我的“某天要做的事情”列表中:关于这一点的更新:我用了一点,但自动剥离所有空白结果导致太多的痛苦,不值得在实践中使用。我现在在需要它的地方显式地添加“”。不过,谢谢你的回答,杰森!如果有一些情况下你想保留空格,你可以否定布尔值,而不是在猴子补丁中强迫它们为真。一般来说,我认为最好学会喜欢默认的空白:)
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
%div
  %ul
    %li<
      %span<
        stuff...
- content = capture_haml do
  %div
    %ul
      %li Stuff
# ...
:javascript
  var stuff = "#{content.split("\n").join(" ")}";
  // ...