sort-by-alphabet 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile CHANGED
@@ -1 +1,41 @@
1
- bc. %w{ahoj čau nazdar}.sort_by_alphabet(CzechAlphabet)
1
+ This library implements alphabetical sorting according to given alphabet scheme. Currently, only Czech alphabet is included, but it is super-easy to create a new one.
2
+
3
+ h1. Setup
4
+
5
+ Install the gem:
6
+
7
+ bc. gem install sort-by-alphabet
8
+
9
+ Or require it into Rails:
10
+
11
+ bc. gem require "sort-by-alphabet"
12
+
13
+ h1. Requirements
14
+
15
+ Support of @mb_chars@, i.e. _ActiveSupport_ in practice.
16
+
17
+ h1. Usage
18
+
19
+ Classical sort puts accented chars after normal:
20
+
21
+ bc. %w{nazdar ahoj čau}.sort # => %w{ahoj nazdar čau}
22
+
23
+ @sort_by_alphabet@ does a better job:
24
+
25
+ bc. %w{nazdar ahoj čau}.sort_by_alphabet(CzechAlphabet) # => %w{ahoj čau nazdar}
26
+
27
+ @sort_by_alphabet@ can take a block which acts similarly as that in @sort_by@:
28
+
29
+ bc. Something.all.sort_by_alphabet(CzechAlphabet) {|o| o.title}
30
+
31
+ You can also make a class alphabetically comparable:
32
+
33
+ bc. class Something
34
+ comparable_by_alphabet(CzechAlphabet)
35
+ end
36
+
37
+ or use a block, e.g. for case insensitivity:
38
+
39
+ bc. class SomethingElse
40
+ comparable_by_alphabet(CzechAlphabet) {|obj| obj.mb_chars.downcase}
41
+ end
data/init.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "#{File::dirname __FILE__}/lib/alphabets"
2
2
  require "#{File::dirname __FILE__}/lib/enumerable"
3
+ require "#{File::dirname __FILE__}/lib/object"
3
4
  require "#{File::dirname __FILE__}/lib/sort_by_alphabet"
5
+
4
6
  String.send(:include, SortByAlphabet::InstanceMethods)
5
- String.send(:extend, SortByAlphabet::ClassMethods)
data/lib/alphabets.rb CHANGED
@@ -1,41 +1,24 @@
1
1
  class Alphabet
2
2
 
3
- def self.compare_letters_sensitive(x, y)
4
- i1 = lower_case.mb_chars.index(x)
5
- i2 = upper_case.mb_chars.index(x)
6
- j1 = lower_case.mb_chars.index(y)
7
- j2 = upper_case.mb_chars.index(y)
8
- if !i1 && !i2 or !j1 && !j2
9
- x <=> y
10
- elsif i1 && j2
11
- -1
12
- elsif i2 && j1
13
- +1
14
- elsif i1 && j1
15
- i1 <=> j1
16
- elsif i2 && j2
17
- i2 <=> j2
3
+ def self.compare_letters(x, y)
4
+ i = letters.mb_chars.index(x)
5
+ j = letters.mb_chars.index(y)
6
+ if i && j
7
+ i <=> j
18
8
  else
19
- raise "I did not think of something"
20
- end
21
- end
22
-
23
- def self.compare_letters_insensitive(x, y)
24
- i = lower_case.mb_chars.index(letter_to_lowercase(x))
25
- j = lower_case.mb_chars.index(letter_to_lowercase(y))
26
- if !i || !j
27
9
  x <=> y
28
- else
29
- i <=> j
30
10
  end
31
11
  end
32
12
 
33
- def self.letter_to_lowercase(a)
34
- i = upper_case.mb_chars.index(a)
35
- if i
36
- lower_case.mb_chars[i]
37
- else
38
- a
13
+ def self.by_locale(locale)
14
+ language = locale.split('-').first.downcase
15
+ case language
16
+ when 'cs'
17
+ CzechAlphabet
18
+ when 'en'
19
+ EnglishAlphabet
20
+ else
21
+ raise "Language #{language} of locale #{locale} is unknown."
39
22
  end
40
23
  end
41
24
 
@@ -43,12 +26,16 @@ end
43
26
 
44
27
  class CzechAlphabet < Alphabet
45
28
 
46
- def self.lower_case
47
- "aábcčdďeéěfghiíjklmnňoópqrřsštťuúůvwxyýzž"
29
+ def self.letters
30
+ "AÁBCČDĎEÉĚFGHIÍJKLMNŇOÓPQRŘSŠTŤUÚŮVWXYÝZŽaábcčdďeéěfghiíjklmnňoópqrřsštťuúůvwxyýzž"
48
31
  end
49
32
 
50
- def self.upper_case
51
- "AÁBCČDĎEÉĚFGHIÍJKLMNŇOÓPQRŘSŠTŤUÚŮVWXYÝZŽ"
33
+ end
34
+
35
+ class EnglishAlphabet < Alphabet
36
+
37
+ def self.letters
38
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklnopqrstuvwxyz"
52
39
  end
53
40
 
54
41
  end
data/lib/enumerable.rb CHANGED
@@ -2,17 +2,9 @@ module Enumerable
2
2
 
3
3
  def sort_by_alphabet(alphabet)
4
4
  if block_given?
5
- sort{|a, b| yield(a).to_s.compare_by_alphabet_sensitive(yield(b).to_s, alphabet)}
5
+ sort{|a, b| yield(a).to_s.compare_by_alphabet(yield(b).to_s, alphabet)}
6
6
  else
7
- sort{|a, b| a.to_s.compare_by_alphabet_sensitive(b.to_s, alphabet)}
8
- end
9
- end
10
-
11
- def isort_by_alphabet(alphabet)
12
- if block_given?
13
- sort{|a, b| yield(a).to_s.compare_by_alphabet_insensitive(yield(b).to_s, alphabet)}
14
- else
15
- sort{|a, b| a.to_s.compare_by_alphabet_insensitive(b.to_s, alphabet)}
7
+ sort{|a, b| a.to_s.compare_by_alphabet(b.to_s, alphabet)}
16
8
  end
17
9
  end
18
10
 
data/lib/object.rb ADDED
@@ -0,0 +1,15 @@
1
+ class Object
2
+
3
+ def self.comparable_by_alphabet(alphabet, &block)
4
+ if block
5
+ define_method :"<=>" do |other|
6
+ block[self].to_s.compare_by_alphabet(block[other].to_s, alphabet)
7
+ end
8
+ else
9
+ define_method :"<=>" do |other|
10
+ self.to_s.compare_by_alphabet(other.to_s, alphabet)
11
+ end
12
+ end
13
+ end
14
+
15
+ end
@@ -1,27 +1,17 @@
1
1
  module SortByAlphabet
2
-
3
- module ClassMethods
4
-
5
- end
6
-
7
- module InstanceMethods
8
- def compare_by_alphabet_insensitive(other, alphabet)
9
- compare_by_alphabet(other, alphabet, :compare_letters_insensitive)
10
- end
11
2
 
12
- def compare_by_alphabet_sensitive(other, alphabet)
13
- compare_by_alphabet(other, alphabet, :compare_letters_sensitive)
14
- end
15
-
16
- def compare_by_alphabet(other, alphabet, method)
3
+ module InstanceMethods
4
+
5
+ def compare_by_alphabet(other, alphabet)
17
6
  l1 = self.mb_chars.length
18
7
  l2 = other.mb_chars.length
19
8
  (0...[l1, l2].min).each do |i|
20
- c = alphabet.send(method, self.mb_chars[i..i], other.mb_chars[i..i])
9
+ c = alphabet.compare_letters(self.mb_chars[i..i], other.mb_chars[i..i])
21
10
  return c unless c == 0
22
11
  end
23
12
  l1 <=> l2
24
13
  end
14
+
25
15
  end
26
16
 
27
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sort-by-alphabet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frantisek Havluj
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-19 00:00:00 +01:00
12
+ date: 2010-01-22 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -24,6 +24,7 @@ extra_rdoc_files: []
24
24
  files:
25
25
  - lib/alphabets.rb
26
26
  - lib/enumerable.rb
27
+ - lib/object.rb
27
28
  - lib/sort-by-alphabet.rb
28
29
  - lib/sort_by_alphabet.rb
29
30
  - init.rb