root/lang/ruby/ssb/libs/ssb/ktai_db.rb @ 2145

Revision 2145, 3.3 kB (checked in by coji, 5 years ago)

lang/ruby/ssb: ケータイDBからの検索でuseragentからの部分一致サポートを追加

  • Property svn:mime-type set to text/x-ruby; charset=utf-8
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Date Author Rev URL
Line 
1# ktai_db.rb - ktai database
2#
3# Author:: MIZOGUCHI Coji <mizoguchi.coji at gmail.com>
4# License:: Distribute under the same terms as Ruby
5#
6# $Id$
7#
8require 'csv'
9require 'nkf'
10
11module SSB
12  class KtaiDB
13    COLUMN_MAP = {
14      '連番'               => :id,
15      'メーカ名'           => :carrier,
16      '機種名'             => :name,
17      '機種略名'           => :name_abbr,
18      'ユーザエージェント' => :useragent,
19      'タイプ1'            => :generation,
20      'タイプ2'            => :generation_ver,
21      'ブラウザ幅(x)'      => :screen_width,
22      'ブラウザ高さ(y)'    => :screen_height,
23      '表示カラー数'       => :colors,
24      'ブラウザキャッシュ' => :cache_size,
25      'GIF'                => :gif,
26      'JPG'                => :jpg,
27      'PNG'                => :png,
28      'FLASH'              => :flash,
29      'FLASHバージョン'    => :flash_ver,
30      'FLASHワークメモリ'  => :flash_work_memory,
31      'Javaアプリ'         => :java,
32      'BREW'               => :brew,
33      'HTML'               => :html,
34      'SSL'                => :ssl,
35      'ログイン'           => :login,
36      'クッキー'           => :cookie,
37      '備考'               => :note,
38      '更新日'             => :lastupdate,
39    }
40
41    def initialize(do_load = false, filename = nil)
42      @cols = Array.new
43      @list = Array.new
44
45      if filename.nil?
46        filename = File.join(SSB::CONFIG[:config_dir], 'ke-tai_list.csv')
47      end
48
49      if do_load
50        load_from_csv(filename)
51      end
52    end
53
54    def search(query)
55      real_search(@list, query)
56    end
57
58    def self.load(force_load = false)
59
60    end
61
62    private
63    def load_from_csv(filename)
64      state = :start
65      CSV.open(filename, 'r') do |csv|
66        csv = csv.map{|e| NKF::nkf('-w', e)}
67        case state
68        when :start
69          state = :columns
70        when :columns
71          state = :body
72          @cols = csv.map{ |e| COLUMN_MAP[e] }
73        when :body
74          add_item combine(csv)
75        end
76      end
77    end
78
79    def real_search(list, query)
80      cond = query.shift
81      # キャリア名の変動対応(ThirdForce等)
82      cond[1] = remap_carrier(cond[1]) if cond[0] == :carrier
83
84      # 前方一致で探す
85      ret = nil
86      if cond[0] == :useragent
87        # useragent のときだけ前方からの部分一致でok
88        ret = list.select {|e| e[cond[0]].index(cond[1]) }
89      else
90        # 普通は後方一致
91        ret = list.select {|e| e[cond[0]] =~ Regexp.union(/^#{cond[1]}.*/i) }
92      end
93      if query.size == 0
94        ret
95      else
96        real_search(ret, query) # 再帰
97      end
98    end
99
100    # 同一キャリアの別名を許容する
101    def remap_carrier(source)
102      remap_table = [
103        'DoCoMo',
104        'au|KDDI|Tu-ka',
105        'Vodafone|SoftBank|ThirdForce', # ディズニーとか...
106      ]
107
108      for cond in remap_table do
109        if source =~ Regexp.union(/#{cond}/i)
110          source = cond
111          break
112        end
113      end
114      source
115    end
116
117    def add_item(ktai)
118      @list << ktai
119    end
120
121    def combine(data)
122      t = Hash.new
123      @cols.size.times do |i|
124        t[@cols[i]] = data[i]
125      end
126      t
127    end
128
129    def method_missing(msg, *arg)
130      @list.send(msg, *arg)
131    end
132  end
133end
Note: See TracBrowser for help on using the browser.