lib/ffi-icu/collation.rb in ffi-icu-0.4.3 vs lib/ffi-icu/collation.rb in ffi-icu-0.5.0
- old
+ new
@@ -1,8 +1,40 @@
module ICU
module Collation
+ ATTRIBUTES = {
+ french_collation: 0,
+ alternate_handling: 1,
+ case_first: 2,
+ case_level: 3,
+ normalization_mode: 4,
+ strength: 5,
+ hiragana_quaternary_mode: 6,
+ numeric_collation: 7,
+ }.freeze
+
+ ATTRIBUTE_VALUES = {
+ nil => -1,
+ primary: 0,
+ secondary: 1,
+ default_strength: 2,
+ tertiary: 2,
+ quaternary: 3,
+ identical: 15,
+
+ false => 16,
+ true => 17,
+
+ shifted: 20,
+ non_ignorable: 21,
+
+ lower_first: 24,
+ upper_first: 25,
+ }.freeze
+
+ ATTRIBUTE_VALUES_INVERSE = Hash[ATTRIBUTE_VALUES.map {|k,v| [v, k]}].freeze
+
def self.collate(locale, arr)
Collator.new(locale).collate(arr)
end
def self.keywords
@@ -78,12 +110,46 @@
end
def rules
@rules ||= begin
length = FFI::MemoryPointer.new(:int)
- ptr = ICU::Lib.ucol_getRules(@c, length)
+ ptr = Lib.ucol_getRules(@c, length)
ptr.read_array_of_uint16(length.read_int).pack("U*")
end
+ end
+
+ def collation_key(string)
+ ptr = UCharPointer.from_string(string)
+ size = Lib.ucol_getSortKey(@c, ptr, string.jlength, nil, 0)
+ buffer = FFI::MemoryPointer.new(:char, size)
+ Lib.ucol_getSortKey(@c, ptr, string.jlength, buffer, size)
+ buffer.read_bytes(size - 1)
+ end
+
+ def [](attribute)
+ ATTRIBUTE_VALUES_INVERSE[Lib.check_error do |error|
+ Lib.ucol_getAttribute(@c, ATTRIBUTES[attribute], error)
+ end]
+ end
+
+ def []=(attribute, value)
+ Lib.check_error do |error|
+ Lib.ucol_setAttribute(@c, ATTRIBUTES[attribute], ATTRIBUTE_VALUES[value], error)
+ end
+ value
+ end
+
+ # create friendly named methods for setting attributes
+ ATTRIBUTES.each_key do |attribute|
+ class_eval <<-CODE
+ def #{attribute}
+ self[:#{attribute}]
+ end
+
+ def #{attribute}=(value)
+ self[:#{attribute}] = value
+ end
+ CODE
end
end # Collator
end # Collate
end # ICU