/ 最近 .rdf 追記 編集 設定 本棚

脳log[20080306] バッドノウハウ: ヘッダ/フッタに #{} を含めたいときは



2008年03月06日 (木) 一日遅れで HUNTER×HUNTERの発売に気付く。考えられないミス。

[tDiary]バッドノウハウ: ヘッダ/フッタに #{} を含めたいときは

例えばこんな、<h1>の中身を<title>の中身と同じにし、かつ日記名部分をトップページへのリンクにする、ヘッダはエラーになる。

<h1>
  <a href="<%=h @conf.index%>"><%=@conf.html_title%></a>
  <%=title_tag[/\A<title>#{Regexp.quote h @conf.html_title}(.*?)<\/title>\z/oi, 1]%>
</h1>

原因は

 #{Regexp.quote h @conf.html_title}

この部分が tdiary.conf読み込み時に展開されてしまうから。

  1. \を使ってエスケープしても \自体が tdiary.conf保存時にエスケープされてしまっているので、tdiary.conf読み込み時にはエスケープの意味が残っていない。
  2. 二度 eRubyスクリプトとして評価されるわけではないので <%%= %> も使えない。

結局

 #{'#'}{Regexp.quote h @conf.html_title}

こうなった。

  1. 設定画面に表示されるヘッダの内容は、#{'#'} が # に展開された後のもの(つまり最初の例と全く同じもの)なので、ヘッダを修正するときは毎回 #{ を #{'#'}{ に書き換えた上で保存する必要がある。(面倒。絶対忘れる)
  2. ヘッダの内容に問題があるときは、正常に送信できたように見えて tdiary.confには保存されていないから、(忘れた頃に)絶対ハマる。
  3.  追記

    1と 2のコンボで、ヘッダ/フッダに限らず全ての設定が変更できなくなる。他の設定を保存するときでも、ヘッダの保存部分で失敗するから。(結局 tdiary.confの可読性を犠牲にして String#dumpを使用するしかないようだ)

 追記の追記: #{} の使用は避けるに限る

嫌い*だが tDiary本体をいじくるぐらいならしかたがない。今回のケースは結局 #{} を使わない形に書き換えた。無理矢理使っても面倒なだけだったので……。敗北。

<h1>
  <a href="<%=h @conf.index%>"><%=@conf.html_title%></a>
  <%=title_tag[Regexp.new('\\A<title>'+Regexp.quote(h( @conf.html_title))+'(.*?)</title>\\z', Regexp::IGNORECASE), 1]%>
</h1>

* Regexp.new()のこと。eval()や new Function()と同じくらい嫌い。※new演算子があるのは Rubyではない。