homura 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -42,6 +42,14 @@ In application controller:
42
42
  Your app will set locale via params/cookies/http-accept-language before any
43
43
  requests.
44
44
 
45
+ ### Mobile Detection
46
+
47
+ In application controller:
48
+
49
+ include Homura::MobileDetection
50
+
51
+ Then put your mobile views in `app/mobile_views`.
52
+
45
53
  ## Contributing
46
54
 
47
55
  1. Fork it
@@ -0,0 +1,66 @@
1
+ # This module will add mobile device detection support.
2
+ #
3
+ # It makes mobile and desktop to share the same controller, the same url,
4
+ # but different templates.
5
+ #
6
+ # It will store current status in cookie[mobile].
7
+ #
8
+ # Client may pass mobile=0|1 to any url to modify the cookie.
9
+ #
10
+ # Server will serve templates in app/mobile_views rather than app/views
11
+ # if requested templates available.
12
+ #
13
+ # References:
14
+ # http://erniemiller.org/2011/01/05/mobile-devices-and-rails-maintaining-your-sanity/
15
+ # http://johannburkard.de/blog/www/mobile/simple-mobile-phone-detection.html
16
+ module Homura
17
+ module MobileDetection
18
+ MOBILE_USER_AGENTS = /(IEMobile|Windows CE|NetFront|PlayStation|
19
+ PLAYSTATION|like Mac OS X|MIDP|UP\.Browser|
20
+ Symbian|Nintendo|Android)/x
21
+
22
+ def self.included(base)
23
+ base.class_eval do
24
+ before_filter :set_mobile_preferences
25
+ before_filter :prepend_view_path_if_mobile
26
+
27
+ helper_method :mobile_request?
28
+ helper_method :mobile_browser?
29
+ end
30
+ end
31
+
32
+ def set_mobile_preferences
33
+ case params[:mobile]
34
+ when '1'
35
+ cookies['mobile'] = '1'
36
+ redirect_to_current_page_without_mobile_param
37
+ when '0'
38
+ cookies['mobile'] = '0'
39
+ redirect_to_current_page_without_mobile_param
40
+ else
41
+ cookies['mobile'] ||= mobile_browser? ? '1' : '0'
42
+ end
43
+ end
44
+
45
+ def prepend_view_path_if_mobile
46
+ if mobile_request?
47
+ prepend_view_path Rails.root + 'app/mobile_views'
48
+ end
49
+ end
50
+
51
+ def redirect_to_current_page_without_mobile_param
52
+ path = request.fullpath.gsub(/mobile=[01]&?/, '').chomp('?')
53
+ full_url = request.protocol + request.host_with_port + path
54
+ redirect_to full_url
55
+ end
56
+
57
+ def mobile_request?
58
+ cookies['mobile'] == '1'
59
+ end
60
+
61
+ def mobile_browser?
62
+ request.env['HTTP_USER_AGENT'] &&
63
+ request.env['HTTP_USER_AGENT'][MOBILE_USER_AGENTS]
64
+ end
65
+ end
66
+ end
@@ -10,22 +10,26 @@ module Homura
10
10
  @available_locales ||= I18n.available_locales.map(&:to_s)
11
11
  end
12
12
 
13
+ def locale_available?(locale)
14
+ available_locales.include?(locale)
15
+ end
16
+
13
17
  def set_locale
14
- if params['locale'] && available_locales.include?(params['locale'])
18
+ if params['locale'] && locale_available?(params['locale'])
15
19
  cookies.permanent['locale'] = locale
16
20
  I18n.locale = locale and return
17
21
  end
18
22
 
19
- if cookies['locale'] && available_locales.include?(locale)
23
+ if cookies['locale'] && locale_available?(locale)
20
24
  I18n.locale = locale and return
21
25
  end
22
26
 
23
27
  http_accept_language = request.headers['HTTP_ACCEPT_LANGUAGE'] || ''
24
28
  preferred_locales = http_accept_language.split(',').map { |l|
25
- l.split(';').first
29
+ l.split(';').first.downcase.gsub(/-[a-z0-9]+$/i) { |x| x.upcase }
26
30
  }
27
31
  I18n.locale = preferred_locales.find { |l|
28
- available_locales.include?(l)
32
+ locale_available?(l)
29
33
  }
30
34
  end
31
35
  end
@@ -1,3 +1,3 @@
1
1
  module Homura
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: homura
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-26 00:00:00.000000000 Z
12
+ date: 2012-08-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -147,6 +147,7 @@ files:
147
147
  - lib/generators/homura/install/templates/layout.en.yml
148
148
  - lib/homura.rb
149
149
  - lib/homura/engine.rb
150
+ - lib/homura/mobile_detection.rb
150
151
  - lib/homura/set_locale.rb
151
152
  - lib/homura/version.rb
152
153
  - spec/dummy/.gitignore
@@ -198,7 +199,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
198
199
  version: '0'
199
200
  segments:
200
201
  - 0
201
- hash: 1433169692036508751
202
+ hash: -206518130249304431
202
203
  required_rubygems_version: !ruby/object:Gem::Requirement
203
204
  none: false
204
205
  requirements:
@@ -207,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
208
  version: '0'
208
209
  segments:
209
210
  - 0
210
- hash: 1433169692036508751
211
+ hash: -206518130249304431
211
212
  requirements: []
212
213
  rubyforge_project:
213
214
  rubygems_version: 1.8.23