You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by Sam Ruby <ru...@apache.org> on 2016/03/25 18:24:50 UTC

[whimsy.git] [1/1] Commit c83f5e9: forgot to include the new file

Commit c83f5e90057d1c39645f1b3c91db4c842e128a28:
    forgot to include the new file


Branch: refs/heads/master
Author: Sam Ruby <ru...@intertwingly.net>
Committer: Sam Ruby <ru...@intertwingly.net>
Pusher: rubys <ru...@apache.org>

------------------------------------------------------------
lib/whimsy/asf/person.rb                                     | +++++++++++ 
------------------------------------------------------------
82 changes: 82 additions, 0 deletions.
------------------------------------------------------------


diff --git a/lib/whimsy/asf/person.rb b/lib/whimsy/asf/person.rb
new file mode 100644
index 0000000..5951017
--- /dev/null
+++ b/lib/whimsy/asf/person.rb
@@ -0,0 +1,82 @@
+#
+# support for sorting of names
+#
+
+module ASF
+
+  class Person
+    # sort support
+
+    def self.asciize(name)
+      if name.match /[^\x00-\x7F]/
+        # digraphs.  May be culturally sensitive
+        name.gsub! /\u00df/, 'ss'
+        name.gsub! /\u00e4|a\u0308/, 'ae'
+        name.gsub! /\u00e5|a\u030a/, 'aa'
+        name.gsub! /\u00e6/, 'ae'
+        name.gsub! /\u00f1|n\u0303/, 'ny'
+        name.gsub! /\u00f6|o\u0308/, 'oe'
+        name.gsub! /\u00fc|u\u0308/, 'ue'
+
+        # latin 1
+        name.gsub! /[\u00e0-\u00e5]/, 'a'
+        name.gsub! /\u00e7/, 'c'
+        name.gsub! /[\u00e8-\u00eb]/, 'e'
+        name.gsub! /[\u00ec-\u00ef]/, 'i'
+        name.gsub! /[\u00f2-\u00f6]|\u00f8/, 'o'
+        name.gsub! /[\u00f9-\u00fc]/, 'u'
+        name.gsub! /[\u00fd\u00ff]/, 'y'
+
+        # Latin Extended-A
+        name.gsub! /[\u0100-\u0105]/, 'a'
+        name.gsub! /[\u0106-\u010d]/, 'c'
+        name.gsub! /[\u010e-\u0111]/, 'd'
+        name.gsub! /[\u0112-\u011b]/, 'e'
+        name.gsub! /[\u011c-\u0123]/, 'g'
+        name.gsub! /[\u0124-\u0127]/, 'h'
+        name.gsub! /[\u0128-\u0131]/, 'i'
+        name.gsub! /[\u0132-\u0133]/, 'ij'
+        name.gsub! /[\u0134-\u0135]/, 'j'
+        name.gsub! /[\u0136-\u0138]/, 'k'
+        name.gsub! /[\u0139-\u0142]/, 'l'
+        name.gsub! /[\u0143-\u014b]/, 'n'
+        name.gsub! /[\u014C-\u0151]/, 'o'
+        name.gsub! /[\u0152-\u0153]/, 'oe'
+        name.gsub! /[\u0154-\u0159]/, 'r'
+        name.gsub! /[\u015a-\u0162]/, 's'
+        name.gsub! /[\u0162-\u0167]/, 't'
+        name.gsub! /[\u0168-\u0173]/, 'u'
+        name.gsub! /[\u0174-\u0175]/, 'w'
+        name.gsub! /[\u0176-\u0178]/, 'y'
+        name.gsub! /[\u0179-\u017e]/, 'z'
+
+        # denormalized diacritics
+        name.gsub! /[\u0300-\u036f]/, ''
+      end
+
+      name.strip.gsub /[^\w]+/, '-'
+    end
+
+    SUFFIXES = /^([Jj][Rr]\.?|I{2,3}|I?V|VI{1,3}|[A-Z]\.)$/
+
+    # rearrange line in an order suitable for sorting
+    def self.sortable_name(name)
+      name = name.split.reverse
+      suffix = (name.shift if name.first =~ SUFFIXES)
+      suffix += ' ' + name.shift if name.first =~ SUFFIXES
+      name << name.shift
+      name << name.shift if name.first=='Lewis' and name.last=='Ship'
+      name << name.shift if name.first=='Gallardo' and name.last=='Rivera'
+      name << name.shift if name.first=="S\u00e1nchez" and name.last=='Vega'
+      # name << name.shift if name.first=='van'
+      name.last.sub! /^IJ/, 'Ij'
+      name.unshift(suffix) if suffix
+      name.map! {|word| asciize(word)}
+      name.reverse.join(' ')
+    end
+
+    def sortable_name
+      Person.sortable_name(self.public_name)
+    end
+  end
+end