# 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