35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/simple_page/active_record_extension.rb', line 35
def page_links_generator(page, options)
raise ArgumentError, "No window block supplied." unless block_given?
raise ArgumentError, "please specify a :inner option" unless inner = options[:inner]
return if self.page_count < 2
outer = options[:outer] || 0
= [ options[:extras] ].flatten.compact
page_number = page.to_i
last_page = self.page_count
next_page = page_number >= self.page_count ? nil : page_number + 1
prev_page = page_number > 1 ? page_number - 1 : nil
numbers = case
when page_number <= inner + 1
1 .. 1 + 2 * inner
when page_number >= self.page_count - inner
self.page_count - 2 * inner .. self.page_count
else
page_number - inner .. page_number + inner
end.to_a
1.upto(outer) { |n| numbers << n << self.page_count-n+1 }
numbers.uniq!
numbers.sort!
numbers.reject! { |number| !number.between?(1, self.page_count) }
[].tap do |results|
results << yield(:first, 1, []) if .include?(:first)
results << yield(:previous, prev_page, []) if .include?(:previous)
numbers.zip([nil]+numbers, numbers[1..-1]) do |number, prev_number, next_number|
classes = []
classes << :selected if page_number == number
classes << :gap_before if prev_number && prev_number < number - 1
classes << :gap_after if next_number && next_number > number + 1
results << yield(number, number, classes)
end
results << yield(:next, next_page, []) if .include?(:next)
results << yield(:last, self.page_count, []) if .include?(:last)
end.join("\n").html_safe
end
|