Module: String::Namecase

Defined in:
lib/string/namecase.rb,
lib/string/namecase/version.rb,
lib/string/namecase/constants.rb

Constant Summary collapse

VERSION =
"0.1.0"
HYPHEN =
/(\s*-\s*)/
MC =
/^Mc(\w)(?=\w)/i
MAC =
/^Mac(\w)(?=\w)/i
O_APOSTROPHE =
/^O'(\w)(?=\w)/i
SURNAMES =
[
  "ApShaw",
  "d'Albini",
  "d'Aubigney",
  "d'Autry",
  "d'Entremont",
  "d'Hurst",
  "D'ovidio",
  "DaSilva",
  "DeAnda",
  "deAnnethe",
  "deAubigne",
  "deAubigny",
  "DeBardelaben",
  "DeBardeleben",
  "DeBaugh",
  "deBeauford",
  "DeBerry",
  "deBethune",
  "DeBetuile",
  "DeBoard",
  "DeBoer",
  "DeBohun",
  "DeBord",
  "DeBose",
  "DeBrouwer",
  "DeBroux",
  "DeBruhl",
  "deBruijn",
  "deBrus",
  "deBruse",
  "deBrusse",
  "DeBruyne",
  "DeBusk",
  "DeCamp",
  "deCastilla",
  "DeCello",
  "deClare",
  "DeClark",
  "DeClerck",
  "DeCoste",
  "deCote",
  "DeCoudres",
  "DeCoursey",
  "DeCredico",
  "deCuire",
  "DeCuyre",
  "DeDominicios",
  "DeDuyster",
  "DeDuytscher",
  "DeDuytser",
  "deFiennes",
  "DeFord",
  "DeForest",
  "DeFrance",
  "DeFriece",
  "DeGarmo",
  "deGraaff",
  "DeGraff",
  "DeGraffenreid",
  "DeGraw",
  "DeGrenier",
  "DeGroats",
  "DeGroft",
  "DeGrote",
  "DeHaan",
  "DeHaas",
  "DeHaddeclive",
  "deHannethe",
  "DeHatclyf",
  "DeHaven",
  "DeHeer",
  "DeJager",
  "DeJarnette",
  "DeJean",
  "DeJong",
  "deJonge",
  "deKemmeter",
  "deKirketon",
  "DeKroon",
  "deKype",
  "del-Rosario",
  "dela Chamotte",
  "DeLa Cuadra",
  "DeLa Force",
  "dela Fountaine",
  "dela Place",
  "DeLa Ward",
  "DeLaci",
  "DeLacy",
  "DeLaet",
  "DeLalonde",
  "DelAmarre",
  "DeLancey",
  "DeLascy",
  "DelAshmutt",
  "DeLassy",
  "DeLattre",
  "DeLaughter",
  "DeLay",
  "deLessine",
  "DelGado",
  "DelGaudio",
  "DeLiberti",
  "DeLoache",
  "DeLoatch",
  "DeLoch",
  "DeLockwood",
  "DeLong",
  "DeLozier",
  "DeLuca",
  "DeLucenay",
  "deLucy",
  "DeMars",
  "DeMartino",
  "deMaule",
  "DeMello",
  "DeMinck",
  "DeMink",
  "DeMoree",
  "DeMoss",
  "DeMott",
  "DeMuynck",
  "deNiet",
  "DeNure",
  "DePalma",
  "DePasquale",
  "dePender",
  "dePercy",
  "DePoe",
  "DePriest",
  "DePu",
  "DePui",
  "DePuis",
  "DeReeper",
  "deRochette",
  "deRose",
  "DeRossett",
  "DeRover",
  "deRuggele",
  "deRuggle",
  "DeRuyter",
  "deSaint-Sauveur",
  "DeSantis",
  "desCuirs",
  "DeSentis",
  "DeShane",
  "DeSilva",
  "DesJardins",
  "DesMarest",
  "deSoleure",
  "DeSoto",
  "DeSpain",
  "DeStefano",
  "deSwaert",
  "deSwart",
  "DeVall",
  "DeVane",
  "DeVasher",
  "DeVasier",
  "DeVaughan",
  "DeVaughn",
  "DeVault",
  "DeVeau",
  "DeVeault",
  "deVilleneuve",
  "DeVilliers",
  "DeVinney",
  "DeVito",
  "deVogel",
  "DeVolder",
  "DeVolld",
  "DeVore",
  "deVos",
  "deVries",
  "DeWall",
  "DeWaller",
  "DeWalt",
  "deWashington",
  "deWerly",
  "deWessyngton",
  "DeWet",
  "deWinter",
  "DeWitt",
  "DeWolf",
  "DeWolfe",
  "DeWolff",
  "DeWoody",
  "DeYager",
  "DeYarmett",
  "DeYoung",
  "DiCicco",
  "DiCredico",
  "DiFillippi",
  "DiGiacomo",
  "DiMarco",
  "DiMeo",
  "DiMonte",
  "DiNonno",
  "DiPietro",
  "diPilato",
  "DiPrima",
  "DiSalvo",
  "du Bosc",
  "du Hurst",
  "DuFort",
  "DuMars",
  "DuPre",
  "DuPue",
  "DuPuy",
  "FitzUryan",
  "kummel",
  "LaBarge",
  "LaBarr",
  "LaBauve",
  "LaBean",
  "LaBelle",
  "LaBerteaux",
  "LaBine",
  "LaBonte",
  "LaBorde",
  "LaBounty",
  "LaBranche",
  "LaBrash",
  "LaCaille",
  "LaCasse",
  "LaChapelle",
  "LaClair",
  "LaComb",
  "LaCoste",
  "LaCount",
  "LaCour",
  "LaCroix",
  "LaFarlett",
  "LaFarlette",
  "LaFerry",
  "LaFlamme",
  "LaFollette",
  "LaForge",
  "LaFortune",
  "LaFoy",
  "LaFramboise",
  "LaFrance",
  "LaFuze",
  "LaGioia",
  "LaGrone",
  "LaLiberte",
  "LaLonde",
  "LaLone",
  "LaMaster",
  "LaMay",
  "LaMere",
  "LaMont",
  "LaMotte",
  "LaPeer",
  "LaPierre",
  "LaPlante",
  "LaPoint",
  "LaPointe",
  "LaPorte",
  "LaPrade",
  "LaRocca",
  "LaRochelle",
  "LaRose",
  "LaRue",
  "LaRussa",
  "LaVallee",
  "LaVaque",
  "LaVeau",
  "LeBleu",
  "LeBoeuf",
  "LeBoiteaux",
  "LeBoyteulx",
  "LeCheminant",
  "LeClair",
  "LeClerc",
  "LeCompte",
  "LeCroy",
  "LeDuc",
  "LeFevbre",
  "LeFever",
  "LeFevre",
  "LeFlore",
  "LeGette",
  "LeGrand",
  "LeGrave",
  "LeGro",
  "LeGros",
  "LeJeune",
  "LeMaistre",
  "LeMaitre",
  "LeMaster",
  "LeMesurier",
  "LeMieux",
  "LeMoe",
  "LeMoigne",
  "LeMoine",
  "LeNeve",
  "LePage",
  "LeQuire",
  "LeQuyer",
  "LeRou",
  "LeRoy",
  "LeSuer",
  "LeSueur",
  "LeTardif",
  "LeVally",
  "LeVert",
  "LoMonaco",
  "Macabe",
  "Macaluso",
  "MacaTasney",
  "Macaulay",
  "Macchitelli",
  "Maccoone",
  "Maccurry",
  "Macdermattroe",
  "Macdiarmada",
  "Macelvaine",
  "Macey",
  "Macgraugh",
  "Machan",
  "Machann",
  "Machum",
  "Maciejewski",
  "Maciel",
  "Mackaben",
  "Mackall",
  "Mackartee",
  "Mackay",
  "Macken",
  "Mackert",
  "Mackey",
  "Mackie",
  "Mackin",
  "Mackins",
  "Macklin",
  "Macko",
  "Macksey",
  "Mackwilliams",
  "Maclean",
  "Maclinden",
  "Macomb",
  "Macomber",
  "Macon",
  "Macoombs",
  "Macraw",
  "Macumber",
  "Macurdy",
  "Macwilliams",
  "MaGuinness",
  "MakCubyn",
  "MakCumby",
  "Mcelvany",
  "Mcsherry",
  "Op den Dyck",
  "Op den Graeff",
  "regory",
  "Schweißguth",
  "StElmo",
  "StGelais",
  "StJacques",
  "te Boveldt",
  "VanAernam",
  "VanAken",
  "VanAlstine",
  "VanAmersfoort",
  "VanAntwerp",
  "VanArlem",
  "VanArnam",
  "VanArnem",
  "VanArnhem",
  "VanArnon",
  "VanArsdale",
  "VanArsdalen",
  "VanArsdol",
  "vanAssema",
  "vanAsten",
  "VanAuken",
  "VanAwman",
  "VanBaucom",
  "VanBebber",
  "VanBeber",
  "VanBenschoten",
  "VanBibber",
  "VanBilliard",
  "vanBlare",
  "vanBlaricom",
  "VanBuren",
  "VanBuskirk",
  "VanCamp",
  "VanCampen",
  "VanCleave",
  "VanCleef",
  "VanCleve",
  "VanCouwenhoven",
  "VanCovenhoven",
  "VanCowenhoven",
  "VanCuren",
  "VanDalsem",
  "VanDam",
  "VanDe Poel",
  "vanden Dijkgraaf",
  "vanden Kommer",
  "VanDer Aar",
  "vander Gouwe",
  "VanDer Honing",
  "VanDer Hooning",
  "vander Horst",
  "vander Kroft",
  "vander Krogt",
  "VanDer Meer",
  "vander Meulen",
  "vander Putte",
  "vander Schooren",
  "VanDer Veen",
  "VanDer Ven",
  "VanDer Wal",
  "VanDer Weide",
  "VanDer Willigen",
  "vander Wulp",
  "vander Zanden",
  "vander Zwan",
  "VanDer Zweep",
  "VanDeren",
  "VanDerlaan",
  "VanDerveer",
  "VanderWoude",
  "VanDeursen",
  "VanDeusen",
  "vanDijk",
  "VanDoren",
  "VanDorn",
  "VanDort",
  "VanDruff",
  "VanDryer",
  "VanDusen",
  "VanDuzee",
  "VanDuzen",
  "VanDuzer",
  "VanDyck",
  "VanDyke",
  "VanEman",
  "VanEmmen",
  "vanEmmerik",
  "VanEngen",
  "vanErp",
  "vanEssen",
  "VanFleet",
  "VanGalder",
  "VanGelder",
  "vanGerrevink",
  "VanGog",
  "vanGogh",
  "VanGorder",
  "VanGordon",
  "VanGroningen",
  "VanGuilder",
  "VanGundy",
  "VanHaaften",
  "VanHaute",
  "VanHees",
  "vanHeugten",
  "VanHise",
  "VanHoeck",
  "VanHoek",
  "VanHook",
  "vanHoorn",
  "VanHoornbeeck",
  "VanHoose",
  "VanHooser",
  "VanHorn",
  "VanHorne",
  "VanHouten",
  "VanHoye",
  "VanHuijstee",
  "VanHuss",
  "VanImmon",
  "VanKersschaever",
  "VanKeuren",
  "VanKleeck",
  "VanKoughnet",
  "VanKouwenhoven",
  "VanKuykendaal",
  "vanLeeuwen",
  "vanLent",
  "vanLet",
  "VanLeuven",
  "vanLingen",
  "VanLoozen",
  "VanLopik",
  "VanLuven",
  "vanMaasdijk",
  "VanMele",
  "VanMeter",
  "vanMoorsel",
  "VanMoorst",
  "VanMossevelde",
  "VanNaarden",
  "VanNamen",
  "VanNemon",
  "VanNess",
  "VanNest",
  "VanNimmen",
  "vanNobelen",
  "VanNorman",
  "VanNormon",
  "VanNostrunt",
  "VanNote",
  "VanOker",
  "vanOosten",
  "VanOrden",
  "VanOrder",
  "VanOrma",
  "VanOrman",
  "VanOrnum",
  "VanOstrander",
  "VanOvermeire",
  "VanPelt",
  "VanPool",
  "VanPoole",
  "VanPoorvliet",
  "VanPutten",
  "vanRee",
  "VanRhijn",
  "vanRijswijk",
  "VanRotmer",
  "VanSchaick",
  "vanSchelt",
  "VanSchoik",
  "VanSchoonhoven",
  "VanSciver",
  "VanScoy",
  "VanScoyoc",
  "vanSeters",
  "VanSickle",
  "VanSky",
  "VanSnellenberg",
  "vanStaveren",
  "VanStraten",
  "VanSuijdam",
  "VanTassel",
  "VanTassell",
  "VanTessel",
  "VanTexel",
  "VanTuyl",
  "VanValckenburgh",
  "vanValen",
  "VanValkenburg",
  "VanVelsor",
  "VanVelzor",
  "VanVlack",
  "VanVleck",
  "VanVleckeren",
  "VanWaard",
  "VanWart",
  "VanWassenhove",
  "VanWinkle",
  "VanWoggelum",
  "vanWordragen",
  "VanWormer",
  "VanZuidam",
  "VanZuijdam",
  "VonAdenbach",
  "vonAllmen",
  "vonBardeleben",
  "vonBerckefeldt",
  "VonBergen",
  "vonBreyman",
  "VonCannon",
  "vonFreymann",
  "vonHeimburg",
  "VonHuben",
  "vonKramer",
  "vonKruchenburg",
  "vonPostel",
  "VonRohr",
  "VonRohrbach",
  "VonSass",
  "VonSasse",
  "vonSchlotte",
  "VonSchneider",
  "VonSeldern",
  "VonSpringer",
  "VonVeyelmann",
  "VonZweidorff"
]
SUFFIXES =
[
  "II",
  "(II)",
  "III",
  "(III)",
  "IV",
  "(IV)",
  "VI",
  "(VI)",
  "VII",
  "(VII)",
  "2nd",
  "(2nd)",
  "3rd",
  "(3rd)",
  "4th",
  "(4th)",
  "5th",
  "(5th)"
]

Class Method Summary collapse

Class Method Details

.capitalize(name) ⇒ Object



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
# File 'lib/string/namecase.rb', line 13

def self.capitalize name
  _name = name

  hyphens = []

  while (match = _name.match(HYPHEN)) do
    _start = match.begin(1)
    _end = match.end(1)
    _value = match[1]

    if _start == 0
      _name = _name[_end..-1]
    else
      _name = _name[0..._start] << ' ' << _name[_end..-1]
    end

    hyphens << [_start, _end, _value]
  end

  _name = _name.split.map{ |w|
    w.mb_chars.capitalize.to_str
  }.map{ |w|
    w.gsub(MC) { "Mc#{$1.upcase}" }\
     .gsub(MAC) { "Mac#{$1.upcase}" }\
     .gsub(O_APOSTROPHE) { "O'#{$1.upcase}" }
  }

  _name = _name.join(" ")

  hyphens.reverse.each do |_start, _end, _value|
    if _start == 0
      _name = _value << _name
    else
      _name = _name[0..._start] << _value << (_name[_start+1..-1] || "")
    end
  end

  _name = _name \
    .gsub("Van ", "van ") \
    .gsub("De La ", "de la ") \
    .gsub("De ", "de ") \
    .gsub("Dit ", "dit ")
  _name << " "

  (SURNAMES + SUFFIXES).each do |surname_or_suffix|
    position = _name.downcase.index(surname_or_suffix.downcase)
    if position and surname_suffix_position?(position, _name, surname_or_suffix)
      _name = _name[0...position] << surname_or_suffix << _name[position+surname_or_suffix.length..-1]
    end
  end

  _name[0...-1]
end

.surname_suffix_position?(position, name, surname_or_suffix) ⇒ Boolean

Returns:

  • (Boolean)


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/string/namecase.rb', line 66

def self.surname_suffix_position? position, name, surname_or_suffix
  # surname/suffix must be:
  # 1. at start of name or after a space or a -
  #          -and-
  # 2. followed by the end of string or a space or a -
  (
    (position == 0) || \
    (
      position > 0 && (name[position-1] == ' ' || name[position-1] == '-')
    )
  ) && (
    (name.length == position+surname_or_suffix.length) || \
    (name[position+surname_or_suffix.length] == ' ') || (name[position+surname_or_suffix.length] == '-')
  )
end