module Enumerable
Public Instance Methods
sort_by_alphanum() { |a| ... }
click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 2 def sort_by_alphanum sort do |a, b| if block_given? grouped_compare(yield(a), yield(b)) else grouped_compare(a, b) end end end
sort_by_alphanum!() { |a| ... }
click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 12 def sort_by_alphanum! sort! do |a, b| if block_given? grouped_compare(yield(a), yield(b)) else grouped_compare(a, b) end end end
Private Instance Methods
extract_alpha_or_number_group(item)
click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 40 def extract_alpha_or_number_group(item) matchdata = /([A-Za-z]+|[\d]+)/.match(item) if matchdata.nil? ["", ""] else [matchdata[0], item = item[matchdata.offset(0)[1] .. -1]] end end
grouped_compare(a, b)
click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 24 def grouped_compare(a, b) loop { a_chunk, a = extract_alpha_or_number_group(a) b_chunk, b = extract_alpha_or_number_group(b) ret = if a_chunk =~ /\d/ and b_chunk =~ /\d/ a_chunk.to_i <=> b_chunk.to_i else a_chunk <=> b_chunk end return -1 if a_chunk == '' return ret if ret != 0 } end