alphabetical_paginate 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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