monthly gimite

試験運用中。

gsub_multi

るびま10号の「あなたの Ruby コードを添削します」を(今頃になって)読んでて、複数の「正規表現→置換後文字列」ペアを同時に指定できるgsubがあれば便利なのかなぁ、と思って、ちょっと作ってみました。

これを使えば、上の記事に出てくるparse_inlineとHTMLUtils#escapeはこんな感じに。

def parse_inline(str)
  str.gsub_multi({
    /[&<>"]/ =>
      proc{ escape($&) },
    /\[\[(.+?):\s*(https?:\/\/\S+)\s*\]\]/ =>
      proc{ a_href($2, $1, 'outlink') },
    autolink_re() =>
      proc{ a_href(page_uri($&), $&, 'pagelink') },
    URI.regexp('http') =>
      proc{ a_href($&, $&, 'outlink') },
  })
end

def escape(str)
  str.gsub_multi({/&/ => '&amp;', /"/ => '&quot;', /</ => '&lt;', />/ => '&gt;'})
end

ソースはこちら。引数のprocの中で$&とか$1を使えるようにするために、妙なことをやってます。あと、正規表現マッチを二重にやってるのが無駄な感じですけど、1回で済ませようとすると、かなり面倒くさそうです。