jpmobile 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/Gemfile +10 -8
  2. data/README.rdoc +1 -1
  3. data/Rakefile +13 -5
  4. data/VERSION.yml +1 -1
  5. data/lib/jpmobile/helpers.rb +1 -1
  6. data/lib/jpmobile/rack/filter.rb +2 -7
  7. data/lib/tasks/jpmobile_tasks.rake +1 -1
  8. data/spec/rack/jpmobile/emoticon_spec.rb +17 -9
  9. data/spec/rack/jpmobile/filter_spec.rb +92 -18
  10. data/spec/rack_helper.rb +2 -0
  11. data/spec/spec_helper.rb +0 -26
  12. data/test/rails/overrides/spec/helpers/helpers_spec.rb +1 -1
  13. data/test/rails/rails_root/app/controllers/application_controller.rb +5 -0
  14. data/test/rails/rails_root/app/controllers/docomo_guid_always_controller.rb +3 -0
  15. data/test/rails/rails_root/app/controllers/docomo_guid_base_controller.rb +5 -0
  16. data/test/rails/rails_root/app/controllers/docomo_guid_docomo_controller.rb +3 -0
  17. data/test/rails/rails_root/app/controllers/filter_controller.rb +3 -0
  18. data/test/rails/rails_root/app/controllers/filter_controller_base.rb +25 -0
  19. data/test/rails/rails_root/app/controllers/hankaku_filter_controller.rb +3 -0
  20. data/test/rails/rails_root/app/controllers/hankaku_input_filter_controller.rb +7 -0
  21. data/test/rails/rails_root/app/controllers/links_controller.rb +28 -0
  22. data/test/rails/rails_root/app/controllers/mobile_spec_controller.rb +5 -0
  23. data/test/rails/rails_root/app/controllers/template_path_controller.rb +9 -0
  24. data/test/rails/rails_root/app/controllers/trans_sid_always_and_session_off_controller.rb +4 -0
  25. data/test/rails/rails_root/app/controllers/trans_sid_always_controller.rb +3 -0
  26. data/test/rails/rails_root/app/controllers/trans_sid_base_controller.rb +40 -0
  27. data/test/rails/rails_root/app/controllers/trans_sid_metal_controller.rb +15 -0
  28. data/test/rails/rails_root/app/controllers/trans_sid_mobile_controller.rb +3 -0
  29. data/test/rails/rails_root/app/controllers/trans_sid_none_controller.rb +3 -0
  30. data/test/rails/rails_root/app/helpers/application_helper.rb +2 -0
  31. data/test/rails/rails_root/app/models/user.rb +2 -0
  32. data/test/rails/rails_root/autotest/discover.rb +2 -0
  33. data/test/rails/rails_root/config/application.rb +42 -0
  34. data/test/rails/rails_root/config/boot.rb +13 -0
  35. data/test/rails/rails_root/config/environment.rb +5 -0
  36. data/test/rails/rails_root/config/environments/development.rb +26 -0
  37. data/test/rails/rails_root/config/environments/production.rb +49 -0
  38. data/test/rails/rails_root/config/environments/test.rb +35 -0
  39. data/test/rails/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  40. data/test/rails/rails_root/config/initializers/inflections.rb +10 -0
  41. data/test/rails/rails_root/config/initializers/jpmobile_generator.rb +2 -0
  42. data/test/rails/rails_root/config/initializers/mime_types.rb +5 -0
  43. data/test/rails/rails_root/config/initializers/secret_token.rb +7 -0
  44. data/test/rails/rails_root/config/initializers/session_store.rb +2 -0
  45. data/test/rails/rails_root/config/routes.rb +7 -0
  46. data/test/rails/rails_root/db/migrate/001_add_sessions_table.rb +16 -0
  47. data/test/rails/rails_root/db/migrate/20100824062306_create_users.rb +13 -0
  48. data/test/rails/rails_root/db/schema.rb +31 -0
  49. data/test/rails/rails_root/db/seeds.rb +7 -0
  50. data/test/rails/rails_root/spec/helpers/helpers_spec.rb +15 -0
  51. data/test/rails/rails_root/spec/requests/docomo_guid_spec.rb +102 -0
  52. data/test/rails/rails_root/spec/requests/docomo_spec.rb +33 -0
  53. data/test/rails/rails_root/spec/requests/emobile_spec.rb +53 -0
  54. data/test/rails/rails_root/spec/requests/filter_spec.rb +221 -0
  55. data/test/rails/rails_root/spec/requests/helpers_spec.rb +187 -0
  56. data/test/rails/rails_root/spec/requests/pc_spec.rb +22 -0
  57. data/test/rails/rails_root/spec/requests/softbank_emulator_spec.rb +21 -0
  58. data/test/rails/rails_root/spec/requests/template_path_spec.rb +234 -0
  59. data/test/rails/rails_root/spec/requests/trans_sid_spec.rb +207 -0
  60. data/test/rails/rails_root/spec/spec_helper.rb +32 -0
  61. data/test/rails/rails_root/test/performance/browsing_test.rb +9 -0
  62. data/test/rails/rails_root/test/test_helper.rb +13 -0
  63. data/test/rails/rails_root/vendor/plugins/jpmobile-ipaddresses/lib/jpmobile-ipaddresses.rb +18 -0
  64. data/test/rails/rails_root/vendor/plugins/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/abstract_ip_addresses.rb +23 -0
  65. data/test/rails/rails_root/vendor/plugins/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/au.rb +40 -0
  66. data/test/rails/rails_root/vendor/plugins/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/docomo.rb +22 -0
  67. data/test/rails/rails_root/vendor/plugins/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/emobile.rb +15 -0
  68. data/test/rails/rails_root/vendor/plugins/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/softbank.rb +20 -0
  69. data/test/rails/rails_root/vendor/plugins/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/willcom.rb +158 -0
  70. data/test/rails/rails_root/vendor/plugins/jpmobile-terminfo/lib/jpmobile-terminfo.rb +9 -0
  71. data/test/rails/rails_root/vendor/plugins/jpmobile-terminfo/lib/jpmobile/mobile/terminfo.rb +62 -0
  72. data/test/rails/rails_root/vendor/plugins/jpmobile-terminfo/lib/jpmobile/mobile/terminfo/docomo.rb +739 -0
  73. data/test/rails/rails_root/vendor/plugins/jpmobile-terminfo/spec/spec_helper.rb +2 -0
  74. data/test/rails/rails_root/vendor/plugins/jpmobile-terminfo/spec/terminfo_spec.rb +54 -0
  75. data/test/rails/rails_root/vendor/plugins/jpmobile/init.rb +3 -0
  76. data/test/rails/rails_root/vendor/plugins/jpmobile/install.rb +1 -0
  77. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile.rb +56 -0
  78. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/datum_conv.rb +72 -0
  79. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/docomo_guid.rb +43 -0
  80. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/email.rb +18 -0
  81. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb +141 -0
  82. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/au.rb +1287 -0
  83. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/conversion_table.rb +3909 -0
  84. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/docomo.rb +255 -0
  85. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/softbank.rb +477 -0
  86. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/z_combine.rb +33 -0
  87. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/encoding.rb +29 -0
  88. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/filter.rb +113 -0
  89. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/helpers.rb +174 -0
  90. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_controller.rb +31 -0
  91. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_view.rb +87 -0
  92. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/abstract_mobile.rb +99 -0
  93. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/android.rb +10 -0
  94. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/au.rb +108 -0
  95. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/ddipocket.rb +12 -0
  96. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/docomo.rb +128 -0
  97. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/emobile.rb +16 -0
  98. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/iphone.rb +26 -0
  99. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/smart_phone.rb +21 -0
  100. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/softbank.rb +62 -0
  101. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/vodafone.rb +17 -0
  102. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/willcom.rb +28 -0
  103. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/windows_phone.rb +10 -0
  104. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/position.rb +68 -0
  105. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/rack.rb +49 -0
  106. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/rack/filter.rb +50 -0
  107. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/rack/mobile_carrier.rb +33 -0
  108. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/rack/params_filter.rb +47 -0
  109. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/rails.rb +23 -0
  110. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/request_with_mobile.rb +45 -0
  111. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/trans_sid.rb +133 -0
  112. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/util.rb +97 -0
  113. data/test/rails/rails_root/vendor/plugins/jpmobile/tmp/conversion-table.rb +2588 -0
  114. data/test/rails/rails_root/vendor/plugins/jpmobile/tmp/utf8_to_image.rb +1407 -0
  115. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/emoji/genregexp.rb +47 -0
  116. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_au_emoticon_table.rb +34 -0
  117. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_docomo_emoticon_table.rb +33 -0
  118. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_emoticon_conversion_table.rb +107 -0
  119. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/generate_softbank_emoticon_table.rb +31 -0
  120. data/test/rails/rails_root/vendor/plugins/jpmobile/tools/list_gps_unsupported_au.rb +23 -0
  121. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-ipaddresses/lib/jpmobile-ipaddresses.rb +18 -0
  122. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/abstract_ip_addresses.rb +23 -0
  123. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/au.rb +40 -0
  124. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/docomo.rb +22 -0
  125. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/emobile.rb +15 -0
  126. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/softbank.rb +20 -0
  127. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-ipaddresses/lib/jpmobile/mobile/ip_addresses/willcom.rb +158 -0
  128. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-terminfo/lib/jpmobile-terminfo.rb +9 -0
  129. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-terminfo/lib/jpmobile/mobile/terminfo.rb +62 -0
  130. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-terminfo/lib/jpmobile/mobile/terminfo/docomo.rb +739 -0
  131. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-terminfo/spec/spec_helper.rb +2 -0
  132. data/test/rails/rails_root/vendor/plugins/jpmobile/vendor/jpmobile-terminfo/spec/terminfo_spec.rb +54 -0
  133. metadata +368 -75
  134. data/.rspec +0 -5
  135. data/jpmobile.gemspec +0 -237
  136. data/test/rails/.gitignore +0 -1
  137. data/test/rails/overrides/.rspec +0 -5
  138. data/test/rails/overrides/Gemfile +0 -33
  139. data/test/rails/overrides/app/views/filter/index.html.erb +0 -0
  140. data/test/rails/overrides/app/views/hankaku_filter/index.html.erb +0 -0
  141. data/test/rails/overrides/app/views/hankaku_input_filter/index.html.erb +0 -0
  142. data/test/rails/overrides/app/views/hankaku_input_filter/index_xhtml.html.erb +0 -1
  143. data/test/rails/overrides/app/views/layouts/xhtml.html.erb +0 -12
  144. data/test/rails/overrides/app/views/links/au_gps.html.erb +0 -1
  145. data/test/rails/overrides/app/views/links/au_location.html.erb +0 -1
  146. data/test/rails/overrides/app/views/links/docomo_foma_gps.html.erb +0 -1
  147. data/test/rails/overrides/app/views/links/docomo_openiarea.html.erb +0 -1
  148. data/test/rails/overrides/app/views/links/docomo_utn.html.erb +0 -1
  149. data/test/rails/overrides/app/views/links/link.html.erb +0 -1
  150. data/test/rails/overrides/app/views/links/show_all.html.erb +0 -1
  151. data/test/rails/overrides/app/views/links/softbank_location.html.erb +0 -1
  152. data/test/rails/overrides/app/views/links/willcom_location.html.erb +0 -1
  153. data/test/rails/overrides/app/views/template_path/_partial.html.erb +0 -1
  154. data/test/rails/overrides/app/views/template_path/_partial_mobile.html.erb +0 -1
  155. data/test/rails/overrides/app/views/template_path/_partial_mobile_docomo.html.erb +0 -1
  156. data/test/rails/overrides/app/views/template_path/_partial_smart_phone.html.erb +0 -1
  157. data/test/rails/overrides/app/views/template_path/_partial_smart_phone_iphone.html.erb +0 -1
  158. data/test/rails/overrides/app/views/template_path/index.html.erb +0 -1
  159. data/test/rails/overrides/app/views/template_path/index_mobile.html.erb +0 -1
  160. data/test/rails/overrides/app/views/template_path/index_mobile_docomo.html.erb +0 -1
  161. data/test/rails/overrides/app/views/template_path/index_smart_phone.html.erb +0 -1
  162. data/test/rails/overrides/app/views/template_path/index_smart_phone_iphone.html.erb +0 -1
  163. data/test/rails/overrides/app/views/template_path/partial.html.erb +0 -2
  164. data/test/rails/overrides/app/views/template_path/show_mobile.html.erb +0 -1
  165. data/test/rails/overrides/app/views/template_path/show_mobile_docomo.html.erb +0 -1
  166. data/test/rails/overrides/spec/rcov.opts +0 -2
@@ -0,0 +1,33 @@
1
+ unless Object.const_defined?(:Encoding)
2
+ $KCODE = 'u'
3
+ end
4
+
5
+ module Jpmobile
6
+ module Emoticon
7
+ SJIS_TO_UNICODE = {}
8
+ SJIS_TO_UNICODE.update(DOCOMO_SJIS_TO_UNICODE)
9
+ SJIS_TO_UNICODE.update(AU_SJIS_TO_UNICODE)
10
+ SJIS_TO_UNICODE.freeze
11
+ UNICODE_TO_SJIS = SJIS_TO_UNICODE.invert.freeze
12
+
13
+ if Object.const_defined?(:Encoding)
14
+ sjis_regexp = Proc.new do |sjis|
15
+ Regexp.compile(Regexp.escape([sjis].pack('n').force_encoding("Shift_JIS")))
16
+ end
17
+ else
18
+ sjis_regexp = Proc.new do |sjis|
19
+ Regexp.compile(Regexp.escape([sjis].pack('n'),"s"),nil,'s')
20
+ end
21
+ end
22
+
23
+ SJIS_REGEXP = Regexp.union(*SJIS_TO_UNICODE.keys.map{|s| sjis_regexp[s]})
24
+ SOFTBANK_WEBCODE_REGEXP = Regexp.union(*([/(?!)/n]+SOFTBANK_WEBCODE_TO_UNICODE.keys.map{|x| "\x1b\x24#{x}\x0f"}))
25
+
26
+ DOCOMO_SJIS_REGEXP = Regexp.union(*DOCOMO_SJIS_TO_UNICODE.keys.map{|s| sjis_regexp[s]})
27
+ AU_SJIS_REGEXP = Regexp.union(*AU_SJIS_TO_UNICODE.keys.map{|s| sjis_regexp[s]})
28
+ SOFTBANK_UNICODE_REGEXP = Regexp.union(*SOFTBANK_UNICODE_TO_WEBCODE.keys.map{|x| [x].pack('U')}).freeze
29
+
30
+ EMOTICON_UNICODES = UNICODE_TO_SJIS.keys|SOFTBANK_UNICODE_TO_WEBCODE.keys.map{|k|k+0x1000}
31
+ UTF8_REGEXP = Regexp.union(*EMOTICON_UNICODES.map{|x| [x].pack('U')}).freeze
32
+ end
33
+ end
@@ -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
@@ -0,0 +1,113 @@
1
+ # -*- coding: utf-8 -*-
2
+ # = 半角変換フィルター
3
+ # thanks to masuidrive <masuidrive (at) masuidrive.jp>
4
+
5
+ class ActionController::Base #:nodoc:
6
+ def self.hankaku_filter(options={})
7
+ options = {:input => false}.update(options)
8
+
9
+ before_filter lambda {|controller| Jpmobile::HankakuFilter.before(controller, options)}
10
+ after_filter lambda {|controller| Jpmobile::HankakuFilter.after(controller, options)}
11
+ end
12
+
13
+ def self.mobile_filter(options={})
14
+ STDERR.puts "Method mobile_filter is now deprecated. Use hankaku_filter instead for Hankaku-conversion."
15
+
16
+ self.hankaku_filter(options)
17
+ end
18
+ end
19
+
20
+ module Jpmobile
21
+ module HankakuFilter
22
+ module_function
23
+
24
+ # 入出力フィルタの適用条件
25
+ def apply_incoming?(controller)
26
+ controller.request.mobile?
27
+ end
28
+ def apply_outgoing?(controller)
29
+ controller.request.mobile? and
30
+ [nil, "text/html", "application/xhtml+xml"].include?(controller.response.content_type)
31
+ end
32
+
33
+ def before(controller, options = {})
34
+ if apply_incoming?(controller)
35
+ Util.deep_apply(controller.params) do |value|
36
+ value = to_internal(value, options)
37
+ end
38
+ end
39
+ end
40
+ # 内部コードから外部コードに変換
41
+ def after(controller, options = {})
42
+ if apply_outgoing?(controller) and controller.response.body.is_a?(String)
43
+ controller.response.body = to_external(controller.response.body, options)
44
+ end
45
+ end
46
+
47
+ @@internal = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゛ ゜ ー 。 「 」 、 ・ ! ?).freeze
48
+ @@external = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゙ ゚ ー 。 「 」 、 ・ ! ?).freeze
49
+ def to_internal(str, options = {})
50
+ filter(str, @@external, @@internal)
51
+ end
52
+ def to_external(str, options = {})
53
+ unless options[:input]
54
+ filter(str, @@internal, @@external)
55
+ else
56
+ encoding = (str =~ /^\s*<[^Hh>]*html/) and str.respond_to?(:encoding)
57
+ nokogiri_klass =
58
+ (str =~ /^\s*<[^Hh>]*html/) ? Nokogiri::HTML::Document : Nokogiri::HTML::DocumentFragment
59
+ doc = if encoding
60
+ nokogiri_klass.parse(str, nil, "UTF-8")
61
+ else
62
+ nokogiri_klass.parse(str)
63
+ end
64
+
65
+ doc = convert_text_content(doc)
66
+
67
+ doc.to_html
68
+ end
69
+ end
70
+
71
+ def filter(str, from, to)
72
+ str = str.clone
73
+
74
+ # 一度UTF-8に変換
75
+ before_encoding = nil
76
+ if str.respond_to?(:force_encoding)
77
+ before_encoding = str.encoding
78
+ str.force_encoding("UTF-8")
79
+ end
80
+
81
+ from.each_with_index do |int, i|
82
+ str.gsub!(int, to[i])
83
+ end
84
+
85
+ # 元に戻す
86
+ if before_encoding
87
+ str.force_encoding(before_encoding)
88
+ end
89
+
90
+ str
91
+ end
92
+
93
+ # 再帰的に探す
94
+ def convert_text_content(document)
95
+ document.children.each do |element|
96
+ if element.kind_of?(Nokogiri::XML::Text)
97
+ unless element.parent.node_name == "textarea"
98
+ # textarea 以外のテキストなら content を変換
99
+ element.content = filter(element.content, @@internal, @@external)
100
+ end
101
+ elsif element.node_name == "input" and ["submit", "reset", "button"].include?(element["type"])
102
+ # テキスト以外でもボタンの value は変換
103
+ element["value"] = filter(element["value"], @@internal, @@external)
104
+ elsif element.children.any?
105
+ # 子要素があれば再帰的に変換
106
+ element = convert_text_content(element)
107
+ end
108
+ end
109
+
110
+ document
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,174 @@
1
+ # -*- coding: utf-8 -*-
2
+ # =位置情報等を要求するヘルパー
3
+ module Jpmobile
4
+ # 携帯電話端末に位置情報を要求するための、特殊なリンクを出力するヘルパー群。
5
+ # 多くのキャリアでは特殊なFORMでも位置情報を要求できる。
6
+ module Helpers
7
+ # 位置情報(緯度経度がとれるもの。オープンiエリアをのぞく)要求するリンクを作成する。
8
+ # 位置情報を受け取るページを +url_for+ に渡す引数の形式で +options+ に指定する。
9
+ # :show_all => +true+ とするとキャリア判別を行わず全てキャリアのリンクを返す。
10
+ # 第1引数に文字列を与えるとその文字列をアンカーテキストにする。
11
+ # 第1引数がHashの場合はデフォルトのアンカーテキストを出力する。
12
+ def get_position_link_to(str=nil, options={})
13
+ if str.is_a?(Hash)
14
+ options = str
15
+ str = nil
16
+ end
17
+ show_all = nil
18
+ if options.is_a?(Hash)
19
+ options = options.symbolize_keys
20
+ show_all = options.delete(:show_all)
21
+ end
22
+
23
+ # TODO: コード汚い
24
+ s = []
25
+ if show_all || request.mobile.instance_of?(Mobile::Docomo)
26
+ s << docomo_foma_gps_link_to(str||"DoCoMo FOMA(GPS)", options)
27
+ end
28
+ if show_all || request.mobile.instance_of?(Mobile::Au)
29
+ if show_all || request.mobile.supports_gps?
30
+ s << au_gps_link_to(str||"au(GPS)", options)
31
+ end
32
+ if show_all || (!(request.mobile.supports_gps?) && request.mobile.supports_location?)
33
+ s << au_location_link_to(str||"au(antenna)", options)
34
+ end
35
+ end
36
+ if show_all || request.mobile.instance_of?(Mobile::Vodafone) || request.mobile.instance_of?(Mobile::Softbank)
37
+ s << softbank_location_link_to(str||"Softbank 3G(GPS)", options)
38
+ end
39
+ if show_all || request.mobile.instance_of?(Mobile::Willcom)
40
+ s << willcom_location_link_to(str||"Willcom", options)
41
+ end
42
+ return s.join("<br>\n").html_safe
43
+ end
44
+
45
+ # DoCoMo FOMAでGPS位置情報を取得するためのリンクを返す。
46
+ def docomo_foma_gps_link_to(str, options={})
47
+ url = options
48
+ if options.is_a?(Hash)
49
+ options = options.symbolize_keys
50
+ options[:only_path] = false
51
+ url = url_for(options)
52
+ end
53
+ return %{<a href="#{url}" lcs>#{str}</a>}.html_safe
54
+ end
55
+
56
+ # DoCoMoでオープンiエリアを取得するためのURLを返す。
57
+ def docomo_openiarea_url_for(options={})
58
+ url = options
59
+ if options.is_a?(Hash)
60
+ options = options.symbolize_keys
61
+ options[:only_path] = false
62
+ posinfo = options.delete(:posinfo) || "1" # 基地局情報を元に測位した緯度経度情報を要求
63
+ url = url_for(options)
64
+ else
65
+ posinfo = "1"
66
+ end
67
+ return "http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE&msn=OPENAREAKEY&posinfo=#{posinfo}&nl=#{CGI.escape(url)}"
68
+ end
69
+
70
+ # DoCoMoでオープンiエリアを取得するためのリンクを返す。
71
+ def docomo_openiarea_link_to(str, options={})
72
+ link_to_url(str, docomo_openiarea_url_for(options))
73
+ end
74
+
75
+ # DoCoMoで端末製造番号等を取得するためのリンクを返す。
76
+ def docomo_utn_link_to(str, options={})
77
+ url = options
78
+ if options.is_a?(Hash)
79
+ options = options.symbolize_keys
80
+ options[:only_path] = false
81
+ url = url_for(options)
82
+ end
83
+ return %{<a href="#{url}" utn>#{str}</a>}.html_safe
84
+ end
85
+
86
+ # DoCoMoでiモードIDを取得するためのリンクを返す。
87
+ def docomo_guid_link_to(str, options={})
88
+ url = options
89
+ if options.is_a?(Hash)
90
+ options = options.symbolize_keys
91
+ options[:guid] = "ON"
92
+ url = url_for(options)
93
+ end
94
+ return link_to_url(str, url)
95
+ end
96
+
97
+ # au GPS位置情報を取得するためのURLを返す。
98
+ def au_gps_url_for(options={})
99
+ url = options
100
+ datum = 0 # 0:wgs84, 1:tokyo
101
+ unit = 0 # 0:dms, 1:deg
102
+ if options.is_a?(Hash)
103
+ options = options.symbolize_keys
104
+ options[:only_path] = false
105
+ datum = (options.delete(:datum) || 0 ).to_i # 0:wgs84, 1:tokyo
106
+ unit = (options.delete(:unit) || 0 ).to_i # 0:dms, 1:deg
107
+ url = url_for(options)
108
+ end
109
+ return "device:gpsone?url=#{CGI.escape(url)}&ver=1&datum=#{datum}&unit=#{unit}&acry=0&number=0"
110
+ end
111
+
112
+ # au GPS位置情報を取得するためのリンクを返す。
113
+ def au_gps_link_to(str, options={})
114
+ link_to_url(str, au_gps_url_for(options))
115
+ end
116
+
117
+ # au 簡易位置情報を取得するためのURLを返す。
118
+ def au_location_url_for(options={})
119
+ url = options
120
+ if options.is_a?(Hash)
121
+ options = options.symbolize_keys
122
+ options[:only_path] = false
123
+ url = url_for(options)
124
+ end
125
+ return "device:location?url=#{CGI.escape(url)}"
126
+ end
127
+
128
+ # au 簡易位置情報を取得するためのリンクを返す。
129
+ def au_location_link_to(str, options={})
130
+ link_to_url(str, au_location_url_for(options))
131
+ end
132
+
133
+ # Softbank(含むVodafone 3G)で位置情報を取得するためのURLを返す。
134
+ def softbank_location_url_for(options={})
135
+ url = options
136
+ mode = "auto"
137
+ if options.is_a?(Hash)
138
+ options = options.symbolize_keys
139
+ mode = options.delete(:mode) || "auto"
140
+ options[:only_path] = false
141
+ url = url_for(options)
142
+ end
143
+ url.sub!(/\?/, '&')
144
+ return "location:#{mode}?url=#{url}"
145
+ end
146
+
147
+ # Softbank(含むVodafone 3G)で位置情報を取得するためのリンクを返す。
148
+ def softbank_location_link_to(str,options={})
149
+ link_to_url(str,softbank_location_url_for(options))
150
+ end
151
+
152
+ # Willcom 基地局位置情報を取得するためのURLを返す。
153
+ def willcom_location_url_for(options={})
154
+ url = options
155
+ if options.is_a?(Hash)
156
+ options = options.symbolize_keys
157
+ options[:only_path] = false
158
+ url = url_for(options)
159
+ end
160
+ return "http://location.request/dummy.cgi?my=#{url}&pos=$location"
161
+ end
162
+
163
+ # Willcom 基地局位置情報を取得するためのリンクを返す。
164
+ def willcom_location_link_to(str,options={})
165
+ link_to_url(str, willcom_location_url_for(options))
166
+ end
167
+
168
+ private
169
+ # 外部へのリンク
170
+ def link_to_url(str, url)
171
+ %{<a href="#{html_escape(url)}">#{html_escape(str)}</a>}.html_safe
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,31 @@
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
7
+
8
+ jpmobile_context
9
+ end
10
+
11
+ alias_method_chain :lookup_context, :jpmobile
12
+ end
13
+ end
14
+
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
28
+ end
29
+ end
30
+
31
+ ActionController::Request.send :include, Jpmobile::Encoding
@@ -0,0 +1,87 @@
1
+ # -*- coding: utf-8 -*-
2
+ # = viewの自動切り替え
3
+ #
4
+ #:stopdoc:
5
+ # helperを追加
6
+ ActionView::Base.class_eval { include Jpmobile::Helpers }
7
+ #:startdoc:
8
+
9
+ # ActionView を拡張して携帯からのアクセスの場合に携帯向けビューを優先表示する。
10
+ # Vodafone携帯(request.mobile == Jpmobile::Mobile::Vodafone)の場合、
11
+ # index_mobile_vodafone.html.erb
12
+ # index_mobile_softbank.html.erb
13
+ # index_mobile.html.erb
14
+ # index.html.erb
15
+ # の順にテンプレートが検索される。
16
+ # BUG: 現状、上記の例では index.html.erb が存在しない場合に振り分けが行われない
17
+ # (ダミーファイルを置くことで回避可能)。
18
+ module ActionView
19
+ class PathSet
20
+ attr_accessor :controller
21
+
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
27
+
28
+ each do |load_path|
29
+ template_candidates.each do |template_postfix|
30
+ templates = load_path.find_all("#{path}_#{template_postfix}", prefix, partial, details, key)
31
+ return templates.first unless templates.empty?
32
+ end
33
+ end
34
+ end
35
+
36
+ find_without_jpmobile(path, prefix, partial, details, key)
37
+ end
38
+
39
+ alias_method_chain :find, :jpmobile #:nodoc:
40
+
41
+ def mobile_template_candidates #:nodoc:
42
+ candidates = []
43
+
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"]
49
+ else
50
+ [nil, nil, nil]
51
+ end
52
+
53
+ if view_class and parent_class
54
+ find_mobile_template(view_class, parent_class, template_prefix).push(template_prefix)
55
+ else
56
+ []
57
+ end
58
+ end
59
+
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}")
66
+ end
67
+ end
68
+ end
69
+
70
+ module Helpers
71
+ module FormTagHelper
72
+ private
73
+ def html_options_for_form(url_for_options, options, *parameters_for_url)
74
+ accept_charset = (Rails.application.config.jpmobile.form_accept_charset_conversion && request && request.mobile && request.mobile.default_charset) || "UTF-8"
75
+
76
+ options.stringify_keys.tap do |html_options|
77
+ html_options["enctype"] = "multipart/form-data" if html_options.delete("multipart")
78
+ # The following URL is unescaped, this is just a hash of options, and it is the
79
+ # responsability of the caller to escape all the values.
80
+ html_options["action"] = url_for(url_for_options, *parameters_for_url)
81
+ html_options["accept-charset"] = accept_charset
82
+ html_options["data-remote"] = true if html_options.delete("remote")
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end