SimpleIsm

舞台裏は乱雑に、見えるところはシンプルに。

Hamlで半角スペースが無視される件

最近Hamlにハマっていて、ある程度覚えて使っていたのだけどつまづいた。以下の例を見てほしい。

<p>I eat well Milky Way recently.</p>

こんな感じで、要素を1行で吐き出したい時ってあると思うんだけど、これをHamlで書くと以下のようになる。

%p I eat well Milky Way recently.
%p<
  I eat well Milky Way recently.

文章中にリンクが張ってあるのはよくある話で、「Milky Way」というテキストにリンクを張ってみる。

<p>I eat well <a href="http://www.milkywaybar.com/">Milky Way</a> recently.</p>

上記が出力される理想形。Hamlでやってみる。

%p<
  I eat well
  %a(href="http://www.milkywaybar.com/")> Milky Way
  recently.

これで出力すると以下のようになる。

<p>I eat well<a href="http://www.milkywaybar.com/">Milky Way</a>recently.</p>

ない!「well」と「recently」の間にスペースがない!じゃあスペース入れてみようと思い、やってみた以下の書き方はすべてダメ。

- space = " "
%p<
  I eat well#{space}
  %a(href="http://www.milkywaybar.com/")> Milky Way
  #{space}recently.
- space = "¥s"
%p<
  I eat well#{space}
  %a(href="http://www.milkywaybar.com/")> Milky Way
  #{space}recently.
%p<
  I eat well
  = " "
  %a(href="http://www.milkywaybar.com/")> Milky Way
  = " "
  recently.
%p<
  I eat well
  = "¥s"
  %a(href="http://www.milkywaybar.com/")> Milky Way
  = "¥s"
  recently.

行頭と行末の半角スペースは無視されるようだ。正規表現もダメとは…。

というわけで、表示は変えずに「ソース上では1行で出力する」という要件を満たすためには、以下のようにやるしか方法が見つからなかった。

- space = "&nbsp;"
%p<
  I eat well#{space}
  %a(href="http://www.milkywaybar.com/")> Milky Way
  #{space}recently.
%p<
  I eat well
  = "&nbsp;"
  %a(href="http://www.milkywaybar.com/")> Milky Way
  = "&nbsp;"
  recently.
%p<
  I eat well&nbsp;
  %a(href="http://www.milkywaybar.com/")> Milky Way
  &nbsp;recently.

こうすると以下のように出力されて、意図した表示になり、1行で出力される。

<p>I eat well&nbsp;<a href="http://www.milkywaybar.com/">Milky Way</a>&nbsp;recently.</p>

もうね、全然直感的じゃないし、「軽量マークアップ言語」とはなんだったのでしょう…。Markdownは直感的でメモ書きとかには超便利だと思うけど、要素の細かな指定は普通のHTMLと変わらないし、ならHTML書くときは普通にHTMLでいんじゃないかなぁと思った。

HamlはSassも中で書けるから、1つのファイルで全部1行で出力したらなんかいいなぁ(キャンペーンサイトとか1枚ペラのページ限定だけど)と思ったんだけど、compressedで吐き出す方法分からないし、とりあえず保留しておく。

あ、ちなみに例文の私が最近ミルキーウェイというお菓子に超ハマっているというのはマジです。

追記

か、神様…!

ちょっとlink_toについてはよく分からなかったのだけど(Ruby on Railsかな)、surroundを使うことで解決できた。Module: Haml::Helpersを参考にした。

%p<
  = surround "I eat well ", " recently." do
  %a(href="http://www.milkywaybar.com/")> Milky Way

これで意図した表示になります。@Kyoさんありがとうございました。

Webってこういうのがいいんだよなぁと改めて思った次第です。