74 lines
2.6 KiB
Python
74 lines
2.6 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|al|Al|de|der|di|Di|du|el|El|Hadi|Le|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)
|
|
|