# coding: utf-8 class Galakei::Filter::Hankaku < Galakei::Filter::Base zenkaku = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ー) hankaku = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ー) MAPPING = zenkaku.zip(hankaku) def condition? galakei? && response.content_type =~ %r{text/html|application/xhtml\+xml} end def filter doc = Nokogiri::HTML(response.body) response.body = convert_text_content(doc).to_xhtml end def convert_text_content(doc) doc.children.each do |e| if e.kind_of?(Nokogiri::XML::Text) && e.parent.node_name != "textarea" e.content = zenkaku_to_hankaku(e.content) elsif e.node_name == "input" && %w[submit button].include?(e["type"]) e["value"] = zenkaku_to_hankaku(e["value"]) else convert_text_content(e) end end doc end def zenkaku_to_hankaku(s) MAPPING.each {|from, to| s.gsub!(from, to) } s end end