Source code for crate_anon.crateweb.extra.salutation
#!/usr/bin/env python
# crate_anon/crateweb/extra/salutation.py
"""
===============================================================================
Copyright (C) 2015-2018 Rudolf Cardinal (rudolf@pobox.com).
This file is part of CRATE.
CRATE is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
CRATE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with CRATE. If not, see <http://www.gnu.org/licenses/>.
===============================================================================
"""
from typing import Optional, Tuple
# =============================================================================
# Salutation and other forms of name/title generation
# =============================================================================
[docs]def title_forename_surname(title: Optional[str],
forename: Optional[str],
surname: Optional[str],
always_title: bool = False,
sex: str = '',
assume_dr: bool = False) -> str:
"""
When reporting names:
Prof. John Smith
John Smith
Prof. Smith
etc.
"""
if always_title and not title:
title = salutation_default_title(sex, assume_dr)
return " ".join(filter(None, [title, forename, surname]))
[docs]def forename_surname(forename: Optional[str], surname: Optional[str]) -> str:
"""
For use when reporting names.
"""
return " ".join(filter(None, [forename, surname]))
def salutation_default_title(sex: str = '', assume_dr: bool = False) -> str:
if assume_dr:
return "Dr"
if sex.upper() == 'M':
return "Mr"
if sex.upper() == 'F':
return "Ms"
# really stuck now
# https://en.wikipedia.org/wiki/Gender_neutral_title
return "Mx"
[docs]def salutation(title: Optional[str],
forename: Optional[str],
surname: Optional[str],
sex: str = '',
assume_dr: bool = False) -> str:
"""
For salutations: Dear ...
"""
if not title:
title = salutation_default_title(sex, assume_dr)
if title.lower() == "sir": # frivolous!
return " ".join([title, forename])
return " ".join([title, surname])
# =============================================================================
# String parsing
# =============================================================================
[docs]def get_initial_surname_tuple_from_string(s: str) -> Tuple[str, str]:
"""
Parses a name-like string into plausible parts. Try:
get_initial_surname_tuple_from_string("AJ VAN DEN BERG")
get_initial_surname_tuple_from_string("VAN DEN BERG AJ")
get_initial_surname_tuple_from_string("J Smith")
get_initial_surname_tuple_from_string("J. Smith")
get_initial_surname_tuple_from_string("Smith J.")
get_initial_surname_tuple_from_string("Smith JKC")
get_initial_surname_tuple_from_string("Dr Bob Smith")
get_initial_surname_tuple_from_string("LINTON H C (PL)")
"""
parts = s.split() if s else []
nparts = len(parts)
if nparts == 0:
return "", ""
elif "(" in s:
# something v. odd like "Linton H C (PL)", for Linton Health Centre
# partners or similar. We can't fix it, but...
return "", parts[0]
elif nparts == 1:
# hmm... assume "Smith"
return "", parts[0]
elif nparts == 2:
if len(parts[0]) < len(parts[1]):
# probably "J Smith"
return parts[0][0], parts[1]
else:
# probably "Smith JKC"
return parts[1][0], parts[0]
else:
# Lots of parts.
if parts[0].lower() == "dr":
parts = parts[1:]
nparts -= 1
if len(parts[0]) < len(parts[-1]):
# probably "AJ VAN DEN BERG"
return parts[0][0], " ".join(parts[1:])
else:
# probably "VAN DEN BERG AJ"
return parts[-1][0], " ".join(parts[:-1])