jpmobile 0.0.8 → 0.1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. data/.gitignore +0 -3
  2. data/{spec/spec.opts → .rspec} +1 -2
  3. data/README.rdoc +122 -128
  4. data/Rakefile +23 -101
  5. data/VERSION.yml +4 -3
  6. data/jpmobile.gemspec +130 -182
  7. data/lib/jpmobile.rb +37 -24
  8. data/lib/jpmobile/docomo_guid.rb +2 -1
  9. data/lib/jpmobile/email.rb +3 -4
  10. data/lib/jpmobile/emoticon.rb +2 -6
  11. data/lib/jpmobile/encoding.rb +29 -0
  12. data/lib/jpmobile/filter.rb +42 -134
  13. data/lib/jpmobile/helpers.rb +5 -18
  14. data/lib/jpmobile/hook_action_controller.rb +24 -16
  15. data/lib/jpmobile/hook_action_view.rb +28 -89
  16. data/lib/jpmobile/mobile/abstract_mobile.rb +21 -4
  17. data/lib/jpmobile/mobile/android.rb +10 -0
  18. data/lib/jpmobile/mobile/au.rb +28 -3
  19. data/lib/jpmobile/mobile/ddipocket.rb +12 -0
  20. data/lib/jpmobile/mobile/display.rb +29 -26
  21. data/lib/jpmobile/mobile/docomo.rb +38 -12
  22. data/lib/jpmobile/mobile/iphone.rb +26 -0
  23. data/lib/jpmobile/mobile/smart_phone.rb +21 -0
  24. data/lib/jpmobile/mobile/softbank.rb +16 -41
  25. data/lib/jpmobile/mobile/vodafone.rb +17 -0
  26. data/lib/jpmobile/mobile/willcom.rb +1 -10
  27. data/lib/jpmobile/mobile/windows_phone.rb +10 -0
  28. data/lib/jpmobile/position.rb +4 -3
  29. data/lib/jpmobile/rack.rb +43 -0
  30. data/lib/jpmobile/rack/filter.rb +51 -0
  31. data/lib/jpmobile/rack/mobile_carrier.rb +33 -0
  32. data/lib/jpmobile/rack/params_filter.rb +47 -0
  33. data/lib/jpmobile/rails.rb +22 -0
  34. data/lib/jpmobile/request_with_mobile.rb +8 -12
  35. data/lib/jpmobile/trans_sid.rb +44 -26
  36. data/lib/jpmobile/util.rb +68 -0
  37. data/{tasks → lib/tasks}/jpmobile_tasks.rake +32 -13
  38. data/spec/rack/jpmobile/android_spec.rb +20 -0
  39. data/spec/rack/jpmobile/au_spec.rb +206 -0
  40. data/spec/rack/jpmobile/docomo_spec.rb +237 -0
  41. data/spec/rack/jpmobile/emoticon_spec.rb +215 -0
  42. data/spec/rack/jpmobile/filter_spec.rb +181 -0
  43. data/spec/rack/jpmobile/iphone_spec.rb +32 -0
  44. data/spec/rack/jpmobile/mobile_by_ua_spec.rb +39 -0
  45. data/spec/rack/jpmobile/params_filter_spec.rb +193 -0
  46. data/spec/rack/jpmobile/softbank_spec.rb +123 -0
  47. data/spec/rack/jpmobile/willcom_spec.rb +67 -0
  48. data/spec/rack/jpmobile/windows_phone.rb +20 -0
  49. data/spec/rack_helper.rb +86 -0
  50. data/spec/spec_helper.rb +3 -2
  51. data/spec/unit/detect_by_email_spec.rb +21 -27
  52. data/spec/unit/is_carrier_spec.rb +56 -84
  53. data/spec/unit/spec_helper.rb +1 -2
  54. data/spec/unit/util_spec.rb +2 -2
  55. data/spec/unit/valid_ip_spec.rb +43 -52
  56. data/test/legacy/autoload_test.rb +1 -3
  57. data/test/legacy/emoticon_test.rb +5 -6
  58. data/test/legacy/helper.rb +0 -71
  59. data/test/rails/overrides/.rspec +5 -0
  60. data/test/rails/overrides/Gemfile +32 -0
  61. data/test/rails/overrides/app/controllers/docomo_guid_always_controller.rb +3 -0
  62. data/test/rails/overrides/app/controllers/docomo_guid_base_controller.rb +5 -0
  63. data/test/rails/overrides/app/controllers/docomo_guid_docomo_controller.rb +3 -0
  64. data/test/rails/overrides/app/controllers/filter_controller.rb +0 -34
  65. data/test/rails/overrides/app/controllers/filter_controller_base.rb +19 -0
  66. data/test/rails/overrides/app/controllers/hankaku_filter_controller.rb +3 -0
  67. data/test/rails/overrides/app/controllers/links_controller.rb +28 -0
  68. data/test/rails/overrides/app/controllers/mobile_spec_controller.rb +1 -1
  69. data/test/rails/overrides/app/controllers/template_path_controller.rb +3 -0
  70. data/test/rails/overrides/app/controllers/trans_sid_always_and_session_off_controller.rb +4 -0
  71. data/test/rails/overrides/app/controllers/trans_sid_always_controller.rb +3 -0
  72. data/test/rails/overrides/app/controllers/trans_sid_base_controller.rb +18 -0
  73. data/test/rails/overrides/app/controllers/trans_sid_mobile_controller.rb +3 -0
  74. data/test/rails/overrides/app/controllers/trans_sid_none_controller.rb +3 -0
  75. data/test/rails/overrides/app/views/links/au_gps.html.erb +1 -0
  76. data/test/rails/overrides/app/views/links/au_location.html.erb +1 -0
  77. data/test/rails/overrides/app/views/links/docomo_foma_gps.html.erb +1 -0
  78. data/test/rails/overrides/app/views/links/docomo_openiarea.html.erb +1 -0
  79. data/test/rails/overrides/app/views/links/docomo_utn.html.erb +1 -0
  80. data/test/rails/overrides/app/views/links/link.html.erb +1 -0
  81. data/test/rails/overrides/app/views/links/show_all.html.erb +1 -0
  82. data/test/rails/overrides/app/views/links/softbank_location.html.erb +1 -0
  83. data/test/rails/overrides/app/views/links/willcom_location.html.erb +1 -0
  84. data/test/rails/overrides/app/views/template_path/_partial_smart_phone.html.erb +1 -0
  85. data/test/rails/overrides/app/views/template_path/_partial_smart_phone_iphone.html.erb +1 -0
  86. data/test/rails/overrides/app/views/template_path/index_smart_phone.html.erb +1 -0
  87. data/test/rails/overrides/app/views/template_path/index_smart_phone_iphone.html.erb +1 -0
  88. data/test/rails/overrides/app/views/template_path/show_mobile.html.erb +1 -0
  89. data/test/rails/overrides/app/views/template_path/show_mobile_docomo.html.erb +1 -0
  90. data/test/rails/overrides/autotest/discover.rb +2 -0
  91. data/test/rails/overrides/config/initializers/jpmobile_generator.rb +1 -0
  92. data/test/rails/overrides/config/routes.rb +58 -0
  93. data/test/rails/overrides/db/migrate/001_add_sessions_table.rb +16 -0
  94. data/test/rails/overrides/spec/helpers/helpers_spec.rb +2 -2
  95. data/test/rails/overrides/spec/{controllers → requests}/docomo_guid_spec.rb +37 -14
  96. data/test/rails/overrides/spec/{controllers → requests}/docomo_spec.rb +11 -8
  97. data/test/rails/overrides/spec/{controllers → requests}/emobile_spec.rb +24 -8
  98. data/test/rails/overrides/spec/requests/filter_spec.rb +171 -0
  99. data/test/rails/overrides/spec/requests/helpers_spec.rb +187 -0
  100. data/test/rails/overrides/spec/requests/pc_spec.rb +22 -0
  101. data/test/rails/overrides/spec/requests/softbank_emulator_spec.rb +21 -0
  102. data/test/rails/overrides/spec/requests/template_path_spec.rb +234 -0
  103. data/test/rails/overrides/spec/requests/trans_sid_spec.rb +142 -0
  104. data/test/rails/overrides/spec/spec_helper.rb +17 -48
  105. data/test/sinatra/guestbook.rb +40 -0
  106. data/test/sinatra/test/filter_test.rb +39 -0
  107. metadata +185 -312
  108. data/lib/jpmobile/hook_request.rb +0 -5
  109. data/lib/jpmobile/rack/auth.rb +0 -55
  110. data/lib/jpmobile/rack/combined_logger.rb +0 -54
  111. data/lib/jpmobile/rack/request.rb +0 -7
  112. data/lib/jpmobile/rack/trans_sid.rb +0 -14
  113. data/lib/jpmobile/version.rb +0 -9
  114. data/spec/unit/detect_by_ua_spec.rb +0 -40
  115. data/test/legacy/au_test.rb +0 -173
  116. data/test/legacy/docomo_test.rb +0 -187
  117. data/test/legacy/emoticon_functional_test.rb +0 -195
  118. data/test/legacy/filter_test.rb +0 -34
  119. data/test/legacy/helpers_test.rb +0 -217
  120. data/test/legacy/softbank_test.rb +0 -183
  121. data/test/legacy/willcom_test.rb +0 -56
  122. data/test/rails/2.3.2/spec/controllers/trans_sid_spec.rb +0 -99
  123. data/test/rails/overrides/app/controllers/docomo_guid_controller.rb +0 -13
  124. data/test/rails/overrides/app/controllers/trans_sid_controller.rb +0 -28
  125. data/test/rails/overrides/lib/tasks/rspec.rake +0 -165
  126. data/test/rails/overrides/spec/controllers/filter_spec.rb +0 -159
  127. data/test/rails/overrides/spec/controllers/pc_spec.rb +0 -13
  128. data/test/rails/overrides/spec/controllers/softbank_emulator_spec.rb +0 -42
  129. data/test/rails/overrides/spec/controllers/template_path_spec.rb +0 -117
  130. data/test/rails/overrides/spec/controllers/trans_sid_spec.rb +0 -117
  131. data/test/rails/overrides/spec/rspec.rake +0 -165
  132. data/test/rails/overrides/spec/spec.opts +0 -4
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  #DoCoMoの時guid=onの付与
2
3
  class ActionController::Base #:nodoc:
3
4
  class_inheritable_accessor :docomo_guid_mode
@@ -13,7 +14,7 @@ end
13
14
 
14
15
  module Jpmobile::DocomoGuid #:nodoc:
15
16
  protected
16
- def default_url_options options=nil
17
+ def default_url_options
17
18
  result = super || {}
18
19
  return result unless request # for test process
19
20
  return result unless apply_add_guid?
@@ -1,19 +1,18 @@
1
+ # -*- coding: utf-8 -*-
1
2
  # =メールアドレスモジュール
2
3
  #
3
4
  module Jpmobile
4
5
  # email関連の処理
5
6
  module Email
6
-
7
7
  # メールアドレスよりキャリア情報を取得する
8
8
  # _param1_:: email メールアドレス
9
9
  # return :: Jpmobile::Mobileで定義されている携帯キャリアクラス
10
10
  def self.detect(email)
11
- Jpmobile::Mobile.carriers.each do |const|
12
- c = Jpmobile::Mobile.const_get(const)
11
+ Mobile.carriers.each do |const|
12
+ c = Mobile.const_get(const)
13
13
  return c if c::MAIL_ADDRESS_REGEXP && email =~ c::MAIL_ADDRESS_REGEXP
14
14
  end
15
15
  nil
16
16
  end
17
-
18
17
  end
19
18
  end
@@ -100,11 +100,7 @@ module Jpmobile
100
100
  [converted].pack("U")
101
101
  end
102
102
  elsif webcode = SOFTBANK_UNICODE_TO_WEBCODE[converted-0x1000]
103
- emotion = "\x1b\x24#{webcode}\x0f"
104
- if emotion.respond_to?(:force_encoding)
105
- emotion.force_encoding(str.encoding)
106
- end
107
- emotion
103
+ [converted-0x1000].pack('U')
108
104
  else
109
105
  # キャリア変換テーブルに指定されていたUnicodeに対応する
110
106
  # 携帯側エンコーディングが見つからない(変換テーブルの不備の可能性あり)。
@@ -116,7 +112,7 @@ module Jpmobile
116
112
  self.unicodecr_to_external(converted, conversion_table, to_sjis)
117
113
  else
118
114
  # 変換先が文字列で指定されている。
119
- to_sjis ? NKF.nkf('-m0 -x -Ws', converted) : converted
115
+ to_sjis ? Jpmobile::Util.utf8_to_sjis(converted) : converted
120
116
  end
121
117
  when nil
122
118
  # 変換先が定義されていない。
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+ # params を UTF-8 にする拡張
3
+ module Jpmobile
4
+ module Encoding
5
+ def self.included(base)
6
+ base.class_eval do
7
+ alias_method :parameters_without_jpmobile, :parameters
8
+
9
+ def parameters
10
+ return @parameters if @jpmobile_params_converted
11
+
12
+ # load params
13
+ @parameters = parameters_without_jpmobile
14
+ # 変換
15
+ @parameters = Jpmobile::Util.deep_convert(@parameters) do |value|
16
+ value = Jpmobile::Util.utf8(value)
17
+ end
18
+
19
+ @jpmobile_params_converted = true
20
+ if @parameters.respond_to?(:with_indifferent_access)
21
+ @parameters = @parameters.with_indifferent_access
22
+ end
23
+
24
+ @parameters
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -6,160 +6,68 @@ class ActionController::Base #:nodoc:
6
6
  def self.mobile_filter(options={})
7
7
  options = {:emoticon=>true, :hankaku=>false}.update(options)
8
8
 
9
- if options[:emoticon]
10
- around_filter Jpmobile::Filter::Emoticon::Outer.new # 外部エンコーディング<->数値文字参照
11
- end
12
- around_filter Jpmobile::Filter::Sjis.new
13
- if options[:emoticon]
14
- around_filter Jpmobile::Filter::Emoticon::Inner.new # 数値文字参照<->UTF-8
15
- end
16
9
  if options[:hankaku]
17
- around_filter Jpmobile::Filter::HankakuKana.new
10
+ before_filter lambda {|controller| Jpmobile::HankakuFilter.before(controller)}
11
+ after_filter lambda {|controller| Jpmobile::HankakuFilter.after(controller)}
18
12
  end
19
13
  end
20
14
  end
21
15
 
22
16
  module Jpmobile
23
- # =文字コードフィルタモジュール。
24
- module Filter
25
- # 文字コードフィルタのベースクラス。
26
- class Base
27
- # 外部コードから内部コードに変換
28
- def before(controller)
29
- if respond_to?(:to_internal) && apply_incoming?(controller)
30
- Util.deep_apply(controller.params) do |value|
31
- value = to_internal(value, controller)
32
- end
33
- end
34
- end
35
- # 内部コードから外部コードに変換
36
- def after(controller)
37
- if respond_to?(:to_external) && apply_outgoing?(controller) && controller.response.body.is_a?(String)
38
- controller.response.body = to_external(controller.response.body, controller)
39
- after_after(controller) if respond_to? :after_after
40
- end
41
- end
42
- # 入力時(params)にこのフィルタを適用するか
43
- def apply_incoming?(controller); true; end
44
- # 出力時(response.body)にこのフィルタを適用するべきか
45
- def apply_outgoing?(controller); true; end
46
- end
17
+ module HankakuFilter
18
+ module_function
47
19
 
48
- # 携帯電話の場合にのみ適用したい場合に Jpmobile::Base の派生クラスに include する。
49
- module ApplyOnlyForMobile
50
- def apply_incoming?(controller)
51
- controller.request.mobile?
52
- end
53
- def apply_outgoing?(controller)
54
- [nil, "text/html", "application/xhtml+xml"].include?(controller.response.content_type) &&
55
- controller.request.mobile?
56
- end
20
+ # 入出力フィルタの適用条件
21
+ def apply_incoming?(controller)
22
+ controller.request.mobile?
23
+ end
24
+ def apply_outgoing?(controller)
25
+ controller.request.mobile? and
26
+ [nil, "text/html", "application/xhtml+xml"].include?(controller.response.content_type)
57
27
  end
58
28
 
59
- # Shift_JISとUnicodeのフィルタ(NKFを使用)
60
- class Sjis < Base
61
- # UTF-8からShift_JISに変換する。
62
- def to_external(str, controller)
63
- NKF.nkf('-m0 -x -Ws', str)
64
- end
65
- # Shift_JISからUTF-8に変換する。
66
- def to_internal(str, controller)
67
- NKF.nkf('-m0 -x -Sw', str)
68
- end
69
- # afterfilterを実行した後に実行する。
70
- def after_after(controller)
71
- unless controller.response.body.blank?
72
- # 500.htmlなどをUTF-8で書いたとき、docomoで文字化けするのを防ぐため
73
- # response_bodyが空の場合はShift_JISを指定しない
74
- controller.response.charset = "Shift_JIS"
29
+ def before(controller)
30
+ if apply_incoming?(controller)
31
+ Util.deep_apply(controller.params) do |value|
32
+ value = to_internal(value)
75
33
  end
76
34
  end
77
- # to_internalを適用するべきかどうかを返す。
78
- def apply_incoming?(controller)
79
- # Vodafone 3G/Softbank(Shift-JISにすると絵文字で不具合が生じる)以外の
80
- # 携帯電話の場合に適用する。
81
- mobile = controller.request.mobile
82
- mobile && !(mobile.instance_of?(Jpmobile::Mobile::Vodafone)||mobile.instance_of?(Jpmobile::Mobile::Softbank))
83
- end
84
- def apply_outgoing?(controller)
85
- [nil, "text/html", "application/xhtml+xml"].include?(controller.response.content_type) &&
86
- apply_incoming?(controller)
87
- end
88
35
  end
89
-
90
- # テーブルに基づくフィルタ
91
- class FilterTable < Base
92
- cattr_reader :internal, :external
93
- def to_internal(str, controller)
94
- filter(str, external, internal)
95
- end
96
- def to_external(str, controller)
97
- filter(str, internal, external)
98
- end
99
- private
100
- def filter(str, from, to)
101
- str = str.dup
102
- from.each_with_index do |int, i|
103
- str.gsub!(int, to[i])
104
- end
105
- str
36
+ # 内部コードから外部コードに変換
37
+ def after(controller)
38
+ if apply_outgoing?(controller) and controller.response.body.is_a?(String)
39
+ controller.response.body = to_external(controller.response.body)
106
40
  end
107
41
  end
108
42
 
109
- # 半角カナと全角カナのフィルタ
110
- class HankakuKana < FilterTable
111
- include ApplyOnlyForMobile
112
- @@internal = %w( グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゛ ゜ ー 。 「 」 、 ・).freeze
113
- @@external = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゙ ゚ ー 。 「 」 、 ・).freeze
43
+ @@internal = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゛ ゜ ー 。 「 」 、 ・).freeze
44
+ @@external = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゙ ゚ ー 。 「 」 、 ・).freeze
45
+ def to_internal(str)
46
+ filter(str, @@external, @@internal)
47
+ end
48
+ def to_external(str)
49
+ filter(str, @@internal, @@external)
114
50
  end
51
+ def filter(str, from, to)
52
+ str = str.clone
115
53
 
116
- # 絵文字変換フィルタ
117
- module Emoticon
118
- # 絵文字Outer
119
- # 外部エンコーディング(携帯電話側)とUnicode数値文字参照を相互に変換。
120
- class Outer < Base
121
- include ApplyOnlyForMobile
122
- def to_internal(str, controller)
123
- method_name = "external_to_unicodecr_" +
124
- controller.request.mobile.class.name[/::(\w*)$/, 1].downcase
125
- if Jpmobile::Emoticon.respond_to?(method_name)
126
- Jpmobile::Emoticon.send(method_name, str)
127
- else
128
- str # 対応する変換メソッドが定義されていない場合は素通し
129
- end
130
- end
131
- def to_external(str, controller)
132
- # 使用する変換テーブルの決定
133
- table = nil
134
- to_sjis = false
135
- case controller.request.mobile
136
- when Jpmobile::Mobile::Docomo
137
- table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_DOCOMO
138
- to_sjis = true
139
- when Jpmobile::Mobile::Au
140
- table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_AU
141
- to_sjis = true
142
- when Jpmobile::Mobile::Jphone
143
- table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
144
- to_sjis = true
145
- when Jpmobile::Mobile::Softbank
146
- table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
147
- end
54
+ # 一度UTF-8に変換
55
+ before_encoding = nil
56
+ if str.respond_to?(:force_encoding)
57
+ before_encoding = str.encoding
58
+ str.force_encoding("UTF-8")
59
+ end
148
60
 
149
- Jpmobile::Emoticon::unicodecr_to_external(str, table, to_sjis)
150
- end
61
+ from.each_with_index do |int, i|
62
+ str.gsub!(int, to[i])
151
63
  end
152
- # 絵文字Inner
153
- # Unicode数値文字参照とUTF-8を相互に変換
154
- class Inner < Base
155
- include ApplyOnlyForMobile
156
- def to_internal(str, controller)
157
- Jpmobile::Emoticon::unicodecr_to_utf8(str)
158
- end
159
- def to_external(str, controller)
160
- Jpmobile::Emoticon::utf8_to_unicodecr(str)
161
- end
64
+
65
+ # 元に戻す
66
+ if before_encoding
67
+ str.force_encoding(before_encoding)
162
68
  end
69
+
70
+ str
163
71
  end
164
72
  end
165
73
  end
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  # =位置情報等を要求するヘルパー
2
3
  module Jpmobile
3
4
  # 携帯電話端末に位置情報を要求するための、特殊なリンクを出力するヘルパー群。
@@ -32,16 +33,13 @@ module Jpmobile
32
33
  s << au_location_link_to(str||"au(antenna)", options)
33
34
  end
34
35
  end
35
- if show_all || request.mobile.instance_of?(Mobile::Jphone)
36
- s << jphone_location_link_to(str||"Softbank(antenna)", options)
37
- end
38
36
  if show_all || request.mobile.instance_of?(Mobile::Vodafone) || request.mobile.instance_of?(Mobile::Softbank)
39
37
  s << softbank_location_link_to(str||"Softbank 3G(GPS)", options)
40
38
  end
41
39
  if show_all || request.mobile.instance_of?(Mobile::Willcom)
42
40
  s << willcom_location_link_to(str||"Willcom", options)
43
41
  end
44
- return s.join("<br>\n")
42
+ return s.join("<br>\n").html_safe
45
43
  end
46
44
 
47
45
  # DoCoMo FOMAでGPS位置情報を取得するためのリンクを返す。
@@ -52,7 +50,7 @@ module Jpmobile
52
50
  options[:only_path] = false
53
51
  url = url_for(options)
54
52
  end
55
- return %{<a href="#{url}" lcs>#{str}</a>}
53
+ return %{<a href="#{url}" lcs>#{str}</a>}.html_safe
56
54
  end
57
55
 
58
56
  # DoCoMoでオープンiエリアを取得するためのURLを返す。
@@ -82,7 +80,7 @@ module Jpmobile
82
80
  options[:only_path] = false
83
81
  url = url_for(options)
84
82
  end
85
- return %{<a href="#{url}" utn>#{str}</a>}
83
+ return %{<a href="#{url}" utn>#{str}</a>}.html_safe
86
84
  end
87
85
 
88
86
  # DoCoMoでiモードIDを取得するためのリンクを返す。
@@ -132,17 +130,6 @@ module Jpmobile
132
130
  link_to_url(str, au_location_url_for(options))
133
131
  end
134
132
 
135
- # J-PHONE 位置情報 (基地局) を取得するためのリンクを返す。
136
- def jphone_location_link_to(str,options={})
137
- url = options
138
- if options.is_a?(Hash)
139
- options = options.symbolize_keys
140
- options[:only_path] = false
141
- url = url_for(options)
142
- end
143
- return %{<a z href="#{url}">#{str}</a>}
144
- end
145
-
146
133
  # Softbank(含むVodafone 3G)で位置情報を取得するためのURLを返す。
147
134
  def softbank_location_url_for(options={})
148
135
  url = options
@@ -181,7 +168,7 @@ module Jpmobile
181
168
  private
182
169
  # 外部へのリンク
183
170
  def link_to_url(str, url)
184
- %{<a href="#{url}">#{str}</a>}
171
+ %{<a href="#{url}">#{str}</a>}.html_safe
185
172
  end
186
173
  end
187
174
  end
@@ -1,23 +1,31 @@
1
- require 'action_pack'
1
+ # -*- coding: utf-8 -*-
2
+ module AbstractController
3
+ module ViewPaths
4
+ def lookup_context_with_jpmobile
5
+ jpmobile_context = lookup_context_without_jpmobile
6
+ jpmobile_context.view_paths.controller = self
2
7
 
3
- class ActionController::Base
4
- include Jpmobile::Helpers
5
- before_filter :gettext_force_ja_for_mobile
6
- # gettextが組み込まれている場合、携帯電話からのアクセスをjaロケールに強制する。
7
- def gettext_force_ja_for_mobile
8
- begin
9
- ::GetText.locale = 'ja' if request.mobile?
10
- rescue NameError
8
+ jpmobile_context
11
9
  end
12
- end
13
10
 
14
- class << self
15
- def view_paths=(value)
16
- @view_paths = ActionView::Base.process_view_paths(value) if value
17
- end
11
+ alias_method_chain :lookup_context, :jpmobile
18
12
  end
13
+ end
19
14
 
20
- def view_paths=(value)
21
- @view_paths = ActionView::Base.process_view_paths(value, controller) if value
15
+ module ActionController
16
+ class Base
17
+ include Jpmobile::Helpers
18
+ before_filter :gettext_force_ja_for_mobile
19
+ # gettextが組み込まれている場合、携帯電話からのアクセスをjaロケールに強制する。
20
+ def gettext_force_ja_for_mobile
21
+ if Object.const_defined?(:GetText) and request.mobile?
22
+ begin
23
+ ::GetText.locale = 'ja'
24
+ rescue NameError
25
+ end
26
+ end
27
+ end
22
28
  end
23
29
  end
30
+
31
+ ActionController::Request.send :include, Jpmobile::Encoding
@@ -1,17 +1,12 @@
1
+ # -*- coding: utf-8 -*-
1
2
  # = viewの自動切り替え
2
3
  #
3
- # Rails 2.1.0 対応 http://d.hatena.ne.jp/kusakari/20080620/1213931903
4
- # thanks to id:kusakari
5
- #
6
4
  #:stopdoc:
7
5
  # helperを追加
8
6
  ActionView::Base.class_eval { include Jpmobile::Helpers }
9
7
  #:startdoc:
10
8
 
11
- require 'action_pack'
12
- require 'action_view'
13
-
14
- # ActionView::Base を拡張して携帯からのアクセスの場合に携帯向けビューを優先表示する。
9
+ # ActionView を拡張して携帯からのアクセスの場合に携帯向けビューを優先表示する。
15
10
  # Vodafone携帯(request.mobile == Jpmobile::Mobile::Vodafone)の場合、
16
11
  # index_mobile_vodafone.html.erb
17
12
  # index_mobile_softbank.html.erb
@@ -20,111 +15,55 @@ require 'action_view'
20
15
  # の順にテンプレートが検索される。
21
16
  # BUG: 現状、上記の例では index.html.erb が存在しない場合に振り分けが行われない
22
17
  # (ダミーファイルを置くことで回避可能)。
23
-
24
18
  module ActionView
25
19
  class PathSet
26
- alias find_template_without_jpmobile find_template #:nodoc:
27
- alias initialize_without_jpmobile initialize #:nodoc:
28
-
29
20
  attr_accessor :controller
30
21
 
31
- def initialize(*args)
32
- if args.first.kind_of?(ActionController::Base)
33
- @controller = args.shift
34
- end
35
- initialize_without_jpmobile(*args)
36
- end
37
-
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}" : ""
22
+ def find_with_jpmobile(path, prefix = nil, partial = false, details = {}, key = nil) #:nodoc:
23
+ if controller and controller.kind_of?(ActionController::Base) and
24
+ (controller.request.mobile? or controller.request.smart_phone?)
25
+ return path if path.respond_to?(:render)
26
+ template_candidates = mobile_template_candidates
46
27
 
47
28
  each do |load_path|
48
29
  template_candidates.each do |template_postfix|
49
- if template = load_path["#{template_path}_#{template_postfix}#{format_postfix}"]
50
- return template
51
- end
30
+ templates = load_path.find_all("#{path}_#{template_postfix}", prefix, partial, details, key)
31
+ return templates.first unless templates.empty?
52
32
  end
53
33
  end
54
34
  end
55
35
 
56
- return find_template_without_jpmobile(original_template_path, format, html_fallback)
57
- end
58
-
59
- # collect cadidates of mobile_template
60
- def mobile_template_candidates(controller)
61
- candidates = []
62
- c = controller.request.mobile.class
63
- while c != Jpmobile::Mobile::AbstractMobile
64
- candidates << "mobile_"+c.to_s.split(/::/).last.downcase
65
- c = c.superclass
66
- end
67
- candidates << "mobile"
36
+ find_without_jpmobile(path, prefix, partial, details, key)
68
37
  end
69
- end
70
38
 
71
- class Base #:nodoc:
72
- delegate :default_url_options, :to => :controller unless respond_to?(:default_url_options)
39
+ alias_method_chain :find, :jpmobile #:nodoc:
73
40
 
74
- # nothing to do
75
- def view_paths=(paths)
76
- @view_paths = self.class.process_view_paths(paths, controller)
77
- end
41
+ def mobile_template_candidates #:nodoc:
42
+ candidates = []
78
43
 
79
- def self.process_view_paths(value, controller = nil)
80
- if controller && controller.is_a?(ActionController::Base)
81
- ActionView::PathSet.new(controller, Array(value))
44
+ view_class, parent_class, template_prefix = case controller.request.mobile
45
+ when ::Jpmobile::Mobile::SmartPhone
46
+ [controller.request.mobile.class, ::Jpmobile::Mobile::SmartPhone, "smart_phone"]
47
+ when ::Jpmobile::Mobile::AbstractMobile
48
+ [controller.request.mobile.class, ::Jpmobile::Mobile::AbstractMobile, "mobile"]
82
49
  else
83
- ActionView::PathSet.new(Array(value))
50
+ [nil, nil, nil]
84
51
  end
85
- end
86
-
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
93
- end
94
- candidates << "mobile"
95
- end
96
52
 
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)
53
+ if view_class and parent_class
54
+ find_mobile_template(view_class, parent_class, template_prefix).push(template_prefix)
102
55
  else
103
- path = self.controller.class.controller_path
104
- partial_name = mobile_path
56
+ []
105
57
  end
106
- File.join(path, "_#{partial_name}")
107
58
  end
108
59
 
109
- def mobile_path template_path, type
110
- "#{template_path}_#{type}"
111
- end
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
60
+ private
61
+ def find_mobile_template(klass, parent, prefix)
62
+ if klass == parent
63
+ []
64
+ else
65
+ find_mobile_template(klass.superclass, parent, prefix).unshift("#{prefix}_#{klass.to_s.split(/::/).last.underscore}")
126
66
  end
127
- return nil
128
67
  end
129
68
  end
130
69
  end