first commit
This commit is contained in:
65
utils/parseName.ts
Normal file
65
utils/parseName.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
export default () => {
|
||||
return 'Hello Util'
|
||||
}
|
||||
interface ParsedName {
|
||||
family?: string
|
||||
given?: string[]
|
||||
prefix?: string[]
|
||||
suffix?: string[]
|
||||
}
|
||||
|
||||
export function parseName(fullName?: string): ParsedName {
|
||||
let prefix: string[] = []
|
||||
let suffix: string[] = []
|
||||
let given: string[] = []
|
||||
let family: string | null = null
|
||||
const result: ParsedName = {}
|
||||
|
||||
if (fullName === undefined) {
|
||||
return result
|
||||
}
|
||||
|
||||
const parts = fullName.trim().split(/\s+/)
|
||||
|
||||
// Cek awalan (prefix)
|
||||
while (
|
||||
parts.length > 0 &&
|
||||
(parts[0].includes('.') || parts[0].includes(','))
|
||||
) {
|
||||
prefix.push(parts.shift()!)
|
||||
}
|
||||
|
||||
// Cek akhiran (suffix)
|
||||
while (parts.length > 0 && parts[parts.length - 1].includes('.')) {
|
||||
suffix.push(parts.pop()!)
|
||||
}
|
||||
|
||||
if (parts.length === 1) {
|
||||
given.push(parts[0].toLowerCase().replace(/\b\w/g, (s) => s.toUpperCase()))
|
||||
} else if (parts.length > 1) {
|
||||
family = parts
|
||||
.pop()!
|
||||
.toLowerCase()
|
||||
.replace(/\b\w/g, (s) => s.toUpperCase())
|
||||
for (let i = 0; i < parts.length; i++) {
|
||||
given.push(
|
||||
parts[i].toLowerCase().replace(/\b\w/g, (s) => s.toUpperCase()),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (family) {
|
||||
result.family = family
|
||||
}
|
||||
if (given.length > 0) {
|
||||
result.given = given
|
||||
}
|
||||
if (prefix.length > 0) {
|
||||
result.prefix = prefix
|
||||
}
|
||||
if (suffix.length > 0) {
|
||||
result.suffix = suffix.reverse()
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user