Class: TwitterCldr::Collation::Collator

Inherits:
Object
  • Object
show all
Defined in:
lib/twitter_cldr/collation/collator.rb

Overview

Collator uses fractional collation elements table form CLDR to generate sort keys for Unicode strings as well as compare and sort such strings by generated sort keys.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(locale = nil) ⇒ Collator

Returns a new instance of Collator.



16
17
18
19
20
# File 'lib/twitter_cldr/collation/collator.rb', line 16

def initialize(locale = nil)
  @locale  = TwitterCldr.convert_locale(locale) if locale
  @options = tailoring_options
  @trie    = load_trie
end

Instance Attribute Details

#localeObject

Returns the value of attribute locale.



14
15
16
# File 'lib/twitter_cldr/collation/collator.rb', line 14

def locale
  @locale
end

Class Method Details

.default_trieObject

Loads and memoizes the default fractional collation elements trie.



135
136
137
# File 'lib/twitter_cldr/collation/collator.rb', line 135

def default_trie
  @default_trie ||= TwitterCldr::Collation::TrieLoader.load_default_trie.lock
end

.tailored_trie(locale) ⇒ Object



139
140
141
# File 'lib/twitter_cldr/collation/collator.rb', line 139

def tailored_trie(locale)
  tailored_tries_cache[locale]
end

Instance Method Details

#compare(string_a, string_b) ⇒ Object



31
32
33
# File 'lib/twitter_cldr/collation/collator.rb', line 31

def compare(string_a, string_b)
  string_a == string_b ? 0 : get_sort_key(string_a) <=> get_sort_key(string_b)
end

#get_collation_elements(string_or_code_points) ⇒ Object



39
40
41
42
43
44
45
# File 'lib/twitter_cldr/collation/collator.rb', line 39

def get_collation_elements(string_or_code_points)
  code_points = get_normalized_code_points(string_or_code_points)

  result = []
  result.concat(code_point_collation_elements(code_points)) until code_points.empty?
  result
end

#get_sort_key(string_or_code_points) ⇒ Object



35
36
37
# File 'lib/twitter_cldr/collation/collator.rb', line 35

def get_sort_key(string_or_code_points)
  TwitterCldr::Collation::SortKeyBuilder.build(get_collation_elements(string_or_code_points), @options[:case_first])
end

#sort(strings) ⇒ Object



22
23
24
# File 'lib/twitter_cldr/collation/collator.rb', line 22

def sort(strings)
  strings.map{ |s| [s, get_sort_key(s)] }.sort{ |a, b| a[1] <=> b[1] }.map(&:first)
end

#sort!(strings) ⇒ Object



26
27
28
29
# File 'lib/twitter_cldr/collation/collator.rb', line 26

def sort!(strings)
  sort_keys = Hash.new { |hash, string| hash[string] = get_sort_key(string) }
  strings.replace(strings.sort_by { |s| sort_keys[s] })
end