4

このHAML

%script{:type => "text/javascript"}
  :plain
    $(document).ready(function() {
      bar();
      var foo = foo_func("#{}");
    });

予想通り、これは次のようになります。

<script type='text/javascript'>
  $(document).ready(function() {
    bar();
    var foo = foo_func("");
  });
</script>

しかし、このほぼ同一のHAML(にのみ変更bar()prep()

%script{:type => "text/javascript"}
  :plain
    $(document).ready(function() {
      prep();
      var foo = foo_func("#{}");
    });

これを与える:

<script type='text/javascript'>
  $(document).ready(function() {
  prep();
  var foo = foo_func("");
});
</script>

2番目のケースの混乱したインデントに注意してください。

なぜこの奇妙な違いbar()を引き起こすために変更するのでしょうか?prep()

4

1 に答える 1

3

これは、Hamlが空白を処理するために使用している正規表現preに一致する文字が原因です。prep()

Hamlでは、空白を使用して要素の内容を指定します。HTMLを表示すると空白が「押しつぶされ」て単一の文字として表示されるため、通常はこれで問題ありません。ただし、一部のHTML要素(、、および)では空白が重要でpreありcodetextareaHamlはこれらの要素を検出して処理しようとします。この場合、正規表現は一致し、最初の行の後のブロックはインデントされません。

このコードは最新バージョン(現在は4.0.1.rc.1)で変更されており、そのバージョンでは発生しません。また、3-1ブランチの正規表現を修正するプルリクエストを作成しました。

于 2013-03-10T17:45:43.917 に答える