Class: PersonName::NameSplitter
- Inherits:
-
Object
- Object
- PersonName::NameSplitter
- Defined in:
- lib/person_name/name_splitter.rb
Constant Summary collapse
- NAME_PARTS =
%w(prefix first_name middle_name intercalation last_name suffix)
- DEFAULT_PREFIXES =
%w(Mr. Dhr. Drs. Prof. Mevr. Mej. Mrs.)
- DEFAULT_SUFFIXES =
%w(jr. Phd.)
Class Method Summary collapse
-
.split(new_name_str, existing_values = {}) ⇒ Object
Splits the given name in individual name parts in form of a hash.
Class Method Details
.split(new_name_str, existing_values = {}) ⇒ Object
Splits the given name in individual name parts in form of a hash. You can supply a hash with existing values for editing purposes.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/person_name/name_splitter.rb', line 11 def self.split(new_name_str, existing_values = {}) return {} if new_name_str.nil? parts = new_name_str.split " " names = [] stage = :prefix # value to remember for merging remember = nil parts.each_with_index do |part, index| # some helper variables is_upcase = (part[0,1] == part[0,1].upcase) has_dash = part.include? "-" is_last = (parts.length - 1) == index # add the remember part to the current part but make a note if we used a remembered value full_part = [remember, part].compact.join(" ") did_remember = (full_part != part) suffix_remember = remember remember = nil # Mr. Mrs. Mevr. Mej. if valid_prefix?(part) and stage == :prefix and not did_remember # if the part is a valid prefix, mark it as such names = add_to_last_if :prefix, part, names # Jr. Phd. elsif valid_suffix?(part) # if the part is a valid suffix, mark it as such names << [suffix_remember, :name] if did_remember names = add_to_last_if :suffix, part, names else remember = nil # Damen - van Valkenburg if part == "-" # if the part is a dash if last_stored = names.pop # retrieve the previous name part (if any) and store it with the dash # for the part to come (remember) remember = [last_stored[0], full_part].compact.join(" ") else # if there is no previous part, just store the current part for later remember = full_part end # van de Sloot elsif !is_upcase and !did_remember # intercalation words are never with a capital names = add_to_last_if :intercalation, full_part, names stage = :name # Groen in het Woud elsif !is_upcase and did_remember remember = full_part # Groen elsif is_upcase and !has_dash names << [full_part, :name] stage = :name # Groen-teboer elsif is_upcase and has_dash if full_part.ends_with? "-" if is_last names << [full_part, :name] stage = :name else remember = full_part end else if full_part.starts_with?("-") and last_stored = names.pop last_stored_name = last_stored[0].split(" ") last_part = last_stored_name.pop names << [last_stored_name.join(" "), last_stored[1]] unless last_stored_name.empty? full_part = [last_part, full_part].compact.join(" ") end dash_parts = full_part.split "-" if dash_parts.last[0,1] == dash_parts.last[0,1].upcase names << [full_part, :name] stage = :name elsif is_last names << [full_part, :name] stage = :name else remember = full_part end end end end end names << [remember, :name] if remember new_name = {} stage = O[:prefix] #puts names.inspect names.each_with_index do |value, index| name, name_type = *value stage = recheck_stage(name, stage, existing_values) if name_type == :prefix and stage == O[:prefix] elsif name_type == :suffix and (index == names.length - 1) stage = [O[:suffix], stage].max elsif name_type == :suffix and (index != names.length - 1) name_type = :name end if name_type == :name if (index == names.length - 1) or new_name[:intercalation] stage = [O[:last_name], stage].max else if !new_name[:first_name] stage = [O[:first_name], stage].max else stage = [O[:middle_name], stage].max end end elsif name_type == :intercalation stage = [O[:intercalation], stage].max end new_name = add_part(new_name, stage, name) end new_name end |