Sha256: 8f70b53ff018b97195e500dfa660dcfb5b1a228b5eb4693682907da23e0ffcf3

Contents?: true

Size: 1.77 KB

Versions: 7

Compression:

Stored size: 1.77 KB

Contents

# coding: utf-8
=begin
For galakei, zenkaku katakana such as カタカナ will be converted to hankaku like カタカナ automatically when rendering html. This is standard practice, as zenkaku katakana taxes up too much screen space.
=end
class Galakei::Filter::Hankaku < Galakei::Filter::Base
  zenkaku = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ー)
  hankaku = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ー)
  # :stopdoc:
  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

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
galakei-0.13.7 lib/galakei/filter/hankaku.rb
galakei-0.13.6 lib/galakei/filter/hankaku.rb
galakei-0.13.5 lib/galakei/filter/hankaku.rb
galakei-0.13.4 lib/galakei/filter/hankaku.rb
galakei-0.13.3 lib/galakei/filter/hankaku.rb
galakei-0.13.2 lib/galakei/filter/hankaku.rb
galakei-0.13.1 lib/galakei/filter/hankaku.rb