from unicode.org/reports/tr11/
# File lib/test/unit/diff.rb, line 374 def initialize(line) @line = line @characters = @line.unpack("U*") end
# File lib/test/unit/diff.rb, line 349 def wide_character?(character) binary_search_ranges(character, WIDE_CHARACTERS) or binary_search_ranges(character, AMBIGUOUS) end
# File lib/test/unit/diff.rb, line 355 def binary_search_ranges(character, ranges) if ranges.size.zero? false elsif ranges.size == 1 ranges[0].include?(character) else half = ranges.size / 2 range = ranges[half] if range.include?(character) true elsif character < range.begin binary_search_ranges(character, ranges[0...half]) else binary_search_ranges(character, ranges[(half + 1)..-1]) end end end
# File lib/test/unit/diff.rb, line 379 def [](*args) result = @characters[*args] if result.respond_to?(:pack) result.pack("U*") else result end end
# File lib/test/unit/diff.rb, line 400 def compute_width(start, _end) width = 0 start.upto(_end - 1) do |i| if self.class.wide_character?(@characters[i]) width += 2 else width += 1 end end width end
# File lib/test/unit/diff.rb, line 388 def each(&block) @characters.each(&block) end
# File lib/test/unit/diff.rb, line 392 def size @characters.size end
# File lib/test/unit/diff.rb, line 396 def to_s @line end