読者です 読者をやめる 読者になる 読者になる

モバイルサイト用のヘッダ出力を Ruby で書いてみた

モバイルサイト用のヘッダ出力を Python で書いてみた - Tosshi Note

モバイルサイトを3キャリアでほぼ共通化して作りたい - http://d.hatena.ne.jp/tilfin/20080530/1212376626
上記のエントリで DoCoMo, au, SoftBank 用のモバイルサイトを XHTML で作成する場合のそれぞれの書き方を調べた。
その書き方に従って HTTP ヘッダと XHTML 宣言部分を出力する CGI サンプルを Python で書いてみた。

で書いたスクリプトを今度は Ruby で書いてみました。

require 'kconv'

class UserAgent
  def initialize(ua)
    if ua.nil?
      @kind =  0
    elsif ua.match(/^DoCoMo/)
      @kind =  1
    elsif ua.match(/^KDDI/)
      @kind =  2
    elsif ua.match(/^SoftBank|Vodafone|MOT/)
      @kind =  3
    else
      @kind =  0
    end
  end
  
  def is_mobile
    return @kind > 0
  end
  
  def is_docomo
    return @kind == 1
  end
  
  def is_au
    return @kind == 2
  end
  
  def is_softbank
    return @kind == 3
  end
  
  def get_content_type
    if @kind > 0
      return "Content-Type:application/xhtml+xml; charset=Shift_JIS"
    else
      return "Content-Type:text/html; charset=UTF-8"
    end
  end
  
  def get_declare
    if @kind == 1
      return <<EOF
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML
 i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN" "i-xhtml_4ja_10.dtd">
EOF
    elsif @kind == 2
      return <<EOF
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN"
 "http://www.openwave.com/DTD/xhtml-basic.dtd">
EOF
    elsif @kind == 3
      return <<EOF
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN"
 "xhtml-basic10-plus.dtd">
EOF
    else
      return <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
EOF
    end
  end
end

agent = UserAgent.new(ENV['HTTP_USER_AGENT'])
print agent.get_content_type() + "\r\n\r\n" + agent.get_declare()
print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">'
print "<body>"

file = "content.html"
if agent.is_mobile()
  print Kconv.kconv(File.read(file), Kconv::SJIS)
else
  print File.read(file)
end

print "</body></html>"