【问题标题】:Auto-removing all newlines from Haml output从 Haml 输出中自动删除所有换行符
【发布时间】:2011-05-18 05:38:32
【问题描述】:

我在 Rails 3 应用程序中使用 Haml,它的换行符让我抓狂!例如,

%span
  foo

呈现为

<span>
foo
</span>

但我更想要

<span>foo</foo>

原因(除了更干净的 XML 之外)是额外的换行对我的 Selenium 测试来说是个问题,因为它们会破坏像 "//span[.='foo']" 这样的 XPath 查询的能力。所以我不得不改写'\nfoo\n'(ew!),或者使用//span[contains(text(), 'foo')],它匹配得太广泛了。

我知道我可以使用鳄鱼运算符(“”)来去除空格,但是因为我从来没有遇到过我想要换行符出现在输出,我最终只是在每行的末尾机械地添加它们。而且这看起来很不干。

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

  1. 强制 Haml 从不发出换行符,除非它们来自 Ruby 表达式。我看到一些 nuke_inner_whitespace / nuke_outer_whitespace 变量散布在可能完成这项工作的 Haml 代码中,但我不确定如何在不求助于无偿猴子修补的情况下更改它们。
  2. 挂钩到 Rails 以将 gsub!("\n", "") 应用于所有呈现的 HTML。 (对于 textarea 和 pre 的,我仍然可以使用 ~ "foo\nbar" 让 Haml 发出 foo&amp;#x000A;bar。)但是在哪里可以挂接到 Rails?我有点迷失在代码中。

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

更新:我已经使用下面的 Jason 的猴子补丁有一段时间了,我开始认为它不值得。例如。如果我想得到&lt;span&gt;[del]&lt;/span&gt; &lt;span&gt;foo&lt;/span&gt;,很难不在被核弹之间留出空白。甚至以下内容也会在页面上呈现为[del]foo:

%span
  = '[del] '
%span
  foo

所以我想我要回去手动添加鳄鱼运算符了(请参阅下面的自我回答)。生活和学习。

再次感谢杰森! :)

【问题讨论】:

  • 如果有一些情况你想保留空格,你可以否定布尔值而不是在猴子补丁中强制它们为真。一般来说,我认为学习喜欢默认空格会更好:)

标签: ruby-on-rails haml ruby-on-rails-3


【解决方案1】:

与@yfeldblum 的回答类似,我决定简单地拆分换行符并加入空格,以避免html 中的换行符呈现为js。例如:

- content = capture_haml do
  %div
    %ul
      %li Stuff
# ...

然后,

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

【讨论】:

    【解决方案2】:

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

    %span<
      foo
    

    有关详细信息,请参阅 Haml 参考中的 whitespace removal。

    似乎没有任何干净的方法可以强制为所有标签启用这些标志,但以下猴子补丁适用于 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
    

    分叉 Haml 并在引擎选项中添加一个选项以始终删除空格可能并不难。如果启用,则 parse_tag 方法可以检查此选项并将内部和外部标志设置为 true。我将把它作为练习留给读者。 :)

    【讨论】:

    • 听起来并不忘恩负义,但我实际上写了“我知道我可以使用鳄鱼运算符(“”)来去除空格”...... ;-) 我不会问一个没有咨询参考的问题,它的价值。
    • 对不起。我完全错过了那一点。
    • Jo:我添加了一个猴子补丁来做你想做的事。没有看到更清洁的方式。
    • 哇,这真的很酷——谢谢!把它放在 config/initializers/haml_nuke_whitespace.rb 中对我很有用。随着猴子补丁的出现,这非常漂亮。我会记住 alias_method_chain 方法。此外,分叉 HAML 以添加适当的选项已正式添加到我的“某天要做的事情”列表中。 :)
    • 对此的更新:我使用了一段时间,但自动剥离所有空白会导致太多痛苦,在实践中不值得。我现在在需要剥离的地方明确添加“”。不过,感谢您的出色回答,杰森!
    【解决方案3】:

    好的,我想我会尝试自我回答我的问题 - 可能没有干净/明智的方法来删除所有换行符,但也许我实际上并不需要它。为了让典型的 XPath 测试表达式正常工作,如果 inline 元素周围没有换行符就足够了。

    所以我想我会在任何包含内联元素(p、li、span、a 等)的标签之后放置一个内部空白符(“

    %div
      %ul
        %li<
          %span<
            stuff...
    

    所有其他(即大多数)换行符都可以保留并且不会造成任何伤害。

    抱歉大家问了这么乱的问题!

    【讨论】:

      【解决方案4】:

      几种方法:

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

      【讨论】:

      • 嗯,好点子。虽然很多时候,我在元素内有大量 HAML 代码,而不是单个“foo”表达式。因此,我认为,将其拉到与 %element 相同的行并不能作为通用解决方案。
      • 使用 Haml 多行语法,这样您就可以将代码分散到多行,但让 Haml 将其视为一行。
      • 其实我相信多行运算符只会跨越 Ruby 代码,而不是嵌套的 HAML 代码。 haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#multiline
      • 多行运算符也将跨越文本,包括嵌套的 HAML。试试看。请注意,这将在输出中包含除最后一个之外的每个管道字符之前的所有空格。
      • 嗯,我不确定你的意思。 "%p |\n ␣␣%span |\n ␣␣␣␣文本 |"将导致

        %span 文本

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多