aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLuc Donnet2012-01-09 17:57:51 +0100
committerLuc Donnet2012-01-09 17:57:51 +0100
commita4eeeeaa4b7b199e5b4e41c61c33e5a56fccc823 (patch)
treefb6d934cb44518c7b04b87e4f4886efd36fcfa58 /lib
parentd9dd47206fe11e6b2400ed93407fc50521fa10dd (diff)
downloadchouette-core-a4eeeeaa4b7b199e5b4e41c61c33e5a56fccc823.tar.bz2
Add locales and views for lines
Diffstat (limited to 'lib')
-rw-r--r--lib/array_ext.rb54
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