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