jpmobile 0.0.4 → 0.0.6

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 (192) hide show
  1. data/README.rdoc +227 -0
  2. data/Rakefile +6 -13
  3. data/lib/jpmobile/docomo_guid.rb +42 -0
  4. data/lib/jpmobile/filter.rb +1 -1
  5. data/lib/jpmobile/helpers.rb +2 -1
  6. data/lib/jpmobile/hook_action_controller.rb +12 -0
  7. data/lib/jpmobile/hook_action_view.rb +82 -72
  8. data/lib/jpmobile/{hook_abstract_request.rb → hook_request.rb} +1 -1
  9. data/lib/jpmobile/mobile/au.rb +9 -3
  10. data/lib/jpmobile/mobile/z_display_info_docomo.rb +10 -2
  11. data/lib/jpmobile/mobile/z_ip_addresses_au.rb +1 -26
  12. data/lib/jpmobile/mobile/z_ip_addresses_willcom.rb +2 -4
  13. data/lib/jpmobile/rack/auth.rb +55 -0
  14. data/lib/jpmobile/rack/combined_logger.rb +54 -0
  15. data/lib/jpmobile/rack/request.rb +7 -0
  16. data/lib/jpmobile/rack/trans_sid.rb +14 -0
  17. data/lib/jpmobile/trans_sid.rb +70 -62
  18. data/lib/jpmobile/version.rb +1 -1
  19. data/test/{au_test.rb → legacy/au_test.rb} +0 -0
  20. data/test/{autoload_test.rb → legacy/autoload_test.rb} +0 -0
  21. data/test/{docomo_test.rb → legacy/docomo_test.rb} +0 -0
  22. data/test/{emoticon_functional_test.rb → legacy/emoticon_functional_test.rb} +1 -1
  23. data/test/{emoticon_test.rb → legacy/emoticon_test.rb} +0 -0
  24. data/test/{filter_test.rb → legacy/filter_test.rb} +0 -0
  25. data/test/{helper.rb → legacy/helper.rb} +4 -5
  26. data/test/{helpers_test.rb → legacy/helpers_test.rb} +1 -1
  27. data/test/{softbank_test.rb → legacy/softbank_test.rb} +0 -0
  28. data/test/{willcom_test.rb → legacy/willcom_test.rb} +0 -0
  29. data/test/rails/overrides/app/controllers/application.rb +5 -0
  30. data/test/rails/overrides/app/controllers/docomo_guid_controller.rb +13 -0
  31. data/test/rails/overrides/app/controllers/filter_controller.rb +26 -0
  32. data/test/rails/overrides/app/controllers/mobile_spec_controller.rb +5 -0
  33. data/test/rails/overrides/app/controllers/template_path_controller.rb +6 -0
  34. data/test/rails/overrides/app/controllers/trans_sid_controller.rb +28 -0
  35. data/test/rails/overrides/app/views/filter/index.html.erb +0 -0
  36. data/test/rails/overrides/app/views/hankaku_filter/index.html.erb +0 -0
  37. data/test/rails/overrides/app/views/template_path/_partial.html.erb +1 -0
  38. data/test/rails/overrides/app/views/template_path/_partial_mobile.html.erb +1 -0
  39. data/test/rails/overrides/app/views/template_path/_partial_mobile_docomo.html.erb +1 -0
  40. data/test/rails/overrides/app/views/template_path/index.html.erb +1 -0
  41. data/test/rails/overrides/app/views/template_path/index_mobile.html.erb +1 -0
  42. data/test/rails/overrides/app/views/template_path/index_mobile_docomo.html.erb +1 -0
  43. data/test/rails/overrides/app/views/template_path/partial.html.erb +2 -0
  44. data/test/rails/overrides/lib/tasks/rspec.rake +165 -0
  45. data/test/rails/overrides/spec/controllers/docomo_guid_spec.rb +77 -0
  46. data/test/rails/overrides/spec/controllers/docomo_spec.rb +28 -0
  47. data/test/rails/overrides/spec/controllers/emobile_spec.rb +35 -0
  48. data/test/rails/overrides/spec/controllers/filter_spec.rb +157 -0
  49. data/test/rails/overrides/spec/controllers/pc_spec.rb +11 -0
  50. data/test/rails/overrides/spec/controllers/softbank_emulator_spec.rb +40 -0
  51. data/test/rails/overrides/spec/controllers/template_path_spec.rb +115 -0
  52. data/test/rails/overrides/spec/controllers/trans_sid_spec.rb +98 -0
  53. data/test/rails/overrides/spec/helpers/helpers_spec.rb +13 -0
  54. data/test/rails/overrides/spec/rcov.opts +2 -0
  55. data/test/rails/overrides/spec/rspec.rake +165 -0
  56. data/test/rails/overrides/spec/spec.opts +4 -0
  57. data/test/rails/overrides/spec/spec_helper.rb +47 -0
  58. data/test/rails/rails_root/README +256 -0
  59. data/test/rails/rails_root/Rakefile +10 -0
  60. data/test/rails/rails_root/app/controllers/application.rb +5 -0
  61. data/test/rails/rails_root/app/controllers/docomo_guid_controller.rb +13 -0
  62. data/test/rails/rails_root/app/controllers/filter_controller.rb +26 -0
  63. data/test/rails/rails_root/app/controllers/mobile_spec_controller.rb +5 -0
  64. data/test/rails/rails_root/app/controllers/template_path_controller.rb +6 -0
  65. data/test/rails/rails_root/app/controllers/trans_sid_controller.rb +26 -0
  66. data/test/rails/rails_root/app/helpers/application_helper.rb +3 -0
  67. data/test/rails/rails_root/app/views/template_path/index.html.erb +1 -0
  68. data/test/rails/rails_root/app/views/template_path/index_mobile.html.erb +1 -0
  69. data/test/rails/rails_root/app/views/template_path/index_mobile_docomo.html.erb +1 -0
  70. data/test/rails/rails_root/config/boot.rb +109 -0
  71. data/test/rails/rails_root/config/database.yml +22 -0
  72. data/test/rails/rails_root/config/environment.rb +75 -0
  73. data/test/rails/rails_root/config/environments/development.rb +17 -0
  74. data/test/rails/rails_root/config/environments/production.rb +24 -0
  75. data/test/rails/rails_root/config/environments/test.rb +22 -0
  76. data/test/rails/rails_root/config/initializers/inflections.rb +10 -0
  77. data/test/rails/rails_root/config/initializers/mime_types.rb +5 -0
  78. data/test/rails/rails_root/config/initializers/new_rails_defaults.rb +17 -0
  79. data/test/rails/rails_root/config/locales/en.yml +5 -0
  80. data/test/rails/rails_root/config/routes.rb +43 -0
  81. data/test/rails/rails_root/db/development.sqlite3 +0 -0
  82. data/test/rails/rails_root/db/schema.rb +14 -0
  83. data/test/rails/rails_root/db/test.sqlite3 +0 -0
  84. data/test/rails/rails_root/doc/README_FOR_APP +5 -0
  85. data/test/rails/rails_root/lib/tasks/rspec.rake +165 -0
  86. data/test/rails/rails_root/log/development.log +38 -0
  87. data/test/rails/rails_root/log/production.log +0 -0
  88. data/test/rails/rails_root/log/server.log +0 -0
  89. data/test/rails/rails_root/log/test.log +401 -0
  90. data/test/rails/rails_root/public/404.html +30 -0
  91. data/test/rails/rails_root/public/422.html +30 -0
  92. data/test/rails/rails_root/public/500.html +33 -0
  93. data/test/rails/rails_root/public/dispatch.cgi +10 -0
  94. data/test/rails/rails_root/public/dispatch.fcgi +24 -0
  95. data/test/rails/rails_root/public/dispatch.rb +10 -0
  96. data/test/rails/rails_root/public/favicon.ico +0 -0
  97. data/test/rails/rails_root/public/images/rails.png +0 -0
  98. data/test/rails/rails_root/public/index.html +274 -0
  99. data/test/rails/rails_root/public/javascripts/application.js +2 -0
  100. data/test/rails/rails_root/public/javascripts/controls.js +963 -0
  101. data/test/rails/rails_root/public/javascripts/dragdrop.js +973 -0
  102. data/test/rails/rails_root/public/javascripts/effects.js +1128 -0
  103. data/test/rails/rails_root/public/javascripts/prototype.js +4320 -0
  104. data/test/rails/rails_root/public/robots.txt +5 -0
  105. data/test/rails/rails_root/script/about +4 -0
  106. data/test/rails/rails_root/script/console +3 -0
  107. data/test/rails/rails_root/script/dbconsole +3 -0
  108. data/test/rails/rails_root/script/destroy +3 -0
  109. data/test/rails/rails_root/script/generate +3 -0
  110. data/test/rails/rails_root/script/performance/benchmarker +3 -0
  111. data/test/rails/rails_root/script/performance/profiler +3 -0
  112. data/test/rails/rails_root/script/performance/request +3 -0
  113. data/test/rails/rails_root/script/plugin +3 -0
  114. data/test/rails/rails_root/script/process/inspector +3 -0
  115. data/test/rails/rails_root/script/process/reaper +3 -0
  116. data/test/rails/rails_root/script/process/spawner +3 -0
  117. data/test/rails/rails_root/script/runner +3 -0
  118. data/test/rails/rails_root/script/server +3 -0
  119. data/test/rails/rails_root/spec/controllers/docomo_guid_spec.rb +77 -0
  120. data/test/rails/rails_root/spec/controllers/docomo_spec.rb +28 -0
  121. data/test/rails/rails_root/spec/controllers/emobile_spec.rb +35 -0
  122. data/test/rails/rails_root/spec/controllers/filter_spec.rb +157 -0
  123. data/test/rails/rails_root/spec/controllers/pc_spec.rb +11 -0
  124. data/test/rails/rails_root/spec/controllers/softbank_emulator_spec.rb +40 -0
  125. data/test/rails/rails_root/spec/controllers/template_path_spec.rb +85 -0
  126. data/test/rails/rails_root/spec/controllers/trans_sid_spec.rb +96 -0
  127. data/test/rails/rails_root/spec/helpers/helpers_spec.rb +13 -0
  128. data/test/rails/rails_root/spec/rcov.opts +2 -0
  129. data/test/rails/rails_root/spec/rspec.rake +165 -0
  130. data/test/rails/rails_root/spec/spec.opts +4 -0
  131. data/test/rails/rails_root/spec/spec_helper.rb +47 -0
  132. data/test/rails/rails_root/test/performance/browsing_test.rb +9 -0
  133. data/test/rails/rails_root/test/test_helper.rb +38 -0
  134. data/test/rails/rails_root/vendor/plugins/jpmobile/CHANGELOG +7 -0
  135. data/test/rails/rails_root/vendor/plugins/jpmobile/MIT-LICENSE +7 -0
  136. data/{README → test/rails/rails_root/vendor/plugins/jpmobile/README.rdoc} +15 -17
  137. data/test/rails/rails_root/vendor/plugins/jpmobile/Rakefile +116 -0
  138. data/test/rails/rails_root/vendor/plugins/jpmobile/init.rb +3 -0
  139. data/test/rails/rails_root/vendor/plugins/jpmobile/install.rb +1 -0
  140. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile.rb +42 -0
  141. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/datum_conv.rb +72 -0
  142. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/docomo_guid.rb +42 -0
  143. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/email.rb +19 -0
  144. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb +123 -0
  145. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/au.rb +1287 -0
  146. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/conversion_table.rb +3908 -0
  147. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/docomo.rb +255 -0
  148. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/softbank.rb +477 -0
  149. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/z_combine.rb +20 -0
  150. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/filter.rb +173 -0
  151. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/helpers.rb +185 -0
  152. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_controller.rb +11 -0
  153. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_view.rb +142 -0
  154. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_request.rb +13 -0
  155. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/abstract_mobile.rb +73 -0
  156. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/au.rb +97 -0
  157. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/display.rb +33 -0
  158. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/docomo.rb +97 -0
  159. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/emobile.rb +17 -0
  160. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/softbank.rb +110 -0
  161. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/willcom.rb +39 -0
  162. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/z_display_info_docomo.rb +688 -0
  163. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/z_ip_addresses_au.rb +22 -0
  164. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/z_ip_addresses_docomo.rb +12 -0
  165. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/z_ip_addresses_emobile.rb +10 -0
  166. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/z_ip_addresses_softbank.rb +17 -0
  167. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/z_ip_addresses_willcom.rb +117 -0
  168. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/position.rb +67 -0
  169. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/request_with_mobile.rb +44 -0
  170. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/trans_sid.rb +105 -0
  171. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/util.rb +21 -0
  172. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/version.rb +9 -0
  173. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/spec.opts +6 -0
  174. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/spec_helper.rb +36 -0
  175. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/unit/detect_by_email_spec.rb +31 -0
  176. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/unit/detect_by_ua_spec.rb +42 -0
  177. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/unit/is_carrier_spec.rb +93 -0
  178. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/unit/spec_helper.rb +5 -0
  179. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/unit/util_spec.rb +28 -0
  180. data/test/rails/rails_root/vendor/plugins/jpmobile/spec/unit/valid_ip_spec.rb +60 -0
  181. data/test/rails/rails_root/vendor/plugins/jpmobile/tasks/jpmobile_tasks.rake +59 -0
  182. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/emoji/genregexp.rb +47 -0
  183. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_au_emoticon_table.rb +34 -0
  184. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_docomo_emoticon_table.rb +34 -0
  185. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_emoticon_conversion_table.rb +107 -0
  186. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_softbank_emoticon_table.rb +32 -0
  187. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/list_gps_unsupported_au.rb +23 -0
  188. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/update_display_info_docomo.rb +45 -0
  189. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/update_ip_addresses_au.rb +29 -0
  190. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/update_ip_addresses_willcom.rb +17 -0
  191. data/tools/update_ip_addresses_au.rb +15 -5
  192. metadata +188 -22
data/README.rdoc ADDED
@@ -0,0 +1,227 @@
1
+ = jpmobile: A Rails plugin for Japanese mobile-phones
2
+
3
+ == jpmobileとは
4
+ 携帯電話特有の機能を Rails で利用するためのプラグイン。
5
+ 以下の機能を備える。
6
+
7
+ * 携帯電話のキャリア判別
8
+ * 端末位置情報の取得
9
+ * 端末製造番号、契約者番号等の取得
10
+ * IPアドレスの検証(キャリアが公開しているIPアドレス帯域からのアクセスか判定)
11
+ * セッションIDをフォーム/リンクに付与(Trans SID)
12
+ * 携帯電話ビューへの自動振分け
13
+ * ディスプレイ情報(画面サイズ、ブラウザ画面サイズ、カラー・白黒、色数)の取得
14
+ * GeoKit(http://geokit.rubyforge.org)との連携
15
+ * 文字コード変換機能/絵文字のキャリア間相互変換
16
+
17
+ == インストール
18
+ Rails の Version に応じて選択してください。
19
+ === Rails 2.3.2
20
+ ==== pluginとしてインストールする場合
21
+
22
+ リリース版:
23
+ % ./script/plugin install git://github.com/darashi/jpmobile.git -r 'tag x.x.x'
24
+ (x.x.xはバージョン)
25
+
26
+ 開発版:
27
+ % ./script/plugin install git://github.com/darashi/jpmobile.git
28
+
29
+ ==== gemでインストールする場合
30
+
31
+ # gem install jpmobile
32
+ としてgemをインストールした後
33
+
34
+ RAILS_ROOT/config/environment.rb の Rails::Initializer.run do |config| 〜 end 内に
35
+ config.gem "jpmobile"
36
+ の行を追加する。
37
+
38
+ === Rails 2.2.x 以前
39
+ リリース版:
40
+ % ./script/plugin install git://github.com/darashi/jpmobile.git -r 'tag 0.0.5'
41
+
42
+ == 使用例
43
+
44
+ === 携帯電話の識別
45
+
46
+ ==== Viewの中で一部を切替える例
47
+ <% if request.mobile? %>
48
+ 携帯電話からのアクセスです。
49
+ <% else %>
50
+ 携帯電話からのアクセスではありません。
51
+ <% end %>
52
+
53
+ ==== 別に用意した携帯電話用コントローラへリダイレクトする例
54
+ class PcController < ApplicationController
55
+ before_filter :redirect_if_mobile
56
+
57
+ def index
58
+ end
59
+
60
+ private
61
+ def redirect_if_mobile
62
+ if request.mobile?
63
+ pa = params.dup
64
+ pa[:controller] = "/mobile"
65
+ redirect_to pa
66
+ end
67
+ end
68
+ end
69
+
70
+ class MobileController < ApplicationController
71
+ mobile_filter
72
+ end
73
+
74
+
75
+ === 携帯電話viewの自動振分け
76
+ DoCoMo携帯電話からアクセスすると、
77
+ * index_mobile_docomo.html.erb
78
+ * index_mobile.html.erb
79
+ * index.html.erb
80
+ の順でテンプレートを検索し、最初に見付かったテンプレートが利用される。
81
+ Auの場合は、index_mobile_au.html.erb、Softbankの場合はindex_mobile_softbank.html.erbが最初に検索される。
82
+
83
+ BUG: 現状、上記の例では index.html.erb が存在しない場合に振り分けが行われない(ダミーファイルを置くことで回避可能)。
84
+
85
+ ==== キャリアの識別
86
+
87
+ case request.mobile
88
+ when Jpmobile::Mobile::Docomo
89
+ # for DoCoMo
90
+ when Jpmobile::Mobile::Au
91
+ # for au
92
+ when Jpmobile::Mobile::Softbank
93
+ # for SoftBank
94
+ when Jpmobile::Mobile::Willcom
95
+ # for Willcom
96
+ when Jpmobile::Mobile::Emobile
97
+ # for EMOBILE
98
+ else
99
+ # for PC
100
+ end
101
+
102
+ あるいは
103
+ if request.mobile.is_a?(Jpmobile::Mobile::Docomo)
104
+ # for DoCoMo
105
+ end
106
+
107
+ === 位置情報の取得
108
+
109
+ ==== 取得用リンクの生成
110
+
111
+ 以下のようなコードで、端末に位置情報を要求するリンクを出力する。
112
+ <%= get_position_link_to(:action=>:gps) %>
113
+
114
+ ==== 位置情報の取得
115
+
116
+ class MobileController < ApplicationController
117
+ def gps
118
+ if request.mobile && pos = request.mobile.position
119
+ @latitude = pos.lat
120
+ @longuitude = pos.lon
121
+ end
122
+ end
123
+ end
124
+
125
+
126
+ === 端末情報の取得
127
+
128
+ 端末側から通知されている場合、request.mobile.ident で
129
+ 契約に固有の識別子もしくは端末の製造番号を取得できる。
130
+ 両方存在する場合は契約に固有のIDが優先される。
131
+
132
+ * 契約に固有のID (request.mobile.ident_subscriber)
133
+ * au: EZ番号(サブスクライバ番号)
134
+ * DoCoMo: FOMAカード製造番号
135
+ * EMOBILE: EMnet対応端末から通知されるユニークなユーザID
136
+ * 端末製造番号 (request.mobile.ident_device)
137
+ * DoCoMo: 端末製造番号(FOMA, MOVA)
138
+ * SoftBank: 製造番号
139
+
140
+ === IPの検証
141
+ キャリアが公開しているIPアドレス帯域からのアクセスか判定する。
142
+ request.mobile.valid_ip?
143
+
144
+ === セッションIDの付与(Trans SID)
145
+ ==== Cookie非対応携帯だけに付与する
146
+ class MyController
147
+ trans_sid
148
+ end
149
+
150
+ ==== PCにも付与する
151
+ class MyController
152
+ trans_sid :always
153
+ end
154
+
155
+ trans_sid 機能を使う場合には cookie session store を使用することができません。
156
+ trans_sid を使用する際には、例えば config/initializers/session_store.rb で
157
+ ActionController::Base.session_store = :active_record_store
158
+ として active_record_store を使用します。
159
+ このとき ApplicationController において protect_from_forgery の :secret を指定するか、
160
+ あるいは protect_from_forgery を解除する必要があるでしょう。
161
+
162
+ === 端末の画面サイズ
163
+ request.mobile.display で Jpmobile::Display クラスのインスタンスが返る。
164
+ 画面幅 <%= request.mobile.display.width %>
165
+ 画面高さ <%= request.mobile.display.height %>
166
+
167
+ === GeoKit(http://geokit.rubyforge.org)との連携
168
+
169
+ vandor/plugins/geokit以下にGeoKitがインストールされていると、Jpmobile::PositionにGeoKit::Mappableがincludeされる。したがって、
170
+
171
+ request.mobile.position.distance_to('札幌駅')
172
+
173
+ とすることで、端末と「札幌駅」との距離を求めることができる。詳細は http://geokit.rubyforge.org/api/index.html 参照。
174
+
175
+ === 文字コード変換機能/絵文字のキャリア間相互変換
176
+
177
+ JpmobileではControllerにmobile_filterを指定することで
178
+ DoCoMo、Au、SoftBankの絵文字を透過的に扱うことができる。
179
+
180
+ class MyController
181
+ mobile_filter
182
+ end
183
+
184
+ また、半角・全角の自動変換を用いる場合は
185
+ class MyController
186
+ mobile_filter :hankaku=>true
187
+ end
188
+ と指定する。
189
+
190
+ Jpmobile内では、各キャリアの絵文字はUnicode私的領域上にマッピングされ、管理される。
191
+ このとき、DoCoMo、Auは公式サイト記載のマッピングが使用される。
192
+ ただしSoftBankはAuとの重複を避けるため、公式のマッピングに0x1000加算しU+F001以降に割り当てる。
193
+ テンプレート内ではUTF-8でエンコードするか、数値文字参照の&#xHHHH;形式で指定する。
194
+
195
+ 絵文字は送出時に内蔵の変換表に基づいて変換され、携帯電話のエンコーディングにあわせて送出される。
196
+ 携帯電話から受信した絵文字は上記マッピングに基づいてUTF-8でparamsに渡される。
197
+
198
+ mobile_filterを有効にすると以下の処理が自動で行われる。
199
+ * DoCoMo、Auとの通信時にはShift_JIS、SoftBankとの通信時にはUTF-8が使用される。
200
+ * :hankaku=>true指定時は、カタカナは半角カナに変換されて送出される。携帯電話から送られた半角カナは全角カナに変換される。
201
+ * 絵文字はキャリアにあわせて変換されて送出される。
202
+ * 携帯電話からの絵文字はUnicode私的領域にマップされ、UTF-8でparamsに格納される。
203
+
204
+ == テストに必要なgemパッケージ
205
+ テストを実行するためには以下のgemパッケージが必要です。
206
+ * rails
207
+ * rack
208
+ * hpricot
209
+ * rspec
210
+ * rspec-rails
211
+ * spec-fixtures
212
+
213
+ == リンク
214
+ * Project Website: http://jpmobile-rails.org
215
+ * RDoc Documentation: http://jpmobile.rubyforge.org/rdoc
216
+ * GitHub: http://github.com/darashi/jpmobile/
217
+ * RubyForge Project Page: http://rubyforge.org/projects/jpmobile
218
+ * Mailing List: http://groups.google.com/group/jpmobile
219
+ * IRC Channel #jpmobile@freenode.net
220
+
221
+ == 作者
222
+
223
+ Copyright 2006 (c) Yohji Shidara, under MIT License.
224
+
225
+ Yohji Shidara <dara@shidara.net>
226
+
227
+ http://d.hatena.ne.jp/darashi
data/Rakefile CHANGED
@@ -25,7 +25,7 @@ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
25
25
  RDOC_OPTS = ['--quiet', '--title', "jpmobile documentation",
26
26
  "--opname", "index.html",
27
27
  "--line-numbers",
28
- "--main", "README",
28
+ "--main", "README.rdoc",
29
29
  "--inline-source"]
30
30
 
31
31
  desc "Packages up jpmobile gem."
@@ -35,19 +35,13 @@ task :package => [:clean]
35
35
  desc 'Default: run unit tests.'
36
36
  task :default => :test
37
37
 
38
- desc 'Test the jpmobile plugin.'
39
- Rake::TestTask.new(:test) do |t|
40
- t.libs << 'lib'
41
- t.pattern = 'test/**/*_test.rb'
42
- t.verbose = true
43
- end
44
38
 
45
39
  desc 'Generate documentation for the jpmobile plugin.'
46
40
  Rake::RDocTask.new(:rdoc) do |rdoc|
47
41
  rdoc.rdoc_dir = 'doc'
48
42
  rdoc.title = 'Jpmobile'
49
43
  rdoc.options << '--line-numbers' << '--inline-source' << '-c UTF-8'
50
- rdoc.rdoc_files.include('README')
44
+ rdoc.rdoc_files.include('README.rdoc')
51
45
  rdoc.rdoc_files.include('CHANGELOG')
52
46
  rdoc.rdoc_files.include('lib/**/*.rb')
53
47
  end
@@ -58,7 +52,7 @@ spec =
58
52
  s.version = VERS
59
53
  s.platform = Gem::Platform::RUBY
60
54
  s.has_rdoc = true
61
- s.extra_rdoc_files = ["README", "CHANGELOG"]
55
+ s.extra_rdoc_files = ["README.rdoc", "CHANGELOG"]
62
56
  s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
63
57
  s.summary = DESCRIPTION
64
58
  s.description = DESCRIPTION
@@ -70,12 +64,12 @@ spec =
70
64
  s.bindir = "bin"
71
65
  s.require_path = "lib"
72
66
 
73
- s.add_runtime_dependency('actionpack', '>=2.2.2')
67
+ s.add_runtime_dependency('actionpack', '>=2.3.2')
74
68
  s.add_development_dependency('rspec', '>=1.1.12')
75
69
  s.add_development_dependency('rspec-rails', '>=1.1.12')
76
70
  s.add_development_dependency('rspec-fixture', '>=0.0.2')
77
71
 
78
- s.files = %w(README CHANGELOG Rakefile) +
72
+ s.files = %w(README.rdoc CHANGELOG Rakefile) +
79
73
  Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
80
74
  Dir.glob("ext/**/*.{h,c,rb}") +
81
75
  Dir.glob("examples/**/*.rb") +
@@ -118,6 +112,5 @@ task :rel => [:gem] do
118
112
  puts "git tag #{VERS}"
119
113
  end
120
114
 
121
- # setup RSpec tasks
122
- RAILS_ROOT = '.'
115
+ task :test => ['test:legacy', 'spec:unit', 'test:rails']
123
116
  load 'tasks/jpmobile_tasks.rake'
@@ -0,0 +1,42 @@
1
+ #DoCoMoの時guid=onの付与
2
+ class ActionController::Base #:nodoc:
3
+ class_inheritable_accessor :docomo_guid_mode
4
+
5
+ class << self
6
+ def docomo_guid(mode=:docomo)
7
+ include Jpmobile::DocomoGuid
8
+ self.docomo_guid_mode = mode
9
+ end
10
+ end
11
+ end
12
+
13
+
14
+ module Jpmobile::DocomoGuid #:nodoc:
15
+ protected
16
+ def default_url_options options=nil
17
+ result = super || {}
18
+ return result unless request # for test process
19
+ return result unless apply_add_guid?
20
+ return result.merge({:guid => "ON"})
21
+ end
22
+
23
+ #guid=ONを付与すべきか否かを返す
24
+ def apply_add_guid?
25
+ return true if docomo_guid_mode == :always
26
+ return false if docomo_guid_mode == :none
27
+
28
+ return false unless request.mobile?
29
+ return false unless request.mobile.is_a?(Jpmobile::Mobile::Docomo)
30
+ return false if not_apply_guid_user_agent?
31
+
32
+ if docomo_guid_mode == :valid_ip
33
+ return false unless request.mobile.valid_ip?
34
+ end
35
+
36
+ return true
37
+ end
38
+
39
+ def not_apply_guid_user_agent?
40
+ request.user_agent.match(/(?:Googlebot|Y!J-SRD\/1\.0|Y!J-MBS\/1\.0)/)
41
+ end
42
+ end
@@ -42,7 +42,7 @@ module Jpmobile
42
42
  def after(controller)
43
43
  @counter -= 1
44
44
  return unless @counter.zero?
45
- if respond_to?(:to_external) && apply_outgoing?(controller)
45
+ if respond_to?(:to_external) && apply_outgoing?(controller) && controller.response.body.is_a?(String)
46
46
  controller.response.body = to_external(controller.response.body, controller)
47
47
  after_after(controller) if respond_to? :after_after
48
48
  end
@@ -147,10 +147,11 @@ module Jpmobile
147
147
  mode = "auto"
148
148
  if options.is_a?(Hash)
149
149
  options = options.symbolize_keys
150
+ mode = options.delete(:mode) || "auto"
150
151
  options[:only_path] = false
151
- mode = options[:mode] || "auto"
152
152
  url = url_for(options)
153
153
  end
154
+ url.sub!(/\?/, '&')
154
155
  return "location:#{mode}?url=#{url}"
155
156
  end
156
157
 
@@ -1,3 +1,5 @@
1
+ require 'action_pack'
2
+
1
3
  class ActionController::Base
2
4
  include Jpmobile::Helpers
3
5
  before_filter :gettext_force_ja_for_mobile
@@ -8,4 +10,14 @@ class ActionController::Base
8
10
  rescue NameError
9
11
  end
10
12
  end
13
+
14
+ class << self
15
+ def view_paths=(value)
16
+ @view_paths = ActionView::Base.process_view_paths(value) if value
17
+ end
18
+ end
19
+
20
+ def view_paths=(value)
21
+ @view_paths = ActionView::Base.process_view_paths(value, controller) if value
22
+ end
11
23
  end
@@ -21,47 +21,43 @@ require 'action_view'
21
21
  # BUG: 現状、上記の例では index.rhtml が存在しない場合に振り分けが行われない
22
22
  # (ダミーファイルを置くことで回避可能)。
23
23
 
24
- class ActionView::Base #:nodoc:
25
- delegate :default_url_options, :to => :controller unless respond_to?(:default_url_options)
26
-
27
- if ::ActionPack::VERSION::MAJOR >=2 and ::ActionPack::VERSION::MINOR >= 2
28
- ### Rails 2.2 or higher
29
- alias _pick_template_without_jpmobile _pick_template #:nodoc:
30
- alias render_partial_without_jpmobile render_partial #:nodoc:
31
-
32
- def _pick_template(template_path)
33
- mobile_path = mobile_template_path(template_path)
34
- return mobile_path.nil? ? _pick_template_without_jpmobile(template_path) :
35
- _pick_template_without_jpmobile(mobile_path)
36
- end
24
+ module ActionView
25
+ class PathSet
26
+ alias find_template_without_jpmobile find_template #:nodoc:
27
+ alias initialize_without_jpmobile initialize #:nodoc:
28
+
29
+ attr_accessor :controller
37
30
 
38
- def render_partial(options = {}) #:nodoc:
39
- case partial_path = options[:partial]
40
- when String, Symbol, NilClass
41
- mobile_path = mobile_template_path(partial_path, true)
42
- options = options.merge(:partial => mobile_path) if mobile_path
31
+ def initialize(*args)
32
+ if args.first.kind_of?(ActionController::Base)
33
+ @controller = args.shift
43
34
  end
44
- render_partial_without_jpmobile(options)
45
- end
46
- else
47
- ### Rails 2.1 or lower
48
- alias render_file_without_jpmobile render_file #:nodoc:
49
- alias render_partial_without_jpmobile render_partial #:nodoc:
50
-
51
- def render_file(template_path, use_full_path = true, local_assigns = {})
52
- mobile_path = mobile_template_path(template_path)
53
- return mobile_path.nil? ? render_file_without_jpmobile(template_path, use_full_path, local_assigns) :
54
- render_file_without_jpmobile(mobile_path, use_full_path, local_assigns)
35
+ initialize_without_jpmobile(*args)
55
36
  end
56
37
 
57
- def render_partial(partial_path, object_assigns = nil, local_assigns = {}) #:nodoc:
58
- mobile_path = mobile_template_path(partial_path, true) if partial_path.class === "String"
59
- return mobile_path.nil? ? render_partial_without_jpmobile(partial_path, object_assigns, local_assigns) :
60
- render_partial_without_jpmobile(mobile_path, object_assigns, local_assigns)
38
+ # hook ActionView::PathSet#find_template
39
+ def find_template(original_template_path, format = nil, html_fallback = true) #:nodoc:
40
+ if controller and controller.kind_of?(ActionController::Base) and controller.request.mobile?
41
+ return original_template_path if original_template_path.respond_to?(:render)
42
+ template_path = original_template_path.sub(/^\//, '')
43
+
44
+ template_candidates = mobile_template_candidates(controller)
45
+ format_postfix = format ? ".#{format}" : ""
46
+
47
+ each do |load_path|
48
+ template_candidates.each do |template_postfix|
49
+ if template = load_path["#{template_path}_#{template_postfix}#{format_postfix}"]
50
+ return template
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ return find_template_without_jpmobile(original_template_path, format, html_fallback)
61
57
  end
62
- end
63
58
 
64
- def mobile_template_candidates
59
+ # collect cadidates of mobile_template
60
+ def mobile_template_candidates(controller)
65
61
  candidates = []
66
62
  c = controller.request.mobile.class
67
63
  while c != Jpmobile::Mobile::AbstractMobile
@@ -69,52 +65,66 @@ class ActionView::Base #:nodoc:
69
65
  c = c.superclass
70
66
  end
71
67
  candidates << "mobile"
68
+ end
72
69
  end
73
70
 
74
- def mobile_template_partial mobile_path
75
- # ActionView::PartialTemplate#extract_partial_name_and_path の動作を模倣
76
- if mobile_path.include?('/')
77
- path = File.dirname(mobile_path)
78
- partial_name = File.basename(mobile_path)
79
- else
80
- path = self.controller.class.controller_path
81
- partial_name = mobile_path
71
+ class Base #:nodoc:
72
+ delegate :default_url_options, :to => :controller unless respond_to?(:default_url_options)
73
+
74
+ # nothing to do
75
+ def view_paths=(paths)
76
+ @view_paths = self.class.process_view_paths(paths, controller)
82
77
  end
83
- File.join(path, "_#{partial_name}")
84
- end
85
78
 
86
- def mobile_path template_path, type
87
- "#{template_path}_#{type}"
88
- end
79
+ def self.process_view_paths(value, controller = nil)
80
+ if controller && controller.is_a?(ActionController::Base)
81
+ ActionView::PathSet.new(controller, Array(value))
82
+ else
83
+ ActionView::PathSet.new(Array(value))
84
+ end
85
+ end
89
86
 
90
- def mobile_template_path(template_path, partial=false)
91
- if controller.is_a?(ActionController::Base) && m = controller.request.mobile
92
- mobile_template_candidates.each do |v|
93
- mpath = mobile_path template_path, v
94
- if partial
95
- full_path = mobile_template_partial mpath
96
- else
97
- full_path = mpath
98
- end
99
- if template_exists?(full_path)
100
- return mpath
101
- end
87
+ def mobile_template_candidates
88
+ candidates = []
89
+ c = controller.request.mobile.class
90
+ while c != Jpmobile::Mobile::AbstractMobile
91
+ candidates << "mobile_"+c.to_s.split(/::/).last.downcase
92
+ c = c.superclass
102
93
  end
94
+ candidates << "mobile"
95
+ end
96
+
97
+ def mobile_template_partial mobile_path
98
+ # ActionView::PartialTemplate#extract_partial_name_and_path の動作を模倣
99
+ if mobile_path.include?('/')
100
+ path = File.dirname(mobile_path)
101
+ partial_name = File.basename(mobile_path)
102
+ else
103
+ path = self.controller.class.controller_path
104
+ partial_name = mobile_path
105
+ end
106
+ File.join(path, "_#{partial_name}")
103
107
  end
104
- return nil
105
- end
106
108
 
107
- if ::ActionPack::VERSION::MAJOR >=2 and ::ActionPack::VERSION::MINOR >= 2
108
- ### Rails 2.2 or higher
109
- def template_exists?(template_name)
110
- send(:_pick_template_without_jpmobile, template_name) ? true : false
111
- rescue ActionView::MissingTemplate
112
- false
109
+ def mobile_path template_path, type
110
+ "#{template_path}_#{type}"
113
111
  end
114
- else
115
- ### Rails 2.1 or lower
116
- def template_exists?(template_name)
117
- finder.file_exists?(template_name)
112
+
113
+ def mobile_template_path(template_path, partial=false)
114
+ if controller.is_a?(ActionController::Base) && m = controller.request.mobile
115
+ mobile_template_candidates.each do |v|
116
+ mpath = mobile_path template_path, v
117
+ if partial
118
+ full_path = mobile_template_partial mpath
119
+ else
120
+ full_path = mpath
121
+ end
122
+ if template_exists?(full_path)
123
+ return mpath
124
+ end
125
+ end
126
+ end
127
+ return nil
118
128
  end
119
129
  end
120
130
  end