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({/&/ => '&', /"/ => '"', /</ => '<', />/ => '>'}) end
ソースはこちら。引数のprocの中で$&とか$1を使えるようにするために、妙なことをやってます。あと、正規表現マッチを二重にやってるのが無駄な感じですけど、1回で済ませようとすると、かなり面倒くさそうです。