name_formatter 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +7 -7
- data/lib/gaelic_name_formatter.rb +92 -0
- data/lib/name_formatter/version.rb +1 -1
- data/lib/name_formatter.rb +19 -10
- metadata +3 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d306596a7864c4fb4a423f3cdf547b8d3fc16c8c697ad25070ee0579f8e9842
|
4
|
+
data.tar.gz: 4f374261ed314427a37f98242b75bcd3b3413bc40901a440c8d65afde83cdf92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9d5ea02dc879d9684ae97e1599fda7241f6ec87cfefa3c38d89497e86050023c7340d2ac1cca4446f1446d0598e9ae87729bcdc78e19059e6a164243dad73ec
|
7
|
+
data.tar.gz: 47d1866734837e3b793f75d6e6bbddcd0abf3255c3e0a767e2a71fc733b0d3d7560dc8e2176b0e982706083d39f9e7aea877d87d78bb94a6d1a69559793c5224
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## [0.2.0] - 2024-06-28
|
9
|
+
|
10
|
+
### Added
|
11
|
+
|
12
|
+
- Support for parsing Gaelic names
|
13
|
+
- Allow formatting for Last Name only
|
14
|
+
|
8
15
|
## [0.1.0] - 2024-06-28
|
9
16
|
Initial realase
|
10
17
|
|
@@ -12,4 +19,5 @@ Initial realase
|
|
12
19
|
|
13
20
|
- Support for parsing complex names with prefixes, suffixes, particles and beyond.
|
14
21
|
|
22
|
+
[0.2.0]: https://github.com/kylewelsby/name_formatter/releases/tag/v0.2.0
|
15
23
|
[0.1.0]: https://github.com/kylewelsby/name_formatter/releases/tag/v0.1.0
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ NameFormatter is a Ruby gem that provides robust name parsing and formatting cap
|
|
6
6
|
|
7
7
|
## ✨ Features
|
8
8
|
|
9
|
-
- Handles personal names from various cultures (Western, Spanish, German, etc.)
|
9
|
+
- Handles personal names from various cultures (Gaelic, Western, Spanish, German, etc.)
|
10
10
|
- Supports company names and legal entities
|
11
11
|
- Correctly formats prefixes, suffixes, and particles (e.g., "van", "de", "von")
|
12
12
|
- Preserves capitalization for names like "McDonald" or "DeVito"
|
@@ -44,7 +44,7 @@ formatted = formatter.format("JOHN DOE")
|
|
44
44
|
puts formatted # Output: "John Doe"
|
45
45
|
|
46
46
|
# Parse and Format a name
|
47
|
-
parsed = formatter.parse_formatted("
|
47
|
+
parsed = formatter.parse_formatted("DR. JANE SMITH JR.")
|
48
48
|
puts parsed
|
49
49
|
# Output: {
|
50
50
|
# prefix: "Dr.",
|
@@ -54,13 +54,13 @@ puts parsed
|
|
54
54
|
# }
|
55
55
|
|
56
56
|
# Parse skip formatting a name
|
57
|
-
parsed = formatter.parse("
|
57
|
+
parsed = formatter.parse("DR. JANE SMITH JR.")
|
58
58
|
puts parsed
|
59
59
|
# Output: {
|
60
|
-
# prefix: "
|
61
|
-
# first_name: "
|
62
|
-
# last_name: "
|
63
|
-
# suffix: "
|
60
|
+
# prefix: "DR.",
|
61
|
+
# first_name: "JANE",
|
62
|
+
# last_name: "SMITH",
|
63
|
+
# suffix: "JR."
|
64
64
|
# }
|
65
65
|
|
66
66
|
# Handle complex names
|
@@ -0,0 +1,92 @@
|
|
1
|
+
class GaelicNameFormatter
|
2
|
+
PREFIXES = %w[Mac Mc Ó O' Ní Nic Bean Mhic Vuic Uí De Dè Gil Gille].freeze
|
3
|
+
SUFFIXES = %w[ach an àr nam riss aigh aidh ain án éis ín].freeze
|
4
|
+
|
5
|
+
PREFIX_PATTERNS = [
|
6
|
+
/^(Gill)(An.*)/i,
|
7
|
+
/^(Gill)(Ea.*)/i,
|
8
|
+
/^(Gille)(Ch.*)/i,
|
9
|
+
/^(Gill[e'])([IOèÈ].*)/i,
|
10
|
+
/^(Mc)([acdefgiklmnpqrstv][aeiou lnrvw].*)/i,
|
11
|
+
/^(Mc)([DPS]h.*)/i,
|
12
|
+
|
13
|
+
/^(Mac)([Ùùfstu].*)/i,
|
14
|
+
/^(Mac)([AÀà][bimnos].*)/i,
|
15
|
+
/^(Mac)([AÀà]la.*)/i,
|
16
|
+
/^(Mac)([AÀà]d[ah].*)/i,
|
17
|
+
/^(Mac)([AÀà]r(?:a|ta).*)/i,
|
18
|
+
/^(Mac)(B(?:h|ea).*)/i,
|
19
|
+
/^(Mac)(C[aÀàehinlruòÒÙù].*)/i,
|
20
|
+
/^(Mac)(Co[dilmnsr].*)/i,
|
21
|
+
/^(Mac)(Dh.*)(Sh.*)/i,
|
22
|
+
/^(Mac)([DPH]h.*)/i,
|
23
|
+
/^(Mac)(Di.*)/i,
|
24
|
+
/^(Mac)(E[aòÒ].*)/i,
|
25
|
+
/^(Mac)((?:Gi|I)ll[e'])([EFÉéèÈ].+)/i,
|
26
|
+
/^(Mac)((?:Gi|I)ll[e']?)(A[no].+)/i,
|
27
|
+
/^(Mac)(Ill[e']?)((?:Ea|[CBDFGIÌìMNOPRSTU][haiumon]).+)/i,
|
28
|
+
|
29
|
+
/^(Mac)(Gill[e'])(O[in].+)/i,
|
30
|
+
/^(Mac)(Gi.*)(Ri.+)/i,
|
31
|
+
/^(Mac)(Gi.*)(Se.+)/i,
|
32
|
+
/^(Mac)(Gi.*)(Ios.+)/i,
|
33
|
+
/^(Mac)(Gi.*)([BCDFM]h.+)/i,
|
34
|
+
/^(Mac)(Gi.*)(Ghl.+)/i,
|
35
|
+
/^(Mac)(G[ahilou].*)/i,
|
36
|
+
/^(Mac)(Gri.*)/i,
|
37
|
+
/^(Mac)(Gy.*)/i,
|
38
|
+
/^(Mac)([IÌì][lo].*)/i,
|
39
|
+
/^(Mac)([IÌì]ai.*)/i,
|
40
|
+
/^(Mac)([L]a[bcgmot].*)/i,
|
41
|
+
/^(Mac)([L]e[òÒ].*)/i,
|
42
|
+
/^(Mac)([L][ioÙùu].*)/i,
|
43
|
+
/^(Mac)([N][aiÌìo].*)/i,
|
44
|
+
/^(Mac)(Nea.*)/i,
|
45
|
+
/^(Mac)(Neis)/i,
|
46
|
+
/^(Mac)(N[eèÈ]ill)/i,
|
47
|
+
/^(Mac)(N[eèÈ]i(ll|s).+)/i,
|
48
|
+
/^(Mac)(Mh.+)(Bh.+)/i,
|
49
|
+
/^(Mac)(Mh.+)(Chal.+)/i,
|
50
|
+
/^(Mac)(Mh.+)(D[òÒ].+)/i,
|
51
|
+
/^(Mac)(Mh.+)([Ìì].+)/i,
|
52
|
+
/^(Mac)([gdpms]h.*)/i,
|
53
|
+
/^(Mac)(R[iÌìou].*)/i,
|
54
|
+
/^(Mac)(R[Ààa][bgiot].*)/i
|
55
|
+
].freeze
|
56
|
+
|
57
|
+
attr_accessor :name
|
58
|
+
|
59
|
+
def initialize(name)
|
60
|
+
@name = name
|
61
|
+
end
|
62
|
+
|
63
|
+
def gaelic?
|
64
|
+
return false if name.nil? || name.strip.empty?
|
65
|
+
|
66
|
+
parts = name.split(/[\s]+/)
|
67
|
+
parts.any? do |part|
|
68
|
+
PREFIX_PATTERNS.any? { |pattern| part.match?(pattern) }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def format
|
73
|
+
parts = name.split(/[\s]+/)
|
74
|
+
parts.map do |part|
|
75
|
+
pattern = PREFIX_PATTERNS.find do |pattern|
|
76
|
+
part.match?(pattern)
|
77
|
+
end
|
78
|
+
if pattern && (match = part.match(pattern))
|
79
|
+
match.captures.map do |capture|
|
80
|
+
capture = capture.capitalize
|
81
|
+
hyphenated_parts = capture.split("-")
|
82
|
+
if hyphenated_parts.size > 1
|
83
|
+
capture = hyphenated_parts.map(&:capitalize).join("-")
|
84
|
+
end
|
85
|
+
capture
|
86
|
+
end.join
|
87
|
+
else
|
88
|
+
part
|
89
|
+
end
|
90
|
+
end.join(" ")
|
91
|
+
end
|
92
|
+
end
|
data/lib/name_formatter.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require "name_formatter/version"
|
2
|
+
require "gaelic_name_formatter"
|
3
|
+
|
2
4
|
class NameFormatter
|
3
5
|
VERSION = NameFormatterModule::VERSION
|
4
6
|
PREFIXES = Set.new(["Mr", "Mrs", "Ms", "Miss", "The Hon", "Rev", "Dr", "Fr", "Pres", "Prof", "Msgr", "Sen", "Gov", "Rep", "Amb"]).freeze
|
@@ -22,11 +24,9 @@ class NameFormatter
|
|
22
24
|
DUNAME_REGEX = /^Du[b](?=[aeiou])/i
|
23
25
|
DENAME_REGEX = /^De[bfghjlmnpvw][aeioulr](?!(?:sik|a)(?:[-,])?$)/i
|
24
26
|
|
25
|
-
MCNAME_REGEX = /^Mc[a-z]+/i
|
26
|
-
MACNAME_REGEX = /^Mac(?:[aà][bdilmnors]|b[eh]|c[aeioruò]|d[h]|e[aò]|f[hiru]|g[ahilouy]|i[alo]|l[aeiouù]|m[hiua]|n[aeèiìo]|p[h]|r[aiìou]|s[hipu]|t[hiu]|u[airs])+/i
|
27
27
|
PARTICLE_REGEX = /^(de[rsl]|d[aiu]|v[oa]n|te[nr]|la|les|y|and|zu|dell[ao])$/i
|
28
28
|
|
29
|
-
def parse(name)
|
29
|
+
def parse(name, last_name_only: false)
|
30
30
|
return parse_company_name(name) if company_name?(name)
|
31
31
|
|
32
32
|
parts = name.strip.split(/\s+/)
|
@@ -34,7 +34,11 @@ class NameFormatter
|
|
34
34
|
prefix = extract_prefix_or_suffix(parts, PREFIXES)
|
35
35
|
suffix = extract_prefix_or_suffix(parts.reverse, SUFFIXES)
|
36
36
|
|
37
|
-
if
|
37
|
+
if last_name_only
|
38
|
+
first_name = nil
|
39
|
+
last_name = parts.reject { |part| part == suffix }.join(" ")
|
40
|
+
elsif parts.size > 1
|
41
|
+
|
38
42
|
first_name = parts.shift
|
39
43
|
last_name = parts.reject { |part| part == suffix }.join(" ")
|
40
44
|
last_name = nil if last_name.empty?
|
@@ -54,8 +58,8 @@ class NameFormatter
|
|
54
58
|
}
|
55
59
|
end
|
56
60
|
|
57
|
-
def parse_formatted(name)
|
58
|
-
parsed = parse(name)
|
61
|
+
def parse_formatted(name, **)
|
62
|
+
parsed = parse(name, **)
|
59
63
|
{
|
60
64
|
prefix: format_prefix(parsed[:prefix]),
|
61
65
|
first_name: format_first_name(parsed[:first_name]),
|
@@ -64,8 +68,8 @@ class NameFormatter
|
|
64
68
|
}
|
65
69
|
end
|
66
70
|
|
67
|
-
def format(name)
|
68
|
-
parse_formatted(name).values.compact.join(" ")
|
71
|
+
def format(name, **)
|
72
|
+
parse_formatted(name, **).values.compact.join(" ")
|
69
73
|
end
|
70
74
|
|
71
75
|
private
|
@@ -127,6 +131,11 @@ class NameFormatter
|
|
127
131
|
end
|
128
132
|
|
129
133
|
def format_last_name_part(part, next_part)
|
134
|
+
gaelic_formatter = GaelicNameFormatter.new(part)
|
135
|
+
if gaelic_formatter.gaelic?
|
136
|
+
return gaelic_formatter.format
|
137
|
+
end
|
138
|
+
|
130
139
|
case part.downcase
|
131
140
|
when /^(v[ao]n|te|ter|de)$/i
|
132
141
|
next_part&.match?(/der/i) ? part.downcase : part.capitalize
|
@@ -134,9 +143,9 @@ class NameFormatter
|
|
134
143
|
next_part ? part.downcase : part.capitalize
|
135
144
|
when /^dell'\w+/i
|
136
145
|
part[0..4].capitalize + part[5..].capitalize
|
137
|
-
when
|
146
|
+
when DUNAME_REGEX, DENAME_REGEX, /^[od]'\w+/i
|
138
147
|
part[0..1].capitalize + part[2..].capitalize
|
139
|
-
when /^von[r]+/i
|
148
|
+
when /^von[r]+/i
|
140
149
|
part[0..2].capitalize + part[3..].capitalize
|
141
150
|
else
|
142
151
|
part.capitalize
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: name_formatter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle Welsby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2.0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '2.0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: minitest
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +52,7 @@ files:
|
|
66
52
|
- CHANGELOG.md
|
67
53
|
- LICENSE
|
68
54
|
- README.md
|
55
|
+
- lib/gaelic_name_formatter.rb
|
69
56
|
- lib/name_formatter.rb
|
70
57
|
- lib/name_formatter/version.rb
|
71
58
|
homepage: https://github.com/kylewelsby/name_formatter
|