diff options
| author | Luc Donnet | 2012-01-09 17:57:51 +0100 |
|---|---|---|
| committer | Luc Donnet | 2012-01-09 17:57:51 +0100 |
| commit | a4eeeeaa4b7b199e5b4e41c61c33e5a56fccc823 (patch) | |
| tree | fb6d934cb44518c7b04b87e4f4886efd36fcfa58 /lib | |
| parent | d9dd47206fe11e6b2400ed93407fc50521fa10dd (diff) | |
| download | chouette-core-a4eeeeaa4b7b199e5b4e41c61c33e5a56fccc823.tar.bz2 | |
Add locales and views for lines
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/array_ext.rb | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/array_ext.rb b/lib/array_ext.rb new file mode 100644 index 000000000..438d92ee2 --- /dev/null +++ b/lib/array_ext.rb @@ -0,0 +1,54 @@ +class Array + + def order_by(order) + attribute, direction = order.first + + self.sort{ |a,b| + sa, sb = a.send(attribute.to_sym).to_s, b.send(attribute.to_sym).to_s + if ((sa.downcase <=> sb.downcase) == 0) + then sa <=> sb + else + na, nb = self.class.check_regexp(sa, sb) + na <=> nb + end + }.tap do |items| + items.reverse! if direction.to_sym == :desc + end + end + + private + # TODO : Puts in a gem this development + def self.check_regexp(sa, sb) + regexp = /(^|\D+)(\d+|(\D$))/ + ma, mb = multireg(regexp,sa), self.multireg(regexp,sb) + it = 0 + equal = 0 + ret = ["",""] + numeric = /(\d+)/ + while (it < [ma.size,mb.size].min) and (equal==0) + if (ma[it] and mb[it]) and (ma[it][1] and mb[it][1]) \ + and (numeric.match ma[it][0] and numeric.match mb[it][0]) + l = [ma[it][2].size,mb[it][2].size].max + ret = [self.format(ma[it], l), self.format(mb[it], l)] + else + ret = [ma[it][0].downcase, mb[it][0].downcase] + end + equal = ret[0] <=> ret[1] + it+=1 + end + return ret[0], ret[1] + end + + def self.multireg rgpx, str + result = [] + while rgpx.match str + result.push rgpx.match(str) + str = rgpx.match(str).post_match + end + result + end + + def self.format(match_data, length) + match_data[1].gsub("_", "").downcase + ("%0#{length}d" % match_data[2].to_i) + end +end |
