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.
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/Rakefile +1 -0
- data/egalite.gemspec +24 -0
- data/lib/egalite/auth/basic.rb +32 -0
- data/lib/egalite/blank.rb +53 -0
- data/lib/egalite/errorconsole.rb +77 -0
- data/lib/egalite/helper.rb +251 -0
- data/lib/egalite/keitai/keitai.rb +107 -0
- data/lib/egalite/keitai/ketai.rb +11 -0
- data/lib/egalite/keitai/rack/ketai/carrier/abstract.rb +131 -0
- data/lib/egalite/keitai/rack/ketai/carrier/au.rb +78 -0
- data/lib/egalite/keitai/rack/ketai/carrier/docomo.rb +80 -0
- data/lib/egalite/keitai/rack/ketai/carrier/emoji/ausjisstrtoemojiid.rb +1391 -0
- data/lib/egalite/keitai/rack/ketai/carrier/emoji/docomosjisstrtoemojiid.rb +759 -0
- data/lib/egalite/keitai/rack/ketai/carrier/emoji/emojidata.rb +836 -0
- data/lib/egalite/keitai/rack/ketai/carrier/emoji/softbankutf8strtoemojiid.rb +1119 -0
- data/lib/egalite/keitai/rack/ketai/carrier/emoji/softbankwebcodetoutf8str.rb +499 -0
- data/lib/egalite/keitai/rack/ketai/carrier/iphone.rb +8 -0
- data/lib/egalite/keitai/rack/ketai/carrier/softbank.rb +82 -0
- data/lib/egalite/keitai/rack/ketai/carrier.rb +17 -0
- data/lib/egalite/keitai/rack/ketai/middleware.rb +24 -0
- data/lib/egalite/m17n.rb +193 -0
- data/lib/egalite/route.rb +231 -0
- data/lib/egalite/sendmail.rb +222 -0
- data/lib/egalite/sequel_helper.rb +20 -0
- data/lib/egalite/session.rb +132 -0
- data/lib/egalite/stringify_hash.rb +63 -0
- data/lib/egalite/support.rb +35 -0
- data/lib/egalite/template.rb +287 -0
- data/lib/egalite/version.rb +3 -0
- data/lib/egalite.rb +744 -0
- 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
|
+
|