egalite 0.0.1

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 (113) hide show
  1. data/.gitignore +17 -0
  2. data/README.md +91 -0
  3. data/auth/basic.rb +32 -0
  4. data/blank.rb +53 -0
  5. data/egalite.rb +742 -0
  6. data/errorconsole.rb +77 -0
  7. data/examples/simple/example.rb +39 -0
  8. data/examples/simple/pages/test.html +15 -0
  9. data/examples/simple_db/example_db.rb +103 -0
  10. data/examples/simple_db/pages/edit.html +6 -0
  11. data/helper.rb +251 -0
  12. data/keitai/keitai.rb +107 -0
  13. data/keitai/ketai.rb +11 -0
  14. data/keitai/rack/ketai/carrier/abstract.rb +131 -0
  15. data/keitai/rack/ketai/carrier/au.rb +78 -0
  16. data/keitai/rack/ketai/carrier/docomo.rb +80 -0
  17. data/keitai/rack/ketai/carrier/emoji/ausjisstrtoemojiid.rb +1391 -0
  18. data/keitai/rack/ketai/carrier/emoji/docomosjisstrtoemojiid.rb +759 -0
  19. data/keitai/rack/ketai/carrier/emoji/emojidata.rb +836 -0
  20. data/keitai/rack/ketai/carrier/emoji/softbankutf8strtoemojiid.rb +1119 -0
  21. data/keitai/rack/ketai/carrier/emoji/softbankwebcodetoutf8str.rb +499 -0
  22. data/keitai/rack/ketai/carrier/iphone.rb +8 -0
  23. data/keitai/rack/ketai/carrier/softbank.rb +82 -0
  24. data/keitai/rack/ketai/carrier.rb +17 -0
  25. data/keitai/rack/ketai/middleware.rb +24 -0
  26. data/m17n.rb +193 -0
  27. data/rack/auth/abstract/handler.rb +37 -0
  28. data/rack/auth/abstract/request.rb +37 -0
  29. data/rack/auth/basic.rb +58 -0
  30. data/rack/auth/digest/md5.rb +124 -0
  31. data/rack/auth/digest/nonce.rb +51 -0
  32. data/rack/auth/digest/params.rb +55 -0
  33. data/rack/auth/digest/request.rb +40 -0
  34. data/rack/builder.rb +80 -0
  35. data/rack/cascade.rb +41 -0
  36. data/rack/chunked.rb +49 -0
  37. data/rack/commonlogger.rb +49 -0
  38. data/rack/conditionalget.rb +47 -0
  39. data/rack/config.rb +15 -0
  40. data/rack/content_length.rb +29 -0
  41. data/rack/content_type.rb +23 -0
  42. data/rack/deflater.rb +96 -0
  43. data/rack/directory.rb +157 -0
  44. data/rack/etag.rb +32 -0
  45. data/rack/file.rb +92 -0
  46. data/rack/handler/cgi.rb +62 -0
  47. data/rack/handler/evented_mongrel.rb +8 -0
  48. data/rack/handler/fastcgi.rb +89 -0
  49. data/rack/handler/lsws.rb +63 -0
  50. data/rack/handler/mongrel.rb +90 -0
  51. data/rack/handler/scgi.rb +59 -0
  52. data/rack/handler/swiftiplied_mongrel.rb +8 -0
  53. data/rack/handler/thin.rb +18 -0
  54. data/rack/handler/webrick.rb +73 -0
  55. data/rack/handler.rb +88 -0
  56. data/rack/head.rb +19 -0
  57. data/rack/lint.rb +567 -0
  58. data/rack/lobster.rb +65 -0
  59. data/rack/lock.rb +16 -0
  60. data/rack/logger.rb +20 -0
  61. data/rack/methodoverride.rb +27 -0
  62. data/rack/mime.rb +208 -0
  63. data/rack/mock.rb +190 -0
  64. data/rack/nulllogger.rb +18 -0
  65. data/rack/recursive.rb +61 -0
  66. data/rack/reloader.rb +109 -0
  67. data/rack/request.rb +273 -0
  68. data/rack/response.rb +150 -0
  69. data/rack/rewindable_input.rb +103 -0
  70. data/rack/runtime.rb +27 -0
  71. data/rack/sendfile.rb +144 -0
  72. data/rack/server.rb +271 -0
  73. data/rack/session/abstract/id.rb +140 -0
  74. data/rack/session/cookie.rb +90 -0
  75. data/rack/session/memcache.rb +119 -0
  76. data/rack/session/pool.rb +100 -0
  77. data/rack/showexceptions.rb +349 -0
  78. data/rack/showstatus.rb +106 -0
  79. data/rack/static.rb +38 -0
  80. data/rack/urlmap.rb +55 -0
  81. data/rack/utils.rb +662 -0
  82. data/rack.rb +81 -0
  83. data/route.rb +231 -0
  84. data/sendmail.rb +222 -0
  85. data/sequel_helper.rb +20 -0
  86. data/session.rb +132 -0
  87. data/stringify_hash.rb +63 -0
  88. data/support.rb +35 -0
  89. data/template.rb +287 -0
  90. data/test/french.html +13 -0
  91. data/test/french_msg.html +3 -0
  92. data/test/m17n.txt +30 -0
  93. data/test/mobile.html +15 -0
  94. data/test/setup.rb +8 -0
  95. data/test/static/test.txt +1 -0
  96. data/test/template.html +58 -0
  97. data/test/template_inner.html +1 -0
  98. data/test/template_innerparam.html +1 -0
  99. data/test/test_auth.rb +43 -0
  100. data/test/test_blank.rb +44 -0
  101. data/test/test_csrf.rb +87 -0
  102. data/test/test_errorconsole.rb +91 -0
  103. data/test/test_handler.rb +155 -0
  104. data/test/test_helper.rb +296 -0
  105. data/test/test_keitai.rb +107 -0
  106. data/test/test_m17n.rb +129 -0
  107. data/test/test_route.rb +192 -0
  108. data/test/test_sendmail.rb +146 -0
  109. data/test/test_session.rb +83 -0
  110. data/test/test_stringify_hash.rb +67 -0
  111. data/test/test_template.rb +114 -0
  112. data/test.bat +2 -0
  113. metadata +240 -0
@@ -0,0 +1,499 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # SoftBankウェブコードとSoftbank-UTF8バイナリとのマッピング
4
+ # 参考 http://creation.mb.softbank.jp/web/web_pic_06.html
5
+
6
+ # format("0x%03X", Rack::Ketai::Carrier::Softbank::Filter::WEBCODE_TO_EMOJI['G!'])
7
+ # => [0xE001]].pack('U*') (男の子)
8
+
9
+ module Rack
10
+ module Ketai
11
+ module Carrier
12
+ class Softbank
13
+ class Filter
14
+ WEBCODE_TO_EMOJI = {
15
+ 'G!' => [0xE001].pack('U*'),
16
+ 'G"' => [0xE002].pack('U*'),
17
+ 'G#' => [0xE003].pack('U*'),
18
+ 'G$' => [0xE004].pack('U*'),
19
+ 'G%' => [0xE005].pack('U*'),
20
+ 'G&' => [0xE006].pack('U*'),
21
+ 'G\'' => [0xE007].pack('U*'),
22
+ 'G(' => [0xE008].pack('U*'),
23
+ 'G)' => [0xE009].pack('U*'),
24
+ 'G*' => [0xE00A].pack('U*'),
25
+ 'G+' => [0xE00B].pack('U*'),
26
+ 'G,' => [0xE00C].pack('U*'),
27
+ 'G-' => [0xE00D].pack('U*'),
28
+ 'G.' => [0xE00E].pack('U*'),
29
+ 'G/' => [0xE00F].pack('U*'),
30
+ 'G0' => [0xE010].pack('U*'),
31
+ 'G1' => [0xE011].pack('U*'),
32
+ 'G2' => [0xE012].pack('U*'),
33
+ 'G3' => [0xE013].pack('U*'),
34
+ 'G4' => [0xE014].pack('U*'),
35
+ 'G5' => [0xE015].pack('U*'),
36
+ 'G6' => [0xE016].pack('U*'),
37
+ 'G7' => [0xE017].pack('U*'),
38
+ 'G8' => [0xE018].pack('U*'),
39
+ 'G9' => [0xE019].pack('U*'),
40
+ 'G:' => [0xE01A].pack('U*'),
41
+ 'G;' => [0xE01B].pack('U*'),
42
+ 'G<' => [0xE01C].pack('U*'),
43
+ 'G=' => [0xE01D].pack('U*'),
44
+ 'G>' => [0xE01E].pack('U*'),
45
+ 'G?' => [0xE01F].pack('U*'),
46
+ 'G@' => [0xE020].pack('U*'),
47
+ 'GA' => [0xE021].pack('U*'),
48
+ 'GB' => [0xE022].pack('U*'),
49
+ 'GC' => [0xE023].pack('U*'),
50
+ 'GD' => [0xE024].pack('U*'),
51
+ 'GE' => [0xE025].pack('U*'),
52
+ 'GF' => [0xE026].pack('U*'),
53
+ 'GG' => [0xE027].pack('U*'),
54
+ 'GH' => [0xE028].pack('U*'),
55
+ 'GI' => [0xE029].pack('U*'),
56
+ 'GJ' => [0xE02A].pack('U*'),
57
+ 'GK' => [0xE02B].pack('U*'),
58
+ 'GL' => [0xE02C].pack('U*'),
59
+ 'GM' => [0xE02D].pack('U*'),
60
+ 'GN' => [0xE02E].pack('U*'),
61
+ 'GO' => [0xE02F].pack('U*'),
62
+ 'GP' => [0xE030].pack('U*'),
63
+ 'GQ' => [0xE031].pack('U*'),
64
+ 'GR' => [0xE032].pack('U*'),
65
+ 'GS' => [0xE033].pack('U*'),
66
+ 'GT' => [0xE034].pack('U*'),
67
+ 'GU' => [0xE035].pack('U*'),
68
+ 'GV' => [0xE036].pack('U*'),
69
+ 'GW' => [0xE037].pack('U*'),
70
+ 'GX' => [0xE038].pack('U*'),
71
+ 'GY' => [0xE039].pack('U*'),
72
+ 'GZ' => [0xE03A].pack('U*'),
73
+ 'G[' => [0xE03B].pack('U*'),
74
+ 'G\\' => [0xE03C].pack('U*'),
75
+ 'G]' => [0xE03D].pack('U*'),
76
+ 'G^' => [0xE03E].pack('U*'),
77
+ 'G_' => [0xE03F].pack('U*'),
78
+ 'G`' => [0xE040].pack('U*'),
79
+ 'Ga' => [0xE041].pack('U*'),
80
+ 'Gb' => [0xE042].pack('U*'),
81
+ 'Gc' => [0xE043].pack('U*'),
82
+ 'Gd' => [0xE044].pack('U*'),
83
+ 'Ge' => [0xE045].pack('U*'),
84
+ 'Gf' => [0xE046].pack('U*'),
85
+ 'Gg' => [0xE047].pack('U*'),
86
+ 'Gh' => [0xE048].pack('U*'),
87
+ 'Gi' => [0xE049].pack('U*'),
88
+ 'Gj' => [0xE04A].pack('U*'),
89
+ 'Gk' => [0xE04B].pack('U*'),
90
+ 'Gl' => [0xE04C].pack('U*'),
91
+ 'Gm' => [0xE04D].pack('U*'),
92
+ 'Gn' => [0xE04E].pack('U*'),
93
+ 'Go' => [0xE04F].pack('U*'),
94
+ 'Gp' => [0xE050].pack('U*'),
95
+ 'Gq' => [0xE051].pack('U*'),
96
+ 'Gr' => [0xE052].pack('U*'),
97
+ 'Gs' => [0xE053].pack('U*'),
98
+ 'Gt' => [0xE054].pack('U*'),
99
+ 'Gu' => [0xE055].pack('U*'),
100
+ 'Gv' => [0xE056].pack('U*'),
101
+ 'Gw' => [0xE057].pack('U*'),
102
+ 'Gx' => [0xE058].pack('U*'),
103
+ 'Gy' => [0xE059].pack('U*'),
104
+ 'Gz' => [0xE05A].pack('U*'),
105
+ 'E!' => [0xE101].pack('U*'),
106
+ 'E"' => [0xE102].pack('U*'),
107
+ 'E#' => [0xE103].pack('U*'),
108
+ 'E$' => [0xE104].pack('U*'),
109
+ 'E%' => [0xE105].pack('U*'),
110
+ 'E&' => [0xE106].pack('U*'),
111
+ 'E\'' => [0xE107].pack('U*'),
112
+ 'E(' => [0xE108].pack('U*'),
113
+ 'E)' => [0xE109].pack('U*'),
114
+ 'E*' => [0xE10A].pack('U*'),
115
+ 'E+' => [0xE10B].pack('U*'),
116
+ 'E,' => [0xE10C].pack('U*'),
117
+ 'E-' => [0xE10D].pack('U*'),
118
+ 'E.' => [0xE10E].pack('U*'),
119
+ 'E/' => [0xE10F].pack('U*'),
120
+ 'E0' => [0xE110].pack('U*'),
121
+ 'E1' => [0xE111].pack('U*'),
122
+ 'E2' => [0xE112].pack('U*'),
123
+ 'E3' => [0xE113].pack('U*'),
124
+ 'E4' => [0xE114].pack('U*'),
125
+ 'E5' => [0xE115].pack('U*'),
126
+ 'E6' => [0xE116].pack('U*'),
127
+ 'E7' => [0xE117].pack('U*'),
128
+ 'E8' => [0xE118].pack('U*'),
129
+ 'E9' => [0xE119].pack('U*'),
130
+ 'E:' => [0xE11A].pack('U*'),
131
+ 'E;' => [0xE11B].pack('U*'),
132
+ 'E<' => [0xE11C].pack('U*'),
133
+ 'E=' => [0xE11D].pack('U*'),
134
+ 'E>' => [0xE11E].pack('U*'),
135
+ 'E?' => [0xE11F].pack('U*'),
136
+ 'E@' => [0xE120].pack('U*'),
137
+ 'EA' => [0xE121].pack('U*'),
138
+ 'EB' => [0xE122].pack('U*'),
139
+ 'EC' => [0xE123].pack('U*'),
140
+ 'ED' => [0xE124].pack('U*'),
141
+ 'EE' => [0xE125].pack('U*'),
142
+ 'EF' => [0xE126].pack('U*'),
143
+ 'EG' => [0xE127].pack('U*'),
144
+ 'EH' => [0xE128].pack('U*'),
145
+ 'EI' => [0xE129].pack('U*'),
146
+ 'EJ' => [0xE12A].pack('U*'),
147
+ 'EK' => [0xE12B].pack('U*'),
148
+ 'EL' => [0xE12C].pack('U*'),
149
+ 'EM' => [0xE12D].pack('U*'),
150
+ 'EN' => [0xE12E].pack('U*'),
151
+ 'EO' => [0xE12F].pack('U*'),
152
+ 'EP' => [0xE130].pack('U*'),
153
+ 'EQ' => [0xE131].pack('U*'),
154
+ 'ER' => [0xE132].pack('U*'),
155
+ 'ES' => [0xE133].pack('U*'),
156
+ 'ET' => [0xE134].pack('U*'),
157
+ 'EU' => [0xE135].pack('U*'),
158
+ 'EV' => [0xE136].pack('U*'),
159
+ 'EW' => [0xE137].pack('U*'),
160
+ 'EX' => [0xE138].pack('U*'),
161
+ 'EY' => [0xE139].pack('U*'),
162
+ 'EZ' => [0xE13A].pack('U*'),
163
+ 'E[' => [0xE13B].pack('U*'),
164
+ 'E\\' => [0xE13C].pack('U*'),
165
+ 'E]' => [0xE13D].pack('U*'),
166
+ 'E^' => [0xE13E].pack('U*'),
167
+ 'E_' => [0xE13F].pack('U*'),
168
+ 'E`' => [0xE140].pack('U*'),
169
+ 'Ea' => [0xE141].pack('U*'),
170
+ 'Eb' => [0xE142].pack('U*'),
171
+ 'Ec' => [0xE143].pack('U*'),
172
+ 'Ed' => [0xE144].pack('U*'),
173
+ 'Ee' => [0xE145].pack('U*'),
174
+ 'Ef' => [0xE146].pack('U*'),
175
+ 'Eg' => [0xE147].pack('U*'),
176
+ 'Eh' => [0xE148].pack('U*'),
177
+ 'Ei' => [0xE149].pack('U*'),
178
+ 'Ej' => [0xE14A].pack('U*'),
179
+ 'Ek' => [0xE14B].pack('U*'),
180
+ 'El' => [0xE14C].pack('U*'),
181
+ 'Em' => [0xE14D].pack('U*'),
182
+ 'En' => [0xE14E].pack('U*'),
183
+ 'Eo' => [0xE14F].pack('U*'),
184
+ 'Ep' => [0xE150].pack('U*'),
185
+ 'Eq' => [0xE151].pack('U*'),
186
+ 'Er' => [0xE152].pack('U*'),
187
+ 'Es' => [0xE153].pack('U*'),
188
+ 'Et' => [0xE154].pack('U*'),
189
+ 'Eu' => [0xE155].pack('U*'),
190
+ 'Ev' => [0xE156].pack('U*'),
191
+ 'Ew' => [0xE157].pack('U*'),
192
+ 'Ex' => [0xE158].pack('U*'),
193
+ 'Ey' => [0xE159].pack('U*'),
194
+ 'Ez' => [0xE15A].pack('U*'),
195
+ 'F!' => [0xE201].pack('U*'),
196
+ 'F"' => [0xE202].pack('U*'),
197
+ 'F#' => [0xE203].pack('U*'),
198
+ 'F$' => [0xE204].pack('U*'),
199
+ 'F%' => [0xE205].pack('U*'),
200
+ 'F&' => [0xE206].pack('U*'),
201
+ 'F\'' => [0xE207].pack('U*'),
202
+ 'F(' => [0xE208].pack('U*'),
203
+ 'F)' => [0xE209].pack('U*'),
204
+ 'F*' => [0xE20A].pack('U*'),
205
+ 'F+' => [0xE20B].pack('U*'),
206
+ 'F,' => [0xE20C].pack('U*'),
207
+ 'F-' => [0xE20D].pack('U*'),
208
+ 'F.' => [0xE20E].pack('U*'),
209
+ 'F/' => [0xE20F].pack('U*'),
210
+ 'F0' => [0xE210].pack('U*'),
211
+ 'F1' => [0xE211].pack('U*'),
212
+ 'F2' => [0xE212].pack('U*'),
213
+ 'F3' => [0xE213].pack('U*'),
214
+ 'F4' => [0xE214].pack('U*'),
215
+ 'F5' => [0xE215].pack('U*'),
216
+ 'F6' => [0xE216].pack('U*'),
217
+ 'F7' => [0xE217].pack('U*'),
218
+ 'F8' => [0xE218].pack('U*'),
219
+ 'F9' => [0xE219].pack('U*'),
220
+ 'F:' => [0xE21A].pack('U*'),
221
+ 'F;' => [0xE21B].pack('U*'),
222
+ 'F<' => [0xE21C].pack('U*'),
223
+ 'F=' => [0xE21D].pack('U*'),
224
+ 'F>' => [0xE21E].pack('U*'),
225
+ 'F?' => [0xE21F].pack('U*'),
226
+ 'F@' => [0xE220].pack('U*'),
227
+ 'FA' => [0xE221].pack('U*'),
228
+ 'FB' => [0xE222].pack('U*'),
229
+ 'FC' => [0xE223].pack('U*'),
230
+ 'FD' => [0xE224].pack('U*'),
231
+ 'FE' => [0xE225].pack('U*'),
232
+ 'FF' => [0xE226].pack('U*'),
233
+ 'FG' => [0xE227].pack('U*'),
234
+ 'FH' => [0xE228].pack('U*'),
235
+ 'FI' => [0xE229].pack('U*'),
236
+ 'FJ' => [0xE22A].pack('U*'),
237
+ 'FK' => [0xE22B].pack('U*'),
238
+ 'FL' => [0xE22C].pack('U*'),
239
+ 'FM' => [0xE22D].pack('U*'),
240
+ 'FN' => [0xE22E].pack('U*'),
241
+ 'FO' => [0xE22F].pack('U*'),
242
+ 'FP' => [0xE230].pack('U*'),
243
+ 'FQ' => [0xE231].pack('U*'),
244
+ 'FR' => [0xE232].pack('U*'),
245
+ 'FS' => [0xE233].pack('U*'),
246
+ 'FT' => [0xE234].pack('U*'),
247
+ 'FU' => [0xE235].pack('U*'),
248
+ 'FV' => [0xE236].pack('U*'),
249
+ 'FW' => [0xE237].pack('U*'),
250
+ 'FX' => [0xE238].pack('U*'),
251
+ 'FY' => [0xE239].pack('U*'),
252
+ 'FZ' => [0xE23A].pack('U*'),
253
+ 'F[' => [0xE23B].pack('U*'),
254
+ 'F\\' => [0xE23C].pack('U*'),
255
+ 'F]' => [0xE23D].pack('U*'),
256
+ 'F^' => [0xE23E].pack('U*'),
257
+ 'F_' => [0xE23F].pack('U*'),
258
+ 'F`' => [0xE240].pack('U*'),
259
+ 'Fa' => [0xE241].pack('U*'),
260
+ 'Fb' => [0xE242].pack('U*'),
261
+ 'Fc' => [0xE243].pack('U*'),
262
+ 'Fd' => [0xE244].pack('U*'),
263
+ 'Fe' => [0xE245].pack('U*'),
264
+ 'Ff' => [0xE246].pack('U*'),
265
+ 'Fg' => [0xE247].pack('U*'),
266
+ 'Fh' => [0xE248].pack('U*'),
267
+ 'Fi' => [0xE249].pack('U*'),
268
+ 'Fj' => [0xE24A].pack('U*'),
269
+ 'Fk' => [0xE24B].pack('U*'),
270
+ 'Fl' => [0xE24C].pack('U*'),
271
+ 'Fm' => [0xE24D].pack('U*'),
272
+ 'Fn' => [0xE24E].pack('U*'),
273
+ 'Fo' => [0xE24F].pack('U*'),
274
+ 'Fp' => [0xE250].pack('U*'),
275
+ 'Fq' => [0xE251].pack('U*'),
276
+ 'Fr' => [0xE252].pack('U*'),
277
+ 'Fs' => [0xE253].pack('U*'),
278
+ 'O!' => [0xE301].pack('U*'),
279
+ 'O"' => [0xE302].pack('U*'),
280
+ 'O#' => [0xE303].pack('U*'),
281
+ 'O$' => [0xE304].pack('U*'),
282
+ 'O%' => [0xE305].pack('U*'),
283
+ 'O&' => [0xE306].pack('U*'),
284
+ 'O\'' => [0xE307].pack('U*'),
285
+ 'O(' => [0xE308].pack('U*'),
286
+ 'O)' => [0xE309].pack('U*'),
287
+ 'O*' => [0xE30A].pack('U*'),
288
+ 'O+' => [0xE30B].pack('U*'),
289
+ 'O,' => [0xE30C].pack('U*'),
290
+ 'O-' => [0xE30D].pack('U*'),
291
+ 'O.' => [0xE30E].pack('U*'),
292
+ 'O/' => [0xE30F].pack('U*'),
293
+ 'O0' => [0xE310].pack('U*'),
294
+ 'O1' => [0xE311].pack('U*'),
295
+ 'O2' => [0xE312].pack('U*'),
296
+ 'O3' => [0xE313].pack('U*'),
297
+ 'O4' => [0xE314].pack('U*'),
298
+ 'O5' => [0xE315].pack('U*'),
299
+ 'O6' => [0xE316].pack('U*'),
300
+ 'O7' => [0xE317].pack('U*'),
301
+ 'O8' => [0xE318].pack('U*'),
302
+ 'O9' => [0xE319].pack('U*'),
303
+ 'O:' => [0xE31A].pack('U*'),
304
+ 'O;' => [0xE31B].pack('U*'),
305
+ 'O<' => [0xE31C].pack('U*'),
306
+ 'O=' => [0xE31D].pack('U*'),
307
+ 'O>' => [0xE31E].pack('U*'),
308
+ 'O?' => [0xE31F].pack('U*'),
309
+ 'O@' => [0xE320].pack('U*'),
310
+ 'OA' => [0xE321].pack('U*'),
311
+ 'OB' => [0xE322].pack('U*'),
312
+ 'OC' => [0xE323].pack('U*'),
313
+ 'OD' => [0xE324].pack('U*'),
314
+ 'OE' => [0xE325].pack('U*'),
315
+ 'OF' => [0xE326].pack('U*'),
316
+ 'OG' => [0xE327].pack('U*'),
317
+ 'OH' => [0xE328].pack('U*'),
318
+ 'OI' => [0xE329].pack('U*'),
319
+ 'OJ' => [0xE32A].pack('U*'),
320
+ 'OK' => [0xE32B].pack('U*'),
321
+ 'OL' => [0xE32C].pack('U*'),
322
+ 'OM' => [0xE32D].pack('U*'),
323
+ 'ON' => [0xE32E].pack('U*'),
324
+ 'OO' => [0xE32F].pack('U*'),
325
+ 'OP' => [0xE330].pack('U*'),
326
+ 'OQ' => [0xE331].pack('U*'),
327
+ 'OR' => [0xE332].pack('U*'),
328
+ 'OS' => [0xE333].pack('U*'),
329
+ 'OT' => [0xE334].pack('U*'),
330
+ 'OU' => [0xE335].pack('U*'),
331
+ 'OV' => [0xE336].pack('U*'),
332
+ 'OW' => [0xE337].pack('U*'),
333
+ 'OX' => [0xE338].pack('U*'),
334
+ 'OY' => [0xE339].pack('U*'),
335
+ 'OZ' => [0xE33A].pack('U*'),
336
+ 'O[' => [0xE33B].pack('U*'),
337
+ 'O\\' => [0xE33C].pack('U*'),
338
+ 'O]' => [0xE33D].pack('U*'),
339
+ 'O^' => [0xE33E].pack('U*'),
340
+ 'O_' => [0xE33F].pack('U*'),
341
+ 'O`' => [0xE340].pack('U*'),
342
+ 'Oa' => [0xE341].pack('U*'),
343
+ 'Ob' => [0xE342].pack('U*'),
344
+ 'Oc' => [0xE343].pack('U*'),
345
+ 'Od' => [0xE344].pack('U*'),
346
+ 'Oe' => [0xE345].pack('U*'),
347
+ 'Of' => [0xE346].pack('U*'),
348
+ 'Og' => [0xE347].pack('U*'),
349
+ 'Oh' => [0xE348].pack('U*'),
350
+ 'Oi' => [0xE349].pack('U*'),
351
+ 'Oj' => [0xE34A].pack('U*'),
352
+ 'Ok' => [0xE34B].pack('U*'),
353
+ 'Ol' => [0xE34C].pack('U*'),
354
+ 'Om' => [0xE34D].pack('U*'),
355
+ 'P!' => [0xE401].pack('U*'),
356
+ 'P"' => [0xE402].pack('U*'),
357
+ 'P#' => [0xE403].pack('U*'),
358
+ 'P$' => [0xE404].pack('U*'),
359
+ 'P%' => [0xE405].pack('U*'),
360
+ 'P&' => [0xE406].pack('U*'),
361
+ 'P\'' => [0xE407].pack('U*'),
362
+ 'P(' => [0xE408].pack('U*'),
363
+ 'P)' => [0xE409].pack('U*'),
364
+ 'P*' => [0xE40A].pack('U*'),
365
+ 'P+' => [0xE40B].pack('U*'),
366
+ 'P,' => [0xE40C].pack('U*'),
367
+ 'P-' => [0xE40D].pack('U*'),
368
+ 'P.' => [0xE40E].pack('U*'),
369
+ 'P/' => [0xE40F].pack('U*'),
370
+ 'P0' => [0xE410].pack('U*'),
371
+ 'P1' => [0xE411].pack('U*'),
372
+ 'P2' => [0xE412].pack('U*'),
373
+ 'P3' => [0xE413].pack('U*'),
374
+ 'P4' => [0xE414].pack('U*'),
375
+ 'P5' => [0xE415].pack('U*'),
376
+ 'P6' => [0xE416].pack('U*'),
377
+ 'P7' => [0xE417].pack('U*'),
378
+ 'P8' => [0xE418].pack('U*'),
379
+ 'P9' => [0xE419].pack('U*'),
380
+ 'P:' => [0xE41A].pack('U*'),
381
+ 'P;' => [0xE41B].pack('U*'),
382
+ 'P<' => [0xE41C].pack('U*'),
383
+ 'P=' => [0xE41D].pack('U*'),
384
+ 'P>' => [0xE41E].pack('U*'),
385
+ 'P?' => [0xE41F].pack('U*'),
386
+ 'P@' => [0xE420].pack('U*'),
387
+ 'PA' => [0xE421].pack('U*'),
388
+ 'PB' => [0xE422].pack('U*'),
389
+ 'PC' => [0xE423].pack('U*'),
390
+ 'PD' => [0xE424].pack('U*'),
391
+ 'PE' => [0xE425].pack('U*'),
392
+ 'PF' => [0xE426].pack('U*'),
393
+ 'PG' => [0xE427].pack('U*'),
394
+ 'PH' => [0xE428].pack('U*'),
395
+ 'PI' => [0xE429].pack('U*'),
396
+ 'PJ' => [0xE42A].pack('U*'),
397
+ 'PK' => [0xE42B].pack('U*'),
398
+ 'PL' => [0xE42C].pack('U*'),
399
+ 'PM' => [0xE42D].pack('U*'),
400
+ 'PN' => [0xE42E].pack('U*'),
401
+ 'PO' => [0xE42F].pack('U*'),
402
+ 'PP' => [0xE430].pack('U*'),
403
+ 'PQ' => [0xE431].pack('U*'),
404
+ 'PR' => [0xE432].pack('U*'),
405
+ 'PS' => [0xE433].pack('U*'),
406
+ 'PT' => [0xE434].pack('U*'),
407
+ 'PU' => [0xE435].pack('U*'),
408
+ 'PV' => [0xE436].pack('U*'),
409
+ 'PW' => [0xE437].pack('U*'),
410
+ 'PX' => [0xE438].pack('U*'),
411
+ 'PY' => [0xE439].pack('U*'),
412
+ 'PZ' => [0xE43A].pack('U*'),
413
+ 'P[' => [0xE43B].pack('U*'),
414
+ 'P\\' => [0xE43C].pack('U*'),
415
+ 'P]' => [0xE43D].pack('U*'),
416
+ 'P^' => [0xE43E].pack('U*'),
417
+ 'P_' => [0xE43F].pack('U*'),
418
+ 'P`' => [0xE440].pack('U*'),
419
+ 'Pa' => [0xE441].pack('U*'),
420
+ 'Pb' => [0xE442].pack('U*'),
421
+ 'Pc' => [0xE443].pack('U*'),
422
+ 'Pd' => [0xE444].pack('U*'),
423
+ 'Pe' => [0xE445].pack('U*'),
424
+ 'Pf' => [0xE446].pack('U*'),
425
+ 'Pg' => [0xE447].pack('U*'),
426
+ 'Ph' => [0xE448].pack('U*'),
427
+ 'Pi' => [0xE449].pack('U*'),
428
+ 'Pj' => [0xE44A].pack('U*'),
429
+ 'Pk' => [0xE44B].pack('U*'),
430
+ 'Pl' => [0xE44C].pack('U*'),
431
+ 'Q!' => [0xE501].pack('U*'),
432
+ 'Q"' => [0xE502].pack('U*'),
433
+ 'Q#' => [0xE503].pack('U*'),
434
+ 'Q$' => [0xE504].pack('U*'),
435
+ 'Q%' => [0xE505].pack('U*'),
436
+ 'Q&' => [0xE506].pack('U*'),
437
+ 'Q\'' => [0xE507].pack('U*'),
438
+ 'Q(' => [0xE508].pack('U*'),
439
+ 'Q)' => [0xE509].pack('U*'),
440
+ 'Q*' => [0xE50A].pack('U*'),
441
+ 'Q+' => [0xE50B].pack('U*'),
442
+ 'Q,' => [0xE50C].pack('U*'),
443
+ 'Q-' => [0xE50D].pack('U*'),
444
+ 'Q.' => [0xE50E].pack('U*'),
445
+ 'Q/' => [0xE50F].pack('U*'),
446
+ 'Q0' => [0xE510].pack('U*'),
447
+ 'Q1' => [0xE511].pack('U*'),
448
+ 'Q2' => [0xE512].pack('U*'),
449
+ 'Q3' => [0xE513].pack('U*'),
450
+ 'Q4' => [0xE514].pack('U*'),
451
+ 'Q5' => [0xE515].pack('U*'),
452
+ 'Q6' => [0xE516].pack('U*'),
453
+ 'Q7' => [0xE517].pack('U*'),
454
+ 'Q8' => [0xE518].pack('U*'),
455
+ 'Q9' => [0xE519].pack('U*'),
456
+ 'Q:' => [0xE51A].pack('U*'),
457
+ 'Q;' => [0xE51B].pack('U*'),
458
+ 'Q<' => [0xE51C].pack('U*'),
459
+ 'Q=' => [0xE51D].pack('U*'),
460
+ 'Q>' => [0xE51E].pack('U*'),
461
+ 'Q?' => [0xE51F].pack('U*'),
462
+ 'Q@' => [0xE520].pack('U*'),
463
+ 'QA' => [0xE521].pack('U*'),
464
+ 'QB' => [0xE522].pack('U*'),
465
+ 'QC' => [0xE523].pack('U*'),
466
+ 'QD' => [0xE524].pack('U*'),
467
+ 'QE' => [0xE525].pack('U*'),
468
+ 'QF' => [0xE526].pack('U*'),
469
+ 'QG' => [0xE527].pack('U*'),
470
+ 'QH' => [0xE528].pack('U*'),
471
+ 'QI' => [0xE529].pack('U*'),
472
+ 'QJ' => [0xE52A].pack('U*'),
473
+ 'QK' => [0xE52B].pack('U*'),
474
+ 'QL' => [0xE52C].pack('U*'),
475
+ 'QM' => [0xE52D].pack('U*'),
476
+ 'QN' => [0xE52E].pack('U*'),
477
+ 'QO' => [0xE52F].pack('U*'),
478
+ 'QP' => [0xE530].pack('U*'),
479
+ 'QQ' => [0xE531].pack('U*'),
480
+ 'QR' => [0xE532].pack('U*'),
481
+ 'QS' => [0xE533].pack('U*'),
482
+ 'QT' => [0xE534].pack('U*'),
483
+ 'QU' => [0xE535].pack('U*'),
484
+ 'QV' => [0xE536].pack('U*'),
485
+ 'QW' => [0xE537].pack('U*'),
486
+ }
487
+
488
+ # 1.8系、1.9系 互換性維持のため
489
+ if RUBY_VERSION >= '1.9.0'
490
+ def EMOJI_TO_EMOJIID.index(val)
491
+ key(val)
492
+ end
493
+ end
494
+
495
+ end
496
+ end
497
+ end
498
+ end
499
+ end
@@ -0,0 +1,8 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Rack::Ketai::Carrier
3
+ class IPhone < Abstract
4
+
5
+ USER_AGENT_REGEXP = /iPhone/
6
+
7
+ end
8
+ end
@@ -0,0 +1,82 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -*- coding: utf-8 -*-
3
+ require 'scanf'
4
+
5
+ module Rack::Ketai::Carrier
6
+ class Softbank < Abstract
7
+ # Semulator はウェブコンテンツビューアのUA
8
+ USER_AGENT_REGEXP = /^(?:SoftBank|Semulator)/
9
+ end
10
+ end
11
+
12
+ class Rack::Ketai::Carrier::Softbank
13
+ class Filter < ::Rack::Ketai::Carrier::Abstract::Filter
14
+
15
+ def inbound(env)
16
+ # softbank UTF-8バイナリ(Unicode) -> 絵文字ID表記
17
+ request = Rack::Request.new(env)
18
+
19
+ request.params # 最低でも1回呼んでないと query_stringが未設定
20
+
21
+ converter = lambda do |value|
22
+ # まずウェブコードを変換
23
+ value = value.gsub(/\x1B\$([GEFOPQ])([\x21-\x7E]+)\x0F/u) do |match|
24
+ head = $1
25
+ $2.split(//u).collect { |b| WEBCODE_TO_EMOJI[head+b]}
26
+ end
27
+
28
+ # UTF-8バイナリから絵文字IDに
29
+ value.gsub(emoji_utf8_regexp) do |match|
30
+ format("[e:%03X]", EMOJI_TO_EMOJIID[match])
31
+ end
32
+ end
33
+ deep_apply(request.env["rack.request.query_hash"], &converter)
34
+ deep_apply(request.env["rack.request.form_hash"], &converter)
35
+
36
+ # 文字コード変換
37
+ super(request.env)
38
+ end
39
+
40
+ def outbound(status, headers, body)
41
+ status, headers, body = super
42
+
43
+ return [status, headers, body] unless body[0]
44
+
45
+ body = body.collect do |str|
46
+ str.gsub(/\[e:([0-9A-F]{3})\]/) do |match|
47
+ emojiid = $1.scanf('%X').first
48
+ utf8str = EMOJIID_TO_EMOJI[emojiid]
49
+ if utf8str
50
+ # 絵文字があるので差替え
51
+ utf8str.split(//u).collect { |b| "\x1B$"+WEBCODE_TO_EMOJI.index(b)+"\x0F" }.join("")
52
+ else
53
+ # 絵文字がないので代替文字列
54
+ emoji_data = EMOJI_DATA[emojiid]
55
+ emoji_data[:fallback] || emoji_data[:name] || '〓'
56
+ end
57
+ end
58
+ end
59
+
60
+ content = (body.is_a?(Array) ? body[0] : body).to_s
61
+ headers['Content-Length'] = (content.respond_to?(:bytesize) ? content.bytesize : content.size).to_s if headers.member?('Content-Length')
62
+
63
+ [status, headers, body]
64
+ end
65
+
66
+ private
67
+ # 絵文字コード -> 絵文字ID 対応表から、絵文字コード検出用の正規表現をつくる
68
+ # 複数の絵文字の組み合わせのものを前におくことで
69
+ # そっちを優先的にマッチさせる
70
+ def emoji_utf8_regexp
71
+ @emoji_utf8_regexp if @emoji_utf8_regexp
72
+ @emoji_utf8_regexp = Regexp.union(*EMOJI_TO_EMOJIID.keys.sort_by{ |codes| - codes.size }.collect{ |utf8str| Regexp.new(Regexp.escape(utf8str), nil)})
73
+ end
74
+
75
+ end
76
+ end
77
+
78
+ # 変換テーブル読み込み
79
+ require 'rack/ketai/carrier/emoji/softbankwebcodetoutf8str'
80
+ require 'rack/ketai/carrier/emoji/softbankutf8strtoemojiid'
81
+
82
+ Rack::Ketai::Carrier::Softbank.filters = [Rack::Ketai::Carrier::Softbank::Filter.instance]
@@ -0,0 +1,17 @@
1
+ module Rack::Ketai::Carrier
2
+
3
+ autoload :Abstract, 'rack/ketai/carrier/abstract'
4
+ autoload :Docomo, 'rack/ketai/carrier/docomo'
5
+ autoload :Au, 'rack/ketai/carrier/au'
6
+ autoload :Softbank, 'rack/ketai/carrier/softbank'
7
+ autoload :IPhone, 'rack/ketai/carrier/iphone'
8
+
9
+ def self.load(env)
10
+ constants.each do |const|
11
+ c = self.const_get(const)
12
+ return c.new(env) if c::USER_AGENT_REGEXP && env['HTTP_USER_AGENT'] =~ c::USER_AGENT_REGEXP
13
+ end
14
+ nil
15
+ end
16
+
17
+ end
@@ -0,0 +1,24 @@
1
+ class Rack::Ketai::Middleware
2
+
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ carrier = Rack::Ketai::Carrier.load(env)
9
+ return @app.call(env) unless carrier
10
+
11
+ apply(env, carrier)
12
+ end
13
+
14
+ private
15
+ def apply(env, carrier)
16
+ env = env.clone
17
+ env['rack.ketai'] = carrier
18
+ env = carrier.filters.inject(env) { |env, filter| filter.inbound(env) }
19
+ ret = @app.call(env)
20
+ ret[2] = ret[2].body if ret[2].is_a?(Rack::Response)
21
+ carrier.filters.reverse.inject(ret) { |r, filter| filter.outbound(*r) }
22
+ end
23
+
24
+ end