class NameSplitter::Splitter
Attributes
first_name[RW]
last_name[RW]
last_name_prefix[RW]
middle_name[RW]
name[R]
salutation[RW]
suffix[RW]
suffixes[RW]
Public Class Methods
call(fullname)
click to toggle source
# File lib/name_splitter.rb, line 8 def self.call(fullname) new(fullname) end
new(fullname = "")
click to toggle source
# File lib/name_splitter.rb, line 12 def initialize(fullname = "") self.salutation = "" self.first_name = "" self.middle_name = "" self.last_name = "" self.suffix = "" self.name = fullname if fullname and !fullname.to_s.empty? end
Public Instance Methods
last_name_check(last_name_arr)
click to toggle source
# File lib/name_splitter.rb, line 53 def last_name_check(last_name_arr) #accepts either a string or an array if last_name_arr.class.name == "String" last_name_arr = last_name_arr.split(" ") end return false if last_name_arr.empty? self.suffix = last_name_arr.pop if contains_suffix(last_name_arr) self.last_name = last_name_arr.join(" ").gsub(/[.,]+/, "") end
name=(fullname)
click to toggle source
# File lib/name_splitter.rb, line 25 def name=(fullname) name_arr = fullname.to_s.split(" ") return if name_arr.empty? if contains_suffix(name_arr) self.suffix = name_arr.pop end if name_arr.length == 1 self.first_name = name_arr.shift return end if is_first_element_a_last_name(name_arr) self.last_name = name_arr.shift.gsub(",","") end self.salutation = name_arr.shift(number_of_salutations(name_arr)).join(" ") if name_arr.length == 1 && last_name.empty? self.last_name = name_arr.shift else self.first_name = name_arr.shift(number_of_first_names(name_arr)).join(" ") self.middle_name = name_arr.shift(number_of_middle_names(name_arr)).join(" ") self.last_name_check(name_arr) end end
Private Instance Methods
anded_names?(_name)
click to toggle source
# File lib/name_splitter.rb, line 112 def anded_names?(_name) contains_an_and(_name) end
contains_an_and(*name_arr)
click to toggle source
# File lib/name_splitter.rb, line 116 def contains_an_and(*name_arr) name_arr.flatten.select { |_name| ["and", "&"].include?(_name.to_s.strip) }.any? end
contains_last_name_prefix(name_arr)
click to toggle source
# File lib/name_splitter.rb, line 125 def contains_last_name_prefix(name_arr) last_name_prefix.collect { |x| x.upcase }.include?(name_arr.first.upcase) end
contains_salutation(_name)
click to toggle source
# File lib/name_splitter.rb, line 120 def contains_salutation(_name) return false unless _name salutations.collect { |x| x.upcase }.include?(_name.gsub(/[.,;']+/, "").upcase) end
contains_suffix(name_arr)
click to toggle source
# File lib/name_splitter.rb, line 129 def contains_suffix(name_arr) raise "contains_suffix must receive an array" if !name_arr.class.name == "Array" return false if name_arr.length == 1 suffixes.collect { |x| x.upcase }.include?(name_arr.last.gsub(/[.,;']+/, "").upcase) end
is_first_element_a_last_name(name_arr)
click to toggle source
# File lib/name_splitter.rb, line 108 def is_first_element_a_last_name(name_arr) name_arr[0].strip.match(/,/) end
is_second_first_name?(_name)
click to toggle source
# File lib/name_splitter.rb, line 103 def is_second_first_name?(_name) return false unless _name second_first_names.collect { |x| x.upcase }.include?(_name.upcase) end
number_of_anded_names_before_last_names_if_any(name_arr)
click to toggle source
# File lib/name_splitter.rb, line 95 def number_of_anded_names_before_last_names_if_any(name_arr) return 1 unless contains_an_and(name_arr) first_name_length = name_arr.length - (last_name.empty? ? 1 : 0) first_name_length -= 1 if contains_suffix(name_arr) first_name_length -= 1 if contains_last_name_prefix(name_arr) first_name_length end
number_of_first_names(name_arr)
click to toggle source
# File lib/name_splitter.rb, line 90 def number_of_first_names(name_arr) return 2 if is_second_first_name?(name_arr[1]) number_of_anded_names_before_last_names_if_any(name_arr) end
number_of_middle_names(name_arr)
click to toggle source
# File lib/name_splitter.rb, line 65 def number_of_middle_names(name_arr) # if the first and last names have already been assigned, assume the # rest of the name is a middle name if !first_name.empty? && !last_name.empty? return name_arr.length end #checks whether the array of names passed in contains a likely middle name if (name_arr.length == 2 && !(contains_suffix(name_arr) || contains_last_name_prefix(name_arr))) || (name_arr.length == 3 && !(contains_suffix(name_arr) && contains_last_name_prefix(name_arr))) || name_arr.length > 3 return 1 end return 0 end
number_of_salutations(name_arr)
click to toggle source
# File lib/name_splitter.rb, line 84 def number_of_salutations(name_arr) return 3 if contains_salutation(name_arr[0]) & anded_names?(name_arr[1]) & contains_salutation(name_arr[2]) return 1 if contains_salutation(name_arr[0]) return 0 end
salutations()
click to toggle source
# File lib/name_splitter.rb, line 143 def salutations %w{Mr Mrs Ms Miss Dr Prof Rev Capt Sister Honorable Judge Chief} end
second_first_names()
click to toggle source
# File lib/name_splitter.rb, line 147 def second_first_names %w{Beth Catherine Louise} end