pagy 4.11.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/config/pagy.rb +66 -45
  3. data/lib/javascripts/pagy.js +15 -6
  4. data/lib/pagy/backend.rb +6 -10
  5. data/lib/pagy/console.rb +5 -4
  6. data/lib/pagy/countless.rb +13 -20
  7. data/lib/pagy/exceptions.rb +2 -4
  8. data/lib/pagy/extras/arel.rb +6 -6
  9. data/lib/pagy/extras/array.rb +6 -6
  10. data/lib/pagy/extras/bootstrap.rb +32 -29
  11. data/lib/pagy/extras/bulma.rb +40 -32
  12. data/lib/pagy/extras/countless.rb +8 -9
  13. data/lib/pagy/extras/elasticsearch_rails.rb +64 -47
  14. data/lib/pagy/extras/foundation.rb +26 -26
  15. data/lib/pagy/extras/gearbox.rb +42 -0
  16. data/lib/pagy/extras/headers.rb +24 -16
  17. data/lib/pagy/extras/i18n.rb +7 -16
  18. data/lib/pagy/extras/items.rb +37 -38
  19. data/lib/pagy/extras/materialize.rb +28 -30
  20. data/lib/pagy/extras/meilisearch.rb +50 -45
  21. data/lib/pagy/extras/metadata.rb +29 -13
  22. data/lib/pagy/extras/navs.rb +24 -26
  23. data/lib/pagy/extras/overflow.rb +57 -60
  24. data/lib/pagy/extras/searchkick.rb +51 -45
  25. data/lib/pagy/extras/semantic.rb +28 -30
  26. data/lib/pagy/extras/shared.rb +44 -40
  27. data/lib/pagy/extras/standalone.rb +37 -42
  28. data/lib/pagy/extras/support.rb +14 -13
  29. data/lib/pagy/extras/trim.rb +10 -11
  30. data/lib/pagy/extras/uikit.rb +27 -28
  31. data/lib/pagy/frontend.rb +22 -47
  32. data/lib/pagy/i18n.rb +159 -0
  33. data/lib/pagy/url_helpers.rb +22 -0
  34. data/lib/pagy.rb +52 -26
  35. data/lib/templates/uikit_nav.html.erb +1 -1
  36. data/lib/templates/uikit_nav.html.slim +1 -1
  37. metadata +7 -10
  38. data/lib/locales/utils/i18n.rb +0 -17
  39. data/lib/locales/utils/loader.rb +0 -31
  40. data/lib/locales/utils/p11n.rb +0 -112
  41. data/lib/pagy/deprecation.rb +0 -27
data/lib/pagy/i18n.rb ADDED
@@ -0,0 +1,159 @@
1
+ # See Pagy::I18n API documentation https://ddnexus.github.io/pagy/api/i18n
2
+ # frozen_string_literal: true
3
+
4
+ require 'yaml'
5
+
6
+ class Pagy
7
+ # Pagy i18n implementation, compatible with the I18n gem, just a lot faster and lighter
8
+ module I18n
9
+ extend self
10
+
11
+ # Pluralization rules
12
+ module P11n
13
+ # utility variables
14
+ from0to1 = [0, 1].freeze
15
+ from2to4 = [2, 3, 4].freeze
16
+ from5to9 = [5, 6, 7, 8, 9].freeze
17
+ from11to14 = [11, 12, 13, 14].freeze
18
+ from12to14 = [12, 13, 14].freeze
19
+
20
+ # Store the proc defining each pluralization RULE
21
+ # Logic adapted from https://github.com/svenfuchs/rails-i18n
22
+ RULE = {
23
+ arabic:
24
+ lambda do |n = 0|
25
+ mod100 = n % 100
26
+ case
27
+ when n == 0 then 'zero' # rubocop:disable Style/NumericPredicate
28
+ when n == 1 then 'one'
29
+ when n == 2 then 'two'
30
+ when (3..10).to_a.include?(mod100) then 'few'
31
+ when (11..99).to_a.include?(mod100) then 'many'
32
+ else 'other'
33
+ end
34
+ end,
35
+
36
+ east_slavic:
37
+ lambda do |n = 0|
38
+ mod10 = n % 10
39
+ mod100 = n % 100
40
+ case
41
+ when mod10 == 1 && mod100 != 11 then 'one'
42
+ when from2to4.include?(mod10) && !from12to14.include?(mod100) then 'few'
43
+ when mod10 == 0 || from5to9.include?(mod10) || from11to14.include?(mod100) then 'many' # rubocop:disable Style/NumericPredicate
44
+ else 'other'
45
+ end
46
+ end,
47
+
48
+ one_other:
49
+ ->(n) { n == 1 ? 'one' : 'other' }, # default RULE
50
+
51
+ one_two_other:
52
+ lambda do |n|
53
+ case n
54
+ when 1 then 'one'
55
+ when 2 then 'two'
56
+ else 'other'
57
+ end
58
+ end,
59
+
60
+ one_upto_two_other:
61
+ ->(n) { n && n >= 0 && n < 2 ? 'one' : 'other' },
62
+
63
+ other:
64
+ ->(*) { 'other' },
65
+
66
+ polish:
67
+ lambda do |n = 0|
68
+ mod10 = n % 10
69
+ mod100 = n % 100
70
+ case
71
+ when n == 1 then 'one'
72
+ when from2to4.include?(mod10) && !from12to14.include?(mod100) then 'few'
73
+ when (from0to1 + from5to9).include?(mod10) || from12to14.include?(mod100) then 'many'
74
+ else 'other'
75
+ end
76
+ end,
77
+
78
+ west_slavic:
79
+ lambda do |n|
80
+ case n
81
+ when 1 then 'one'
82
+ when *from2to4 then 'few'
83
+ else 'other'
84
+ end
85
+ end
86
+
87
+ }.freeze
88
+
89
+ # Store the RULE to apply to each LOCALE
90
+ # the :one_other RULE is the default for locales missing from this list
91
+ LOCALE = Hash.new(RULE[:one_other]).tap do |hash|
92
+ hash['ar'] = RULE[:arabic]
93
+ hash['bs'] = RULE[:east_slavic]
94
+ hash['cs'] = RULE[:west_slavic]
95
+ hash['id'] = RULE[:other]
96
+ hash['fr'] = RULE[:one_upto_two_other]
97
+ hash['hr'] = RULE[:east_slavic]
98
+ hash['ja'] = RULE[:other]
99
+ hash['km'] = RULE[:other]
100
+ hash['ko'] = RULE[:other]
101
+ hash['pl'] = RULE[:polish]
102
+ hash['ru'] = RULE[:east_slavic]
103
+ hash['sr'] = RULE[:east_slavic]
104
+ hash['sv'] = RULE[:one_two_other]
105
+ hash['sv-SE'] = RULE[:one_two_other]
106
+ hash['tr'] = RULE[:other]
107
+ hash['uk'] = RULE[:east_slavic]
108
+ hash['zh-CN'] = RULE[:other]
109
+ hash['zh-HK'] = RULE[:other]
110
+ hash['zh-TW'] = RULE[:other]
111
+ end.freeze
112
+ end
113
+
114
+ # Stores the i18n DATA structure for each loaded locale
115
+ # default on the first locale DATA
116
+ DATA = Hash.new { |hash, _| hash.first[1] }
117
+
118
+ private
119
+
120
+ # Create a flat hash with dotted notation keys
121
+ def flatten(initial, prefix = '')
122
+ initial.each.reduce({}) do |hash, (key, value)|
123
+ hash.merge!(value.is_a?(Hash) ? flatten(value, "#{prefix}#{key}.") : { "#{prefix}#{key}" => value })
124
+ end
125
+ end
126
+
127
+ # Build the DATA hash out of the passed locales
128
+ def build(*locales)
129
+ locales.each do |locale|
130
+ locale[:filepath] ||= Pagy.root.join('locales', "#{locale[:locale]}.yml")
131
+ locale[:pluralize] ||= P11n::LOCALE[locale[:locale]]
132
+ dictionary = YAML.safe_load(File.read(locale[:filepath], encoding: 'UTF-8'))
133
+ raise VariableError, %(expected :locale "#{locale[:locale]}" not found in :filepath "#{locale[:filepath].inspect}") \
134
+ unless dictionary.key?(locale[:locale])
135
+
136
+ DATA[locale[:locale]] = [flatten(dictionary[locale[:locale]]), locale[:pluralize]]
137
+ end
138
+ end
139
+ # Build the default at require time
140
+ build(locale: 'en')
141
+
142
+ public
143
+
144
+ # Public method to configure the locales: overrides the default, build the DATA and freezes it
145
+ def load(*locales)
146
+ DATA.clear
147
+ build(*locales)
148
+ DATA.freeze
149
+ end
150
+
151
+ # Translate and pluralize the key with the locale DATA
152
+ def t(locale, key, **opts)
153
+ data, pluralize = DATA[locale]
154
+ translation = data[key] || (opts[:count] && data[key += ".#{pluralize.call(opts[:count])}"]) \
155
+ or return %([translation missing: "#{key}"])
156
+ translation.gsub(/%{[^}]+?}/) { |match| opts[:"#{match[2..-2]}"] || match }
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pagy
4
+ # Provide the helpers to handle the url in frontend and backend
5
+ module UrlHelpers
6
+ # This works with all Rack-based frameworks (Sinatra, Padrino, Rails, ...)
7
+ def pagy_url_for(pagy, page, absolute: nil)
8
+ p_vars = pagy.vars
9
+ params = request.GET.merge(p_vars[:params])
10
+ params[p_vars[:page_param].to_s] = page
11
+ params[p_vars[:items_param].to_s] = p_vars[:items] if defined?(ItemsExtra)
12
+ # we rely on Rack by default: use the standalone extra in non rack environments
13
+ query_string = "?#{Rack::Utils.build_nested_query(pagy_massage_params(params))}" unless params.empty?
14
+ "#{request.base_url if absolute}#{request.path}#{query_string}#{p_vars[:fragment]}"
15
+ end
16
+
17
+ # Sub-method called only by #pagy_url_for: here for easy customization of params by overriding
18
+ def pagy_massage_params(params)
19
+ params
20
+ end
21
+ end
22
+ end
data/lib/pagy.rb CHANGED
@@ -3,58 +3,61 @@
3
3
 
4
4
  require 'pathname'
5
5
 
6
- # main class
6
+ # Core class
7
7
  class Pagy
8
- VERSION = '4.11.0'
8
+ VERSION = '5.0.0'
9
9
 
10
10
  # Root pathname to get the path of Pagy files like templates or dictionaries
11
11
  def self.root
12
12
  @root ||= Pathname.new(__dir__).freeze
13
13
  end
14
14
 
15
- # default vars
16
- VARS = { page: 1, items: 20, outset: 0, size: [1, 4, 4, 1], page_param: :page, # rubocop:disable Style/MutableConstant
17
- params: {}, fragment: '', link_extra: '', i18n_key: 'pagy.item_name', cycle: false }
15
+ # Default core vars: constant for easy access, but mutable for customizable defaults
16
+ DEFAULT = { page: 1, # rubocop:disable Style/MutableConstant
17
+ items: 20,
18
+ outset: 0,
19
+ size: [1, 4, 4, 1],
20
+ page_param: :page,
21
+ params: {},
22
+ fragment: '',
23
+ link_extra: '',
24
+ i18n_key: 'pagy.item_name',
25
+ cycle: false }
18
26
 
19
- attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :from, :to, :prev, :next
20
-
21
- INSTANCE_VARS_MIN = { count: 0, items: 1, page: 1, outset: 0 }.freeze
27
+ attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :in, :from, :to, :prev, :next
22
28
 
23
29
  # Merge and validate the options, do some simple arithmetic and set the instance variables
24
30
  def initialize(vars)
25
- @vars = VARS.merge( vars.delete_if{|k,v| VARS.key?(k) && (v.nil? || v == '') } )
26
- @vars[:fragment] = Pagy.deprecated_var(:anchor, @vars[:anchor], :fragment, @vars[:fragment]) if @vars[:anchor]
27
-
28
- INSTANCE_VARS_MIN.each do |name,min|
29
- raise VariableError.new(self), "expected :#{name} >= #{min}; got #{@vars[name].inspect}" \
30
- unless @vars[name] && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
31
- end
32
- @pages = @last = [(@count.to_f / @items).ceil, 1].max
31
+ normalize_vars(vars)
32
+ setup_vars(count: 0, page: 1, outset: 0)
33
+ setup_items_var
34
+ setup_pages_var
33
35
  raise OverflowError.new(self), "expected :page in 1..#{@last}; got #{@page.inspect}" \
34
36
  if @page > @last
35
37
 
36
- @offset = @items * (@page - 1) + @outset
37
- @items = @count - ((@pages - 1) * @items) if @page == @last && @count.positive?
38
- @from = @count.zero? ? 0 : @offset + 1 - @outset
39
- @to = @count.zero? ? 0 : @offset + @items - @outset
38
+ @offset = (@items * (@page - 1)) + @outset
39
+ @from = [@offset - @outset + 1, @count].min
40
+ @to = [@offset - @outset + @items, @count].min
41
+ @in = [@to - @from + 1, @count].min
40
42
  @prev = (@page - 1 unless @page == 1)
41
43
  @next = @page == @last ? (1 if @vars[:cycle]) : @page + 1
42
44
  end
43
45
 
44
46
  # Return the array of page numbers and :gap items e.g. [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
45
- def series(size=@vars[:size])
47
+ def series(size = @vars[:size])
46
48
  return [] if size.empty?
47
49
  raise VariableError.new(self), "expected 4 items >= 0 in :size; got #{size.inspect}" \
48
- unless size.size == 4 && size.all?{ |num| !num.negative? rescue false } # rubocop:disable Style/RescueModifier
50
+ unless size.size == 4 && size.all? { |num| !num.negative? rescue false } # rubocop:disable Style/RescueModifier
51
+
49
52
  # This algorithm is up to ~5x faster and ~2.3x lighter than the previous one (pagy < 4.3)
50
- left_gap_start = 1 + size[0]
53
+ left_gap_start = 1 + size[0] # rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
51
54
  left_gap_end = @page - size[1] - 1
52
55
  right_gap_start = @page + size[2] + 1
53
56
  right_gap_end = @last - size[3]
54
57
  left_gap_end = right_gap_end if left_gap_end > right_gap_end
55
58
  right_gap_start = left_gap_start if left_gap_start > right_gap_start
56
- series = []
57
- start = 1
59
+ series = []
60
+ start = 1
58
61
  if (left_gap_end - left_gap_start).positive?
59
62
  series.push(*start..(left_gap_start - 1), :gap)
60
63
  start = left_gap_end + 1
@@ -68,9 +71,32 @@ class Pagy
68
71
  series
69
72
  end
70
73
 
74
+ protected
75
+
76
+ # Apply defaults, cleanup blanks and set @vars
77
+ def normalize_vars(vars)
78
+ @vars = DEFAULT.merge(vars.delete_if { |k, v| DEFAULT.key?(k) && (v.nil? || v == '') })
79
+ end
80
+
81
+ # Setup and validates the passed vars: var must be present and value.to_i must be >= to min
82
+ def setup_vars(name_min)
83
+ name_min.each do |name, min|
84
+ raise VariableError.new(self), "expected :#{name} >= #{min}; got #{@vars[name].inspect}" \
85
+ unless @vars[name] && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
86
+ end
87
+ end
88
+
89
+ # Setup and validate the items (overridden by the gearbox extra)
90
+ def setup_items_var
91
+ setup_vars(items: 1)
92
+ end
93
+
94
+ # Setup and validates the pages (overridden by the gearbox extra)
95
+ def setup_pages_var
96
+ @pages = @last = [(@count.to_f / @items).ceil, 1].max
97
+ end
71
98
  end
72
99
 
73
- require 'pagy/deprecation'
74
100
  require 'pagy/backend'
75
101
  require 'pagy/frontend'
76
102
  require 'pagy/exceptions'
@@ -9,7 +9,7 @@
9
9
  <% elsif item == :gap -%> <li class="uk-disabled"><span><%== pagy_t('pagy.nav.gap') %></span></li>
10
10
  <% end -%>
11
11
  <% end -%>
12
- <% if pagy.next -%> <li><%== link.call(p_next, "<span uk-pagination-next>#{pagy_t('pagy.nav.next')}</span>") %></li>
12
+ <% if pagy.next -%> <li><%== link.call(pagy.next, "<span uk-pagination-next>#{pagy_t('pagy.nav.next')}</span>") %></li>
13
13
  <% else -%> <li class="uk-disabled"><a href="#"><span uk-pagination-next><%== pagy_t('pagy.nav.next') %></span></a></li>
14
14
  <% end -%>
15
15
  <%# -%> </ul>
@@ -21,7 +21,7 @@ ul.uk-pagination.uk-flex-center
21
21
  span== pagy_t('pagy.nav.gap')
22
22
 
23
23
  - if pagy.next
24
- li== link.call(p_next, "<span uk-pagination-next>#{pagy_t('pagy.nav.next')}</span>")
24
+ li== link.call(pagy.next, "<span uk-pagination-next>#{pagy_t('pagy.nav.next')}</span>")
25
25
  - else
26
26
  li.uk-disabled
27
27
  a href="#"
metadata CHANGED
@@ -1,18 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagy
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.11.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domizio Demichelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-20 00:00:00.000000000 Z
11
+ date: 2021-10-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 'Agnostic pagination in plain ruby: it works with any framework, ORM
14
- and DB type, with all kinds of collections, even pre-paginated, scopes, Arrays,
15
- JSON data... Easy, powerful, fast and light.'
13
+ description: Agnostic pagination in plain ruby. It does it all. Better.
16
14
  email:
17
15
  - dd.nexus@gmail.com
18
16
  executables: []
@@ -50,9 +48,6 @@ files:
50
48
  - lib/locales/sw.yml
51
49
  - lib/locales/tr.yml
52
50
  - lib/locales/uk.yml
53
- - lib/locales/utils/i18n.rb
54
- - lib/locales/utils/loader.rb
55
- - lib/locales/utils/p11n.rb
56
51
  - lib/locales/zh-CN.yml
57
52
  - lib/locales/zh-HK.yml
58
53
  - lib/locales/zh-TW.yml
@@ -60,7 +55,6 @@ files:
60
55
  - lib/pagy/backend.rb
61
56
  - lib/pagy/console.rb
62
57
  - lib/pagy/countless.rb
63
- - lib/pagy/deprecation.rb
64
58
  - lib/pagy/exceptions.rb
65
59
  - lib/pagy/extras/arel.rb
66
60
  - lib/pagy/extras/array.rb
@@ -69,6 +63,7 @@ files:
69
63
  - lib/pagy/extras/countless.rb
70
64
  - lib/pagy/extras/elasticsearch_rails.rb
71
65
  - lib/pagy/extras/foundation.rb
66
+ - lib/pagy/extras/gearbox.rb
72
67
  - lib/pagy/extras/headers.rb
73
68
  - lib/pagy/extras/i18n.rb
74
69
  - lib/pagy/extras/items.rb
@@ -85,6 +80,8 @@ files:
85
80
  - lib/pagy/extras/trim.rb
86
81
  - lib/pagy/extras/uikit.rb
87
82
  - lib/pagy/frontend.rb
83
+ - lib/pagy/i18n.rb
84
+ - lib/pagy/url_helpers.rb
88
85
  - lib/templates/bootstrap_nav.html.erb
89
86
  - lib/templates/bootstrap_nav.html.haml
90
87
  - lib/templates/bootstrap_nav.html.slim
@@ -122,5 +119,5 @@ requirements: []
122
119
  rubygems_version: 3.2.3
123
120
  signing_key:
124
121
  specification_version: 4
125
- summary: The Ultimate Pagination Ruby Gem
122
+ summary: The kick-ass pagination ruby gem
126
123
  test_files: []
@@ -1,17 +0,0 @@
1
- # See https://ddnexus.github.io/pagy/api/frontend#i18n
2
- # frozen_string_literal: true
3
-
4
- # this file returns the I18n hash used as default alternative to the i18n gem
5
-
6
- Hash.new{|h,_| h.first[1]}.tap do |i18n_hash| # first loaded locale used as default
7
- i18n_hash.define_singleton_method(:load) do |*load_args|
8
- # eval: we don't need to keep the loader proc in memory
9
- eval(Pagy.root.join('locales', 'utils', 'loader.rb').read).call(i18n_hash, *load_args) #rubocop:disable Security/Eval
10
- end
11
- i18n_hash.define_singleton_method(:t) do |locale, key, **opts|
12
- data, pluralize = self[locale]
13
- translate = data[key] || opts[:count] && data[key+=".#{pluralize.call(opts[:count])}"] or return %([translation missing: "#{key}"])
14
- translate.call(opts)
15
- end
16
- i18n_hash.load(locale: 'en')
17
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # the whole file will be eval'ed/executed and gc-collected after returning/executing the loader proc
4
-
5
- # eval: no need for the whole file in memory
6
- plurals, = eval Pagy.root.join('locales', 'utils', 'p11n.rb').read # rubocop:disable Security/Eval
7
-
8
- # flatten the dictionary file nested keys
9
- # convert each value to a simple ruby interpolation proc
10
- flatten = lambda do |hash, key=''|
11
- hash.each.reduce({}) do |h, (k, v)|
12
- if v.is_a?(Hash)
13
- h.merge! flatten.call(v, "#{key}#{k}.")
14
- else
15
- code = %({"#{key}#{k}" => lambda{|vars|"#{v.gsub(/%{[^}]+?}/){|m| "\#{vars[:#{m[2..-2]}]||'#{m}'}" }}"}})
16
- h.merge! eval(code) # rubocop:disable Security/Eval
17
- end
18
- end
19
- end
20
-
21
- # loader proc
22
- lambda do |i18n, *args|
23
- i18n.clear
24
- args.each do |arg|
25
- arg[:filepath] ||= Pagy.root.join('locales', "#{arg[:locale]}.yml")
26
- arg[:pluralize] ||= plurals[arg[:locale]]
27
- hash = YAML.load(File.read(arg[:filepath], encoding: 'UTF-8')) #rubocop:disable Security/YAMLLoad
28
- hash.key?(arg[:locale]) or raise VariableError, %(expected :locale "#{arg[:locale]}" not found in :filepath "#{arg[:filepath].inspect}")
29
- i18n[arg[:locale]] = [flatten.call(hash[arg[:locale]]), arg[:pluralize]]
30
- end
31
- end
@@ -1,112 +0,0 @@
1
- # See https://ddnexus.github.io/pagy/api/frontend#i18n
2
- # frozen_string_literal: true
3
-
4
- # This file adds support for multiple built-in plualization types.
5
- # It defines the pluralization procs and gets eval(ed) and gc-collected at Pagy::I18n.load time.
6
-
7
- # utility variables
8
- from0to1 = [0,1].freeze
9
- from2to4 = [2,3,4].freeze
10
- from5to9 = [5,6,7,8,9].freeze
11
- from11to14 = [11,12,13,14].freeze
12
- from12to14 = [12,13,14].freeze
13
-
14
- # Pluralization (p11n)
15
- # Compliant with the I18n gem
16
- # A pluralization proc returns a plural type string based on the passed count
17
- # Each proc may apply to one or more locales below.
18
- # Pluralization logic adapted from https://github.com/svenfuchs/rails-i18n
19
- p11n = {
20
- one_other: -> (n){ n == 1 ? 'one' : 'other' }, # default
21
-
22
- arabic: lambda do |n|
23
- n ||= 0
24
- mod100 = n % 100
25
-
26
- case
27
- when n == 0 then 'zero' # rubocop:disable Style/NumericPredicate
28
- when n == 1 then 'one'
29
- when n == 2 then 'two'
30
- when (3..10).to_a.include?(mod100) then 'few'
31
- when (11..99).to_a.include?(mod100) then 'many'
32
- else 'other'
33
- end
34
- end,
35
-
36
- east_slavic: lambda do |n|
37
- n ||= 0
38
- mod10 = n % 10
39
- mod100 = n % 100
40
-
41
- case
42
- when mod10 == 1 && mod100 != 11 then 'one'
43
- when from2to4.include?(mod10) && !from12to14.include?(mod100) then 'few'
44
- when mod10 == 0 || from5to9.include?(mod10) || from11to14.include?(mod100) then 'many' # rubocop:disable Style/NumericPredicate
45
- else 'other'
46
- end
47
- end,
48
-
49
- one_two_other: lambda do |n|
50
- case n
51
- when 1 then 'one'
52
- when 2 then 'two'
53
- else 'other'
54
- end
55
- end,
56
-
57
- one_upto_two_other: -> (n){ n && n >= 0 && n < 2 ? 'one' : 'other' },
58
-
59
- other: -> (*){ 'other' },
60
-
61
- polish: lambda do |n|
62
- n ||= 0
63
- mod10 = n % 10
64
- mod100 = n % 100
65
-
66
- case
67
- when n == 1 then 'one'
68
- when from2to4.include?(mod10) && !from12to14.include?(mod100) then 'few'
69
- when (from0to1 + from5to9).include?(mod10) || from12to14.include?(mod100) then 'many'
70
- else 'other'
71
- end
72
- end,
73
-
74
- west_slavic: lambda do |n|
75
- case n
76
- when 1 then 'one'
77
- when 2, 3, 4 then 'few'
78
- else 'other'
79
- end
80
- end
81
-
82
- }
83
-
84
- # Hash of locale/pluralization pairs
85
- # It contains all the entries for all the locales defined as dictionaries.
86
- # The default pluralization for locales not explicitly listed here
87
- # is the :one_other pluralization proc (used for English)
88
- plurals = Hash.new(p11n[:one_other]).tap do |hash|
89
- hash['ar'] = p11n[:arabic]
90
- hash['bs'] = p11n[:east_slavic]
91
- hash['cs'] = p11n[:west_slavic]
92
- hash['id'] = p11n[:other]
93
- hash['fr'] = p11n[:one_upto_two_other]
94
- hash['hr'] = p11n[:east_slavic]
95
- hash['ja'] = p11n[:other]
96
- hash['km'] = p11n[:other]
97
- hash['ko'] = p11n[:other]
98
- hash['pl'] = p11n[:polish]
99
- hash['ru'] = p11n[:east_slavic]
100
- hash['sr'] = p11n[:east_slavic]
101
- hash['sv'] = p11n[:one_two_other]
102
- hash['sv-SE'] = p11n[:one_two_other]
103
- hash['tr'] = p11n[:other]
104
- hash['uk'] = p11n[:east_slavic]
105
- hash['zh-CN'] = p11n[:other]
106
- hash['zh-HK'] = p11n[:other]
107
- hash['zh-TW'] = p11n[:other]
108
- end
109
-
110
- [ plurals, p11n ]
111
-
112
- # PR for other locales and pluralizations are very welcome. Thanks!
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
- class Pagy
3
- class << self
4
-
5
- # deprecated variables
6
- def deprecated_var(var, val, new_var, new_val)
7
- value = val || new_val
8
- Warning.warn %([PAGY WARNING] deprecated use of '#{var}' var will not be supported in 5.0! Use '#{new_var}: #{value.inspect}' instead.)
9
- value
10
- end
11
-
12
- # deprecated pagy_url_for argument order
13
- def deprecated_order(pagy, page)
14
- Warning.warn %([PAGY WARNING] inverted use of pagy/page in pagy_url_for will not be supported in 5.0! Use pagy_url_for(pagy, page) instead.)
15
- [page, pagy]
16
- end
17
-
18
-
19
- # deprecated posiitioal arguments
20
- def deprecated_arg(arg, val, new_key, new_val)
21
- value = val || new_val # we use the new_val if present
22
- Warning.warn %([PAGY WARNING] deprecated use of positional '#{arg}' arg will not be supported in 5.0! Use only the keyword arg '#{new_key}: #{value.inspect}' instead.)
23
- value
24
- end
25
-
26
- end
27
- end