datatracker/ietf/person/name.py

74 lines
2.5 KiB
Python

import re
import debug # pyflakes:ignore
def name_parts(name):
prefix, first, middle, last, suffix = u"", u"", u"", u"", u""
if not name.strip():
return prefix, first, middle, last, suffix
# if we got a name on the form "Some Name (Foo Bar)", get rid of
# the paranthesized part
name_with_paren_match = re.search(r"^([^(]+)\s*\(.*\)$", name)
if name_with_paren_match:
name = name_with_paren_match.group(1)
parts = name.split()
if len(parts) > 2 and parts[0] in ["M", "M.", "Sri", ] and "." not in parts[1]:
prefix = parts[0];
parts = parts[1:]
prefix = []
while len(parts) > 1 and parts[0] in ["Mr", "Mr.", "Mrs", "Mrs.", "Ms", "Ms.", "Miss", "Dr",
"Dr.", "Doctor", "Prof", "Prof.", "Professor", "Sir", "Lady", "Dame",
"Gen.", "Col.", "Maj.", "Capt.", "Lieut.", "Lt.", "Cmdr.", "Col.", ]:
prefix.append(parts[0])
parts = parts[1:]
prefix = " ".join(prefix)
if len(parts) > 2:
if parts[-1] in ["Jr", "Jr.", "II", "2nd", "III", "3rd", "Ph.D."]:
suffix = parts[-1]
parts = parts[:-1]
if len(parts) > 2:
# Check if we have a surname with nobiliary particle
full = u" ".join(parts)
if full.upper() == full:
full = full.lower() # adjust case for all-uppercase input
# This is an incomplete list. Adjust as needed to handle known ietf
# participant names correctly:
particle = re.search(r" (af|de|der|di|Di|du|el|hadi|st\.?|ten|ter|van|van der|Van|von|von der|Von|zu) ", full)
if particle:
pos = particle.start()
parts = full[:pos].split() + [full[pos+1:]]
if len(parts) > 2:
first = parts[0]
last = parts[-1]
# Handle reverse-order names with uppercase surname correctly
if re.search("^[A-Z-]+$", first):
first, last = last, first
middle = u" ".join(parts[1:-1])
elif len(parts) == 2:
first, last = parts
else:
last = parts[0]
return prefix, first, middle, last, suffix
def initials(name):
prefix, first, middle, last, suffix = name_parts(name)
given = first
if middle:
given += u" "+middle
initials = u" ".join([ n[0]+'.' for n in given.split() ])
return initials
def plain_name(name):
prefix, first, middle, last, suffix = name_parts(name)
return u" ".join([first, last])
if __name__ == "__main__":
import sys
name = u" ".join(sys.argv[1:])
print name_parts(name)
print initials(name)