Class: EverydayNatsort::Natural
- Inherits:
-
Object
- Object
- EverydayNatsort::Natural
- Defined in:
- lib/everyday_natsort/natural.rb
Constant Summary collapse
- REGEXP =
/(^|\D+)(\d+|(\D$))/- NUMERIC =
/(\d+)/
Class Method Summary collapse
- .both_exist?(it, ma, mb) ⇒ Boolean
- .both_have_group_1?(it, ma, mb) ⇒ Boolean
- .both_num?(it, ma, mb) ⇒ Boolean
- .check_equal(ret) ⇒ Object
- .compare(a, b) ⇒ Object
-
.format(match_data, length) ⇒ Object
format([a, 1], 3) => a001 add leading zero.
- .match_num?(it, ma, mb) ⇒ Boolean
-
.multireg(regpexp, str) ⇒ Object
return an array with regexp matchdata on str.
- .nat_sanatize(sa, sb) ⇒ Object
- .num?(v) ⇒ Boolean
- .process_alpha_match(it, ma, mb) ⇒ Object
- .process_match(it, ma, mb) ⇒ Object
- .process_numeric_match(it, ma, mb) ⇒ Object
- .sanatize_loop(ma, mb) ⇒ Object
- .sort(object) ⇒ Object
Class Method Details
.both_exist?(it, ma, mb) ⇒ Boolean
52 53 54 |
# File 'lib/everyday_natsort/natural.rb', line 52 def both_exist?(it, ma, mb) ma[it] && mb[it] end |
.both_have_group_1?(it, ma, mb) ⇒ Boolean
56 57 58 |
# File 'lib/everyday_natsort/natural.rb', line 56 def both_have_group_1?(it, ma, mb) ma[it][1] && mb[it][1] end |
.both_num?(it, ma, mb) ⇒ Boolean
60 61 62 |
# File 'lib/everyday_natsort/natural.rb', line 60 def both_num?(it, ma, mb) num?(ma[it][0]) && num?(mb[it][0]) end |
.check_equal(ret) ⇒ Object
77 78 79 |
# File 'lib/everyday_natsort/natural.rb', line 77 def check_equal(ret) (ret[0] <=> ret[1]) == 0 end |
.compare(a, b) ⇒ Object
17 18 19 20 21 22 23 24 25 |
# File 'lib/everyday_natsort/natural.rb', line 17 def compare(a, b) sa, sb = a.to_s, b.to_s if (sa.downcase <=> sb.downcase) == 0 sa <=> sb else na, nb = nat_sanatize(sa, sb) na <=> nb end end |
.format(match_data, length) ⇒ Object
format([a, 1], 3) => a001 add leading zero
83 84 85 |
# File 'lib/everyday_natsort/natural.rb', line 83 def format(match_data, length) match_data[1].gsub(/-|_/, '').downcase + ("%0#{length}d" % match_data[2].to_i) end |
.match_num?(it, ma, mb) ⇒ Boolean
48 49 50 |
# File 'lib/everyday_natsort/natural.rb', line 48 def match_num?(it, ma, mb) both_exist?(it, ma, mb) && both_have_group_1?(it, ma, mb) && both_num?(it, ma, mb) end |
.multireg(regpexp, str) ⇒ Object
return an array with regexp matchdata on str
89 90 91 92 93 94 95 96 |
# File 'lib/everyday_natsort/natural.rb', line 89 def multireg(regpexp, str) result = [] while regpexp.match(str) result.push regpexp.match(str) str = regpexp.match(str).post_match end result end |
.nat_sanatize(sa, sb) ⇒ Object
27 28 29 30 31 32 33 |
# File 'lib/everyday_natsort/natural.rb', line 27 def nat_sanatize(sa, sb) sa = EverydayNatsort::Accents.sanitize(sa).gsub('-', '_') sb = EverydayNatsort::Accents.sanitize(sb).gsub('-', '_') ma, mb = multireg(REGEXP, sa), multireg(REGEXP, sb) ret = sanatize_loop(ma, mb) return ret[0], ret[1] end |
.num?(v) ⇒ Boolean
73 74 75 |
# File 'lib/everyday_natsort/natural.rb', line 73 def num?(v) NUMERIC.match(v) end |
.process_alpha_match(it, ma, mb) ⇒ Object
69 70 71 |
# File 'lib/everyday_natsort/natural.rb', line 69 def process_alpha_match(it, ma, mb) [ma[it][0].downcase, mb[it][0].downcase] end |
.process_match(it, ma, mb) ⇒ Object
44 45 46 |
# File 'lib/everyday_natsort/natural.rb', line 44 def process_match(it, ma, mb) match_num?(it, ma, mb) ? process_numeric_match(it, ma, mb) : process_alpha_match(it, ma, mb) end |
.process_numeric_match(it, ma, mb) ⇒ Object
64 65 66 67 |
# File 'lib/everyday_natsort/natural.rb', line 64 def process_numeric_match(it, ma, mb) l = [ma[it][2].size, mb[it][2].size].max [format(ma[it], l), format(mb[it], l)] end |
.sanatize_loop(ma, mb) ⇒ Object
35 36 37 38 39 40 41 42 |
# File 'lib/everyday_natsort/natural.rb', line 35 def sanatize_loop(ma, mb) ret = ['', ''] (0...[ma.size, mb.size].min).each { |it| ret = process_match(it, ma, mb) break unless check_equal(ret) } ret end |
.sort(object) ⇒ Object
11 12 13 14 15 |
# File 'lib/everyday_natsort/natural.rb', line 11 def sort(object) Array(object).sort do |a, b| self.compare(a, b) end end |