egalite 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. data/Gemfile +4 -0
  2. data/LICENSE.txt +22 -0
  3. data/Rakefile +1 -0
  4. data/egalite.gemspec +24 -0
  5. data/lib/egalite/auth/basic.rb +32 -0
  6. data/lib/egalite/blank.rb +53 -0
  7. data/lib/egalite/errorconsole.rb +77 -0
  8. data/lib/egalite/helper.rb +251 -0
  9. data/lib/egalite/keitai/keitai.rb +107 -0
  10. data/lib/egalite/keitai/ketai.rb +11 -0
  11. data/lib/egalite/keitai/rack/ketai/carrier/abstract.rb +131 -0
  12. data/lib/egalite/keitai/rack/ketai/carrier/au.rb +78 -0
  13. data/lib/egalite/keitai/rack/ketai/carrier/docomo.rb +80 -0
  14. data/lib/egalite/keitai/rack/ketai/carrier/emoji/ausjisstrtoemojiid.rb +1391 -0
  15. data/lib/egalite/keitai/rack/ketai/carrier/emoji/docomosjisstrtoemojiid.rb +759 -0
  16. data/lib/egalite/keitai/rack/ketai/carrier/emoji/emojidata.rb +836 -0
  17. data/lib/egalite/keitai/rack/ketai/carrier/emoji/softbankutf8strtoemojiid.rb +1119 -0
  18. data/lib/egalite/keitai/rack/ketai/carrier/emoji/softbankwebcodetoutf8str.rb +499 -0
  19. data/lib/egalite/keitai/rack/ketai/carrier/iphone.rb +8 -0
  20. data/lib/egalite/keitai/rack/ketai/carrier/softbank.rb +82 -0
  21. data/lib/egalite/keitai/rack/ketai/carrier.rb +17 -0
  22. data/lib/egalite/keitai/rack/ketai/middleware.rb +24 -0
  23. data/lib/egalite/m17n.rb +193 -0
  24. data/lib/egalite/route.rb +231 -0
  25. data/lib/egalite/sendmail.rb +222 -0
  26. data/lib/egalite/sequel_helper.rb +20 -0
  27. data/lib/egalite/session.rb +132 -0
  28. data/lib/egalite/stringify_hash.rb +63 -0
  29. data/lib/egalite/support.rb +35 -0
  30. data/lib/egalite/template.rb +287 -0
  31. data/lib/egalite/version.rb +3 -0
  32. data/lib/egalite.rb +744 -0
  33. metadata +35 -3
@@ -0,0 +1,131 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'tempfile'
3
+ require 'singleton'
4
+ require 'nkf'
5
+ require 'rack/request'
6
+
7
+ module Rack::Ketai::Carrier
8
+ class Abstract
9
+
10
+ class << self
11
+ @@filter_table = { }
12
+ def filters=(obj)
13
+ @@filter_table[self] = obj.is_a?(Array) ? obj : [obj]
14
+ end
15
+
16
+ def filters
17
+ @@filter_table[self] ||= []
18
+ end
19
+ end
20
+
21
+ def initialize(env)
22
+ @env = env.clone
23
+ end
24
+
25
+ USER_AGENT_REGEXP = nil
26
+
27
+ def filters
28
+ self.class.filters
29
+ end
30
+
31
+ private
32
+ def inbound_filter
33
+ end
34
+
35
+ def outbound_filter
36
+ end
37
+
38
+ end
39
+ end
40
+
41
+ class Rack::Ketai::Carrier::Abstract
42
+ class Filter
43
+ include Singleton
44
+
45
+ def inbound(env)
46
+ env
47
+ end
48
+
49
+ def outbound(status, headers, body)
50
+ [status, headers, body]
51
+ end
52
+
53
+ private
54
+ def full_apply(*argv, &proc)
55
+ argv.each do |obj|
56
+ deep_apply(obj, &proc)
57
+ end
58
+ end
59
+
60
+ def deep_apply(obj, &proc)
61
+ case obj
62
+ when Hash
63
+ obj.each_pair do |key, value|
64
+ obj[key] = deep_apply(value, &proc)
65
+ end
66
+ obj
67
+ when Array
68
+ obj.collect!{ |value| deep_apply(value, &proc)}
69
+ when NilClass, TrueClass, FalseClass, Tempfile, StringIO
70
+ obj
71
+ else
72
+ proc.call(obj)
73
+ end
74
+ end
75
+
76
+ end
77
+
78
+
79
+ class SjisFilter < Filter
80
+
81
+ def inbound(env)
82
+ request = Rack::Request.new(env)
83
+
84
+ # 最低でも1回呼んでないと query_string, form_hash等が未設定
85
+ request.params
86
+
87
+ # 同一オブジェクトが両方に入ってたりして二重にかかることがあるので
88
+ converted_objects = []
89
+ converter = lambda { |value|
90
+ unless converted_objects.include?(value)
91
+ value = NKF.nkf('-m0 -x -Sw', value)
92
+ converted_objects << value
93
+ end
94
+ value
95
+ }
96
+
97
+ full_apply(request.env["rack.request.query_hash"],
98
+ request.env["rack.request.form_hash"],
99
+ &converter)
100
+
101
+ request.env
102
+ end
103
+
104
+ def outbound(status, headers, body)
105
+ if body.is_a?(Array)
106
+ body = body.collect do |str|
107
+ NKF.nkf('-m0 -x -Ws', str)
108
+ end
109
+ else
110
+ body = NKF.nkf('-m0 -x -Ws', body)
111
+ end
112
+
113
+ case headers['Content-Type']
114
+ when /charset=(\w+)/i
115
+ headers['Content-Type'].sub!(/charset=\w+/, 'charset=shift_jis')
116
+ else
117
+ headers['Content-Type'] << "; charset=shift_jis"
118
+ end
119
+
120
+ content = (body.is_a?(Array) ? body[0] : body).to_s
121
+ headers['Content-Length'] = (content.respond_to?(:bytesize) ? content.bytesize : content.size).to_s if headers.member?('Content-Length')
122
+
123
+ [status, headers, body]
124
+ end
125
+
126
+ end
127
+
128
+ end
129
+
130
+ require 'rack/ketai/carrier/emoji/emojidata'
131
+
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'scanf'
3
+
4
+ module Rack::Ketai::Carrier
5
+ class Au < Abstract
6
+ USER_AGENT_REGEXP = /^(?:KDDI|UP.Browser\/.+?)-(.+?) /
7
+ end
8
+ end
9
+
10
+ class Rack::Ketai::Carrier::Au
11
+ class Filter < ::Rack::Ketai::Carrier::Abstract::SjisFilter
12
+
13
+ def inbound(env)
14
+ # au SJISバイナリ -> 絵文字ID表記
15
+ request = Rack::Request.new(env)
16
+
17
+ request.params # 最低でも1回呼んでないと query_stringが未設定
18
+
19
+ converter = lambda do |value|
20
+ value.gsub(sjis_regexp) do |match|
21
+ format("[e:%03X]", EMOJI_TO_EMOJIID[match])
22
+ end
23
+ end
24
+ deep_apply(request.env["rack.request.query_hash"], &converter)
25
+ deep_apply(request.env["rack.request.form_hash"], &converter)
26
+
27
+ # 文字コード変換
28
+ super(request.env)
29
+ end
30
+
31
+ def outbound(status, headers, body)
32
+ status, headers, body = super
33
+
34
+ return [status, headers, body] unless body[0]
35
+
36
+ body = body.collect do |str|
37
+ str.gsub(/\[e:([0-9A-F]{3})\]/) do |match|
38
+ emojiid = $1.scanf('%X').first
39
+ sjis = EMOJIID_TO_EMOJI[emojiid]
40
+ if sjis
41
+ # 絵文字があるので差替え
42
+ sjis
43
+ else
44
+ # 絵文字がないので代替文字列
45
+ emoji_data = EMOJI_DATA[emojiid]
46
+ NKF.nkf('-Ws', (emoji_data[:fallback] || emoji_data[:name] || '〓'))
47
+ end
48
+ end
49
+ end
50
+
51
+ content = (body.is_a?(Array) ? body[0] : body).to_s
52
+ headers['Content-Length'] = (content.respond_to?(:bytesize) ? content.bytesize : content.size).to_s if headers.member?('Content-Length')
53
+
54
+ [status, headers, body]
55
+ end
56
+
57
+ private
58
+ # 絵文字コード -> 絵文字ID 対応表から、絵文字コード検出用の正規表現をつくる
59
+ # 複数の絵文字の組み合わせのものを前におくことで
60
+ # そっちを優先的にマッチさせる
61
+ def sjis_regexp
62
+ @sjis_regexp if @sjis_regexp
63
+ matchers = if RUBY_VERSION >= '1.9.1'
64
+ EMOJI_TO_EMOJIID.keys.sort_by{ |codes| - codes.size }.collect{ |sjis| Regexp.new(Regexp.escape(sjis), nil)}
65
+ else
66
+ EMOJI_TO_EMOJIID.keys.sort_by{ |codes| - codes.size }.collect{ |sjis| Regexp.new(Regexp.escape(sjis, 's'), nil, 's')}
67
+ end
68
+ @sjis_regexp = Regexp.union(*matchers)
69
+ end
70
+
71
+ end
72
+ end
73
+
74
+ # 変換テーブル読み込み
75
+ require 'rack/ketai/carrier/emoji/ausjisstrtoemojiid'
76
+
77
+ Rack::Ketai::Carrier::Au.filters = [Rack::Ketai::Carrier::Au::Filter.instance]
78
+
@@ -0,0 +1,80 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'scanf'
4
+
5
+ module Rack::Ketai::Carrier
6
+ class Docomo < Abstract
7
+
8
+ USER_AGENT_REGEXP = /^DoCoMo/
9
+ end
10
+ end
11
+
12
+ class Rack::Ketai::Carrier::Docomo
13
+ class Filter < ::Rack::Ketai::Carrier::Abstract::SjisFilter
14
+
15
+ def inbound(env)
16
+ # ドコモSJISバイナリ -> 絵文字ID表記
17
+ request = Rack::Request.new(env)
18
+
19
+ request.params # 最低でも1回呼んでないと query_stringが未設定
20
+
21
+ converter = lambda do |value|
22
+ value.gsub(sjis_regexp) do |match|
23
+ format("[e:%03X]", EMOJI_TO_EMOJIID[match])
24
+ end
25
+ end
26
+ deep_apply(request.env["rack.request.query_hash"], &converter)
27
+ deep_apply(request.env["rack.request.form_hash"], &converter)
28
+
29
+ # 文字コード変換
30
+ super(request.env)
31
+ end
32
+
33
+ def outbound(status, headers, body)
34
+ status, headers, body = super
35
+
36
+ return [status, headers, body] unless body[0]
37
+
38
+ body = body.collect do |str|
39
+ str.gsub(/\[e:([0-9A-F]{3})\]/) do |match|
40
+ emojiid = $1.scanf('%X').first
41
+ sjis = EMOJIID_TO_EMOJI[emojiid]
42
+ if sjis
43
+ # 絵文字があるので差替え
44
+ sjis
45
+ else
46
+ # 絵文字がないので代替文字列
47
+ emoji_data = EMOJI_DATA[emojiid]
48
+ NKF.nkf('-Ws', (emoji_data[:fallback] || emoji_data[:name] || '〓'))
49
+ end
50
+ end
51
+ end
52
+
53
+ content = (body.is_a?(Array) ? body[0] : body).to_s
54
+ headers['Content-Length'] = (content.respond_to?(:bytesize) ? content.bytesize : content.size).to_s if headers.member?('Content-Length')
55
+
56
+ [status, headers, body]
57
+ end
58
+
59
+ private
60
+ # 絵文字コード -> 絵文字ID 対応表から、絵文字コード検出用の正規表現をつくる
61
+ # 複数の絵文字の組み合わせのものを前におくことで
62
+ # そっちを優先的にマッチさせる
63
+ def sjis_regexp
64
+ @sjis_regexp if @sjis_regexp
65
+ matchers = if RUBY_VERSION >= '1.9.1'
66
+ EMOJI_TO_EMOJIID.keys.sort_by{ |codes| - codes.size }.collect{ |sjis| Regexp.new(Regexp.escape(sjis), nil)}
67
+ else
68
+ EMOJI_TO_EMOJIID.keys.sort_by{ |codes| - codes.size }.collect{ |sjis| Regexp.new(Regexp.escape(sjis, 's'), nil, 's')}
69
+ end
70
+ @sjis_regexp = Regexp.union(*matchers)
71
+ end
72
+
73
+ end
74
+ end
75
+
76
+ # 変換テーブル読み込み
77
+ require 'rack/ketai/carrier/emoji/docomosjisstrtoemojiid'
78
+
79
+ Rack::Ketai::Carrier::Docomo.filters = [Rack::Ketai::Carrier::Docomo::Filter.instance]
80
+