alphabetical_paginate 1.4.0 → 1.5.0

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.
data/README.md CHANGED
@@ -8,6 +8,8 @@ AlphabeticalPaginate incorporates efficient javascript partial page rerendering
8
8
 
9
9
  It has two modes - if you're working with MySQL, it allows for low level database regex queries. Otherwise, it uses a buffered search to build an array. You should be able to easily modify the gem to work with other SQL databases (please make a pull-request if you do!).
10
10
 
11
+ We also now have Russian language support.
12
+
11
13
  Some code was inspired by [will_paginate](https://github.com/mislav/will_paginate).
12
14
 
13
15
 
@@ -98,6 +100,8 @@ The available options are as follows:
98
100
 
99
101
  Key | Value | Default |Description
100
102
  --- | --- | --- | ---
103
+ `:db_mode` | `Boolean` | `false` | Whether to activate low level SQL that are faster and more memory efficient (forces `:paginate_all` to enable)
104
+ `:db_field` | `String` | `id` | Required if `db_mode` is `true`. The field to paginate / sort by (on the same collection).
101
105
  `:enumerate` | `Boolean` | `false` | Whether you want the number field collapsed (all numbers go into `0`) or separate (`0`, `1`, `2`...).
102
106
  `:default_field` | `String` | `"a"` | Which field you want the page to default to on first load (`"0"`, `"a"`. `"*"`).
103
107
  `:paginate_all` | `Boolean` | `false` | Whether you want empty fields to still render in pagination.
@@ -106,6 +110,7 @@ Key | Value | Default |Description
106
110
  `:others` | `Boolean` | `true` | Whether you want all other characters (non alphanumeric) to be included in the pagination at all.
107
111
  `:pagination_class` | `String` | `"pagination-centered"` | All the classes you would like to add to the rendered pagination selector div (for CSS purposes).
108
112
  `:js` | `Boolean` | `"true"` | If you want the javascript with page-rerendering to be enabled.
113
+ `:support_language` | `Symbol` | `:en` | If you want russian letters support set this value to `:ru` (only if `I18n.locale` in your application set to `:ru`).
109
114
 
110
115
  ## Advanced Pagination
111
116
 
@@ -1,14 +1,17 @@
1
+ # coding: utf-8
1
2
  class Array
2
3
  def alpha_paginate current_field, params = {enumerate:false, default_field: "a",
3
4
  paginate_all: false, numbers: true, include_all: true,
4
5
  others: true, pagination_class: "pagination-centered",
5
- js: true}
6
+ js: true, support_language: :en}
6
7
  params[:paginate_all] ||= false
8
+ params[:support_language] ||= :en
9
+ params[:language] = AlphabeticalPaginate::Language.new(params[:support_language])
7
10
  params[:include_all] = true if !params.has_key? :include_all
8
11
  params[:numbers] = true if !params.has_key? :numbers
9
12
  params[:others] = true if !params.has_key? :others
10
13
  params[:js] = true if !params.has_key? :js
11
- params[:default_field] ||= params[:include_all] ? "all" : "a"
14
+ params[:default_field] ||= params[:include_all] ? "all" : params[:language].default_letter
12
15
  params[:pagination_class] ||= "pagination-centered"
13
16
  output = []
14
17
  availableLetters = {}
@@ -16,13 +19,14 @@ class Array
16
19
  current_field = params[:default_field]
17
20
  end
18
21
  all = params[:include_all] && current_field.downcase == "all"
22
+
19
23
  self.each do |x|
20
24
  field_val = block_given? ? yield(x).to_s : x.id.to_s
21
- field_letter = field_val[0].downcase
25
+ field_letter = field_val[0].mb_chars.downcase.to_s
22
26
  case field_letter
23
- when /[a-z]/
27
+ when params[:language].letters_regexp
24
28
  availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
25
- output << x if all || (current_field =~ /[a-z]/ && field_letter == current_field)
29
+ output << x if all || (current_field =~ params[:language].letters_regexp && field_letter == current_field)
26
30
  when /[0-9]/
27
31
  if params[:enumerate]
28
32
  availableLetters[field_letter] = true if !availableLetters.has_key? field_letter
@@ -36,6 +40,7 @@ class Array
36
40
  output << x if all || current_field == "*"
37
41
  end
38
42
  end
43
+
39
44
  params[:availableLetters] = availableLetters.collect{|k,v| k.to_s}
40
45
  params[:currentField] = current_field
41
46
  output.sort! {|x, y| block_given? ? (yield(x).to_s <=> yield(y).to_s) : (x.id.to_s <=> y.id.to_s) }
@@ -0,0 +1,45 @@
1
+ # coding: utf-8
2
+ module AlphabeticalPaginate
3
+ class Language
4
+ attr_reader :code
5
+
6
+ def initialize(code)
7
+ @code = code
8
+ end
9
+
10
+ def russian?
11
+ defined?(I18n) && I18n.locale == :ru && code == :ru
12
+ end
13
+
14
+ def letters_regexp
15
+ russian? ? /[#{russian_letters}]/ : /[a-z]/
16
+ end
17
+
18
+ def letters_range
19
+ if russian?
20
+ letters = []
21
+ russian_letters.each_char{ |x| letters << x }
22
+ letters
23
+ else
24
+ ('a'..'z').to_a
25
+ end
26
+ end
27
+
28
+ def output_letter(l)
29
+ (l == "all") ? all_field : l
30
+ end
31
+
32
+ def all_field
33
+ russian? ? 'все' : "all"
34
+ end
35
+
36
+ def default_letter
37
+ russian? ? "а" : "a" # First 'a' is russian, second - english
38
+ end
39
+
40
+ private
41
+ def russian_letters
42
+ "абвгдежзиклмнопрстуфхцчшэюя"
43
+ end
44
+ end
45
+ end
@@ -1,3 +1,3 @@
1
1
  module AlphabeticalPaginate
2
- VERSION = "1.4.0"
2
+ VERSION = "1.5.0"
3
3
  end
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  module AlphabeticalPaginate
2
3
  module ViewHelpers
3
4
  def alphabetical_paginate params
@@ -7,7 +8,7 @@ module AlphabeticalPaginate
7
8
  output += javascript_include_tag 'alphabetical_paginate' if params[:js]
8
9
 
9
10
  if params[:paginate_all]
10
- range = ('a'..'z').to_a
11
+ range = params[:language].letters_range
11
12
  if params[:others]
12
13
  range += ["*"]
13
14
  end
@@ -18,12 +19,13 @@ module AlphabeticalPaginate
18
19
  end
19
20
  range.unshift "all" if params[:include_all]
20
21
  range.each do |l|
22
+ value = params[:language].output_letter(l)
21
23
  if l == params[:currentField]
22
- links += '<li class="active"><a href="#" data-letter="' + l + '">' + l + "</a></li>"
24
+ links += '<li class="active"><a href="#" data-letter="' + l + '">' + value + "</a></li>"
23
25
  elsif params[:db_mode] or params[:availableLetters].include? l
24
- links += '<li><a href="?letter=' + l + '" data-letter="' + l + '">' + l + "</a></li>"
26
+ links += '<li><a href="?letter=' + l + '" data-letter="' + l + '">' + value + "</a></li>"
25
27
  else
26
- links += '<li class="disabled"><a href="?letter=' + l + '" data-letter="' + l + '">' + l + "</a></li>"
28
+ links += '<li class="disabled"><a href="?letter=' + l + '" data-letter="' + l + '">' + value + "</a></li>"
27
29
  end
28
30
  end
29
31
  else
@@ -34,10 +36,11 @@ module AlphabeticalPaginate
34
36
  params[:availableLetters] -= ["*"] if !params[:others]
35
37
 
36
38
  params[:availableLetters].each do |l|
39
+ value = params[:language].output_letter(l)
37
40
  if l == params[:currentField]
38
- links += '<li class="active"><a href="?letter=' + l + '" data-letter="' + l + '">' + l + '</a></li>'
41
+ links += '<li class="active"><a href="?letter=' + l + '" data-letter="' + l + '">' + value + '</a></li>'
39
42
  else
40
- links += '<li><a href="?letter=' + l + '" data-letter="' + l + '">' + l + "</a></li>"
43
+ links += '<li><a href="?letter=' + l + '" data-letter="' + l + '">' + value + "</a></li>"
41
44
  end
42
45
  end
43
46
  end
@@ -1,5 +1,6 @@
1
1
  require "alphabetical_paginate/version"
2
2
  require "alphabetical_paginate/array"
3
+ require "alphabetical_paginate/language"
3
4
  require "alphabetical_paginate/railtie" if defined?(Rails)
4
5
 
5
6
  module AlphabeticalPaginate
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require 'alpha_example'
2
3
  require 'alphabetical_paginate'
3
4
  require_relative '#{File.dirname(__FILE__)}/../../lib/alphabetical_paginate/view_helpers'
@@ -59,84 +60,154 @@ module AlphabeticalPaginate
59
60
  expectedParams.to_s
60
61
  end
61
62
  end
63
+
64
+ describe "#alpha_paginate in russian characters" do
65
+ before :each do
66
+ I18n.locale = :ru
67
+ @list = ["аа", "аб", "ас",
68
+ "ба", "бб", "бв",
69
+ "са", "сд", "се"].map do |x|
70
+ AlphaExample.new(x)
71
+ end
72
+ end
73
+
74
+ it "should paginate by id automatically" do
75
+ expectedCollection = ["са", "сд", "се"].map do |x|
76
+ AlphaExample.new(x)
77
+ end
78
+ expectedParams = {
79
+ availableLetters: ["а", "б", "с"],
80
+ currentField: "с",
81
+ enumerate: false,
82
+ }
83
+ collection, params = @list.alpha_paginate("с", { support_language: :ru })
84
+ collection.to_s.should ==
85
+ expectedCollection.to_s
86
+ params.to_s.should include
87
+ expectedParams.to_s
88
+ end
89
+
90
+ it "should paginate for russian characters with default 'a' character" do
91
+ expectedCollection = ["аа", "аб", "ас"].map do |x|
92
+ AlphaExample.new(x)
93
+ end
94
+ expectedParams = {
95
+ availableLetters: ["а", "б", "с"],
96
+ currentField: "а",
97
+ enumerate: false,
98
+ }
99
+ collection, params = @list.alpha_paginate(nil, { include_all: false, support_language: :ru })
100
+ collection.to_s.should ==
101
+ expectedCollection.to_s
102
+ params.to_s.should include
103
+ expectedParams.to_s
104
+ end
105
+ end
106
+
62
107
  include ViewHelpers
63
108
 
64
- describe "#alphabetical_paginate" do
65
- before :each do
66
- @list = []
67
- (["@!#"] + (0..9).to_a.map{|x| x.to_s} + ("a".."z").to_a).each do |x|
68
- ("a".."y").to_a.each do |y|
69
- @list << x + y
70
- end
109
+ describe "#alphabetical_paginate" do
110
+ before :each do
111
+ @list = []
112
+ (["@!#"] + (0..9).to_a.map{|x| x.to_s} + ("a".."z").to_a).each do |x|
113
+ ("a".."y").to_a.each do |y|
114
+ @list << x + y
71
115
  end
72
- @list.map! do |x|
73
- AlphaExample.new(x)
116
+ end
117
+ @list.map! do |x|
118
+ AlphaExample.new(x)
119
+ end
120
+ end
121
+
122
+ it "should have div tags and pagination classes" do
123
+ index, params = @list.alpha_paginate(nil)
124
+ pagination = alphabetical_paginate(params)
125
+ pagination.should include "div", "pagination"
126
+ end
127
+
128
+ it "should include a numbers and others field" do
129
+ index, params = @list.alpha_paginate(nil)
130
+ pagination = alphabetical_paginate(params)
131
+ (["*"] + ["0-9"] + ("a".."z").to_a.map{|x|
132
+ 'data-letter="%s"'%x}).each do |x|
133
+ pagination.should include x
134
+ end
135
+ end
136
+
137
+ it "should default all values when necessary" do
138
+ index, params = @list.alpha_paginate(nil, {})
139
+ pagination = alphabetical_paginate(params)
140
+ (["*"] + ["0-9"] + ("a".."z").to_a.map{|x|
141
+ 'data-letter="%s"'%x}).each do |x|
142
+ pagination.should include x
143
+ end
144
+ end
145
+
146
+ it "should hide values that don't exist" do
147
+ index, params = @list.alpha_paginate(nil){|x| x.word}
148
+ pagination = alphabetical_paginate(params)
149
+ (("a".."y").to_a.map{|x|
150
+ 'data-letter="%s"'%x}).each do |x|
151
+ pagination.should include x
152
+ end
153
+ pagination.should_not include 'data-letter="z"', 'data-letter="*"',
154
+ 'data-letter="0-9"'
155
+ end
156
+
157
+ it "should enumerate when asked" do
158
+ index, params = @list.alpha_paginate(nil, {enumerate: true})
159
+ pagination = alphabetical_paginate(params)
160
+ (("0".."9").to_a.map{|x|
161
+ 'data-letter="%s"'% x.to_s }).each do |x|
162
+ pagination.should include x
163
+ end
164
+
165
+ end
166
+
167
+ it "should display all when asked" do
168
+ index, params = @list.alpha_paginate(nil, {paginate_all: true,
169
+ enumerate: true}){|x| x.word}
170
+ pagination = alphabetical_paginate(params)
171
+ (["*"] + (0..9).to_a.map{|x| x.to_s} + ("a".."z").to_a.map{|x|
172
+ 'data-letter="%s"'%x}).each do |x|
173
+ pagination.should include x
174
+ end
175
+ end
176
+
177
+ it "should include 'all' and '0-9' fields" do
178
+ index, params = @list.alpha_paginate(nil, { include_all: true })
179
+ pagination = alphabetical_paginate(params)
180
+ (["all", "0-9"].map{|x|
181
+ 'data-letter="%s"'%x}).each do |x|
182
+ pagination.should include x
183
+ end
184
+ end
185
+ end
186
+
187
+ describe "#alphabetical_paginate in russian characters" do
188
+ before :each do
189
+ @list = []
190
+ ("а".."я").to_a.each do |x|
191
+ ("а".."т").to_a.each do |y|
192
+ @list << x + y
74
193
  end
75
194
  end
195
+ @list.map! do |x|
196
+ AlphaExample.new(x)
197
+ end
198
+ @russian_array = []
199
+ "абвгдежзиклмнопрстуфхцчшэюя".each_char{ |x| @russian_array << x }
200
+ end
76
201
 
77
- it "should have div tags and pagination classes" do
78
- index, params = @list.alpha_paginate(nil)
79
- pagination = alphabetical_paginate(params)
80
- pagination.should include "div", "pagination"
81
- end
82
-
83
- it "should include a numbers and others field" do
84
- index, params = @list.alpha_paginate(nil)
85
- pagination = alphabetical_paginate(params)
86
- (["*"] + ["0-9"] + ("a".."z").to_a.map{|x|
87
- 'data-letter="%s"'%x}).each do |x|
88
- pagination.should include x
89
- end
90
- end
91
-
92
- it "should default all values when necessary" do
93
- index, params = @list.alpha_paginate(nil, {})
94
- pagination = alphabetical_paginate(params)
95
- (["*"] + ["0-9"] + ("a".."z").to_a.map{|x|
96
- 'data-letter="%s"'%x}).each do |x|
97
- pagination.should include x
98
- end
99
- end
100
-
101
- it "should hide values that don't exist" do
102
- index, params = @list.alpha_paginate(nil){|x| x.word}
103
- pagination = alphabetical_paginate(params)
104
- (("a".."y").to_a.map{|x|
105
- 'data-letter="%s"'%x}).each do |x|
106
- pagination.should include x
107
- end
108
- pagination.should_not include 'data-letter="z"', 'data-letter="*"',
109
- 'data-letter="0-9"'
110
- end
111
-
112
- it "should enumerate when asked" do
113
- index, params = @list.alpha_paginate(nil, {enumerate: true})
114
- pagination = alphabetical_paginate(params)
115
- (("0".."9").to_a.map{|x|
116
- 'data-letter="%s"'% x.to_s }).each do |x|
117
- pagination.should include x
118
- end
119
-
120
- end
121
-
122
- it "should display all when asked" do
123
- index, params = @list.alpha_paginate(nil, {paginate_all: true,
124
- enumerate: true}){|x| x.word}
125
- pagination = alphabetical_paginate(params)
126
- (["*"] + (0..9).to_a.map{|x| x.to_s} + ("a".."z").to_a.map{|x|
127
- 'data-letter="%s"'%x}).each do |x|
128
- pagination.should include x
129
- end
130
- end
131
-
132
- it "should include 'all' and '0-9' fields" do
133
- index, params = @list.alpha_paginate(nil, { include_all: true })
134
- pagination = alphabetical_paginate(params)
135
- (["all", "0-9"].map{|x|
136
- 'data-letter="%s"'%x}).each do |x|
137
- pagination.should include x
138
- end
139
- end
202
+ it "should display russian characters through additional attribute(language)" do
203
+ I18n.locale = :ru
204
+ index, params = @list.alpha_paginate(nil, { paginate_all: true, others: false, support_language: :ru }){|x| x.word}
205
+ pagination = alphabetical_paginate(params)
206
+ (["0"] + @russian_array.map{|x|
207
+ 'data-letter="%s"'%x}).each do |x|
208
+ pagination.should include x
209
+ end
140
210
  end
141
211
  end
212
+ end
142
213
  end
@@ -0,0 +1,64 @@
1
+ # coding: utf-8
2
+
3
+ module AlphabeticalPaginate
4
+ describe Language do
5
+ context "English language" do
6
+ before(:all) do
7
+ @language = AlphabeticalPaginate::Language.new(:en)
8
+ end
9
+
10
+ it "should return false on russian? method" do
11
+ @language.russian?.should be_false
12
+ end
13
+
14
+ it "should return /[a-z]/ regexp" do
15
+ @language.letters_regexp.should eq(/[a-z]/)
16
+ end
17
+
18
+ it "should return array of english letters" do
19
+ @language.letters_range.should eq(("a".."z").to_a)
20
+ end
21
+
22
+ it "should return english representation of 'all' field and other english letters (for view helper)" do
23
+ (["all"] + ("a".."z").to_a).map do |l|
24
+ @language.output_letter(l).should eq(l)
25
+ end
26
+ end
27
+
28
+ it "should return english representation of 'a' letter" do
29
+ @language.default_letter.should eq("a")
30
+ end
31
+ end
32
+
33
+ context "Russian language" do
34
+ before(:all) do
35
+ @language = AlphabeticalPaginate::Language.new(:ru)
36
+ @russian_string = "абвгдежзиклмнопрстуфхцчшэюя"
37
+ @russian_array = []
38
+ @russian_string.each_char{ |x| @russian_array << x }
39
+ end
40
+
41
+ it "should return true on russian? method" do
42
+ @language.russian?.should be_true
43
+ end
44
+
45
+ it "should return /[абвгдежзиклмнопрстуфхцчшэюя]/ regexp" do
46
+ @language.letters_regexp.should eq(/[#{@russian_string}]/)
47
+ end
48
+
49
+ it "should return array of russian letters" do
50
+ @language.letters_range.should eq(@russian_array)
51
+ end
52
+
53
+ it "should return russian representation of 'all' field and other russian letters (for view helper)" do
54
+ (["все"] + @russian_array).map do |l|
55
+ @language.output_letter(l).should eq(l)
56
+ end
57
+ end
58
+
59
+ it "should return russian representation of 'a' letter" do
60
+ @language.default_letter.should eq("а")
61
+ end
62
+ end
63
+ end
64
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alphabetical_paginate
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.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: 2013-08-09 00:00:00.000000000 Z
12
+ date: 2013-08-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -92,11 +92,13 @@ files:
92
92
  - lib/alphabetical_paginate/array.rb
93
93
  - lib/alphabetical_paginate/controller_helper.rb
94
94
  - lib/alphabetical_paginate/engine.rb
95
+ - lib/alphabetical_paginate/language.rb
95
96
  - lib/alphabetical_paginate/railtie.rb
96
97
  - lib/alphabetical_paginate/version.rb
97
98
  - lib/alphabetical_paginate/view_helpers.rb
98
99
  - spec/alpha_example.rb
99
100
  - spec/alphabetical_paginate_spec.rb
101
+ - spec/language_spec.rb
100
102
  - spec/support/helpers.rb
101
103
  - vendor/assets/images/aloader.gif
102
104
  - vendor/assets/javascripts/alphabetical_paginate.js
@@ -129,4 +131,5 @@ summary: Pagination
129
131
  test_files:
130
132
  - spec/alpha_example.rb
131
133
  - spec/alphabetical_paginate_spec.rb
134
+ - spec/language_spec.rb
132
135
  - spec/support/helpers.rb