in name_utils.js [215:272]
splitName(name) {
let nameTokens = name.trim().split(/[ ,\u3000\u30FB\u00B7]+/);
let nameParts = {
given: "",
middle: "",
family: "",
};
nameTokens = this._stripPrefixes(nameTokens);
if (this._isCJKName(name)) {
let parts = this._splitCJKName(nameTokens);
if (parts) {
return parts;
}
}
// Don't assume "Ma" is a suffix in John Ma.
if (nameTokens.length > 2) {
nameTokens = this._stripSuffixes(nameTokens);
}
if (!nameTokens.length) {
// Bad things have happened; just assume the whole thing is a given name.
nameParts.given = name;
return nameParts;
}
// Only one token, assume given name.
if (nameTokens.length == 1) {
nameParts.given = nameTokens[0];
return nameParts;
}
// 2 or more tokens. Grab the family, which is the last word plus any
// recognizable family prefixes.
let familyTokens = [nameTokens.pop()];
while (nameTokens.length) {
let lastToken = nameTokens[nameTokens.length - 1];
if (!this._containsString(this.FAMILY_NAME_PREFIXES, lastToken)) {
break;
}
familyTokens.unshift(lastToken);
nameTokens.pop();
}
nameParts.family = familyTokens.join(" ");
// Take the last remaining token as the middle name (if there are at least 2
// tokens).
if (nameTokens.length >= 2) {
nameParts.middle = nameTokens.pop();
}
// Remainder is given name.
nameParts.given = nameTokens.join(" ");
return nameParts;
},