libs-base/Source/NSPersonNameComponentsFormatter.m

237 lines
8 KiB
Mathematica
Raw Normal View History

/* Definition of class NSPersonNameComponentsFormatter
2019-09-16 02:17:28 +00:00
Copyright (C) 2019 Free Software Foundation, Inc.
Implemented by: Gregory Casamento <greg.casamento@gmail.com>
Date: Sep 2019
This file is part of the GNUstep Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
2019-09-16 02:17:28 +00:00
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110 USA.
2019-09-16 02:17:28 +00:00
*/
#import "Foundation/NSString.h"
2019-09-17 21:41:18 +00:00
#import "Foundation/NSAttributedString.h"
2019-09-16 02:17:28 +00:00
#import "Foundation/NSPersonNameComponents.h"
2019-09-17 21:41:18 +00:00
#import "Foundation/NSPersonNameComponentsFormatter.h"
2019-09-16 02:17:28 +00:00
@implementation NSPersonNameComponentsFormatter
- (instancetype) init
{
self = [super init];
if(self != nil)
{
_phonetic = NO;
_style = NSPersonNameComponentsFormatterStyleDefault;
2019-09-17 21:41:18 +00:00
_nameOptions = 0L;
}
return self;
}
2019-09-17 21:41:18 +00:00
- (void) _setNameOptions: (NSPersonNameComponentsFormatterOptions)opts
{
_nameOptions = opts;
}
2019-09-16 02:17:28 +00:00
// Designated init...
+ (NSString *) localizedStringFromPersonNameComponents: (NSPersonNameComponents *)components
style: (NSPersonNameComponentsFormatterStyle)nameFormatStyle
options: (NSPersonNameComponentsFormatterOptions)nameOptions
{
2019-09-17 21:41:18 +00:00
NSPersonNameComponentsFormatter *fmt = [[NSPersonNameComponentsFormatter alloc] init];
[fmt setStyle: nameFormatStyle];
[fmt _setNameOptions: nameOptions];
return [fmt stringForObjectValue: components] ;
}
2019-09-16 02:17:28 +00:00
// Setters
- (NSPersonNameComponentsFormatterStyle) style
{
return _style;
2019-09-16 02:17:28 +00:00
}
- (void) setStyle: (NSPersonNameComponentsFormatterStyle)style
{
_style = style;
2019-09-16 02:17:28 +00:00
}
- (BOOL) isPhonetic
{
return _phonetic;
2019-09-16 02:17:28 +00:00
}
- (void) setPhonetic: (BOOL)flag
{
_phonetic = flag;
2019-09-16 02:17:28 +00:00
}
// Convenience methods...
- (NSString *) stringFromPersonNameComponents: (NSPersonNameComponents *)components
{
NSString *result = @"";
switch (_style)
{
case NSPersonNameComponentsFormatterStyleDefault:
case NSPersonNameComponentsFormatterStyleMedium:
result = [result stringByAppendingString: [components givenName]];
result = [result stringByAppendingString: @" "];
result = [result stringByAppendingString: [components familyName]];
break;
case NSPersonNameComponentsFormatterStyleShort:
result = [result stringByAppendingString: [components givenName]];
break;
case NSPersonNameComponentsFormatterStyleLong:
result = [result stringByAppendingString: [components namePrefix]];
result = [result stringByAppendingString: @" "];
result = [result stringByAppendingString: [components givenName]];
result = [result stringByAppendingString: @" "];
result = [result stringByAppendingString: [components familyName]];
result = [result stringByAppendingString: @" "];
result = [result stringByAppendingString: [components nameSuffix]];
break;
case NSPersonNameComponentsFormatterStyleAbbreviated:
result = [result stringByAppendingString: [[components givenName] substringToIndex: 1]];
result = [result stringByAppendingString: [[components familyName] substringToIndex: 1]];
break;
}
return result;
2019-09-16 02:17:28 +00:00
}
- (NSAttributedString *) annotatedStringFromPersonNameComponents: (NSPersonNameComponents *)components
{
2019-09-17 21:41:48 +00:00
NSAttributedString *result = AUTORELEASE([[NSAttributedString alloc] initWithString:
[self stringFromPersonNameComponents: components]]);
return result;
2019-09-16 02:17:28 +00:00
}
- (NSPersonNameComponents *) personNameComponentsFromString: (NSString *)string
{
2019-09-17 21:41:18 +00:00
NSPersonNameComponents *pnc = AUTORELEASE([[NSPersonNameComponents alloc] init]);
NSArray *nameArray = [string componentsSeparatedByString: @" "];
NSUInteger count = [nameArray count];
switch(count)
{
case 1:
[pnc setNickname: [nameArray objectAtIndex: 0]];
case 2:
[pnc setGivenName: [nameArray objectAtIndex: 0]];
[pnc setFamilyName: [nameArray objectAtIndex: 1]];
break;
case 3:
{
NSString *first = [[nameArray objectAtIndex: 0] lowercaseString];
if([first isEqualToString: @"mr"] ||
[first isEqualToString: @"ms"] ||
[first isEqualToString: @"mrs"] ||
[first isEqualToString: @"dr"])
{
[pnc setNamePrefix: [nameArray objectAtIndex: 0]];
2019-09-27 04:00:59 +00:00
[pnc setGivenName: [nameArray objectAtIndex: 1]];
[pnc setFamilyName: [nameArray objectAtIndex: 2]];
}
else
{
2019-09-27 04:00:59 +00:00
[pnc setGivenName: [nameArray objectAtIndex: 0]];
[pnc setMiddleName: [nameArray objectAtIndex: 1]];
[pnc setFamilyName: [nameArray objectAtIndex: 2]];
}
}
break;
case 4:
{
NSString *first = [[nameArray objectAtIndex: 0] lowercaseString];
2019-09-27 00:04:54 +00:00
if([first isEqualToString: @"mr."] ||
[first isEqualToString: @"ms."] ||
[first isEqualToString: @"mrs."] ||
[first isEqualToString: @"dr."])
{
[pnc setNamePrefix: [nameArray objectAtIndex: 0]];
2019-09-27 04:00:59 +00:00
[pnc setGivenName: [nameArray objectAtIndex: 1]];
[pnc setMiddleName: [nameArray objectAtIndex: 2]];
[pnc setFamilyName: [nameArray objectAtIndex: 3]];
}
else
{
2019-09-27 04:00:59 +00:00
[pnc setGivenName: [nameArray objectAtIndex: 0]];
2019-09-27 00:04:54 +00:00
[pnc setMiddleName: [nameArray objectAtIndex: 1]];
[pnc setFamilyName: [nameArray objectAtIndex: 2]];
[pnc setNameSuffix: [nameArray objectAtIndex: 3]];
}
}
break;
2019-09-26 20:16:58 +00:00
case 5:
{
NSString *first = [[nameArray objectAtIndex: 0] lowercaseString];
if([first isEqualToString: @"mr."] ||
[first isEqualToString: @"ms."] ||
[first isEqualToString: @"mrs."] ||
[first isEqualToString: @"dr."])
{
[pnc setNamePrefix: [nameArray objectAtIndex: 0]];
[pnc setGivenName: [nameArray objectAtIndex: 1]];
[pnc setMiddleName: [nameArray objectAtIndex: 2]];
[pnc setFamilyName: [nameArray objectAtIndex: 3]];
[pnc setNameSuffix: [nameArray objectAtIndex: 4]];
}
}
break;
default:
NSLog(@"Not sure how to parse %@", string);
pnc = nil;
break;
}
2019-09-17 21:41:18 +00:00
return pnc;
2019-09-16 02:17:28 +00:00
}
2019-09-17 21:41:18 +00:00
- (BOOL) getObjectValue: (id *)obj
forString: (NSString *)string
errorDescription: (NSString **)error
2019-09-16 02:17:28 +00:00
{
NSPersonNameComponents *pnc = [self personNameComponentsFromString: string];
if(pnc != nil)
{
*obj = pnc;
*error = nil;
}
else
{
*obj = nil;
*error = @"Could not parse string into NSPersonNameComponents object";
}
2019-09-16 02:17:28 +00:00
return NO;
}
2019-09-17 21:41:18 +00:00
- (NSString *)stringForObjectValue: (id)obj
{
NSPersonNameComponents *pnc = (NSPersonNameComponents *)obj;
return [self stringFromPersonNameComponents: pnc];
}
2019-09-16 02:17:28 +00:00
@end
// components for attributed strings;
NSString * const NSPersonNameComponentKey = @"NSPersonNameComponentKey";
NSString * const NSPersonNameComponentGivenName = @"NSPersonNameComponentGivenName";
NSString * const NSPersonNameComponentFamilyName = @"NSPersonNameComponentFamilyName";
NSString * const NSPersonNameComponentMiddleName = @"NSPersonNameComponentMiddleName";
NSString * const NSPersonNameComponentPrefix = @"NSPersonNameComponentPrefix";
NSString * const NSPersonNameComponentSuffix = @"NSPersonNameComponentSuffix";
NSString * const NSPersonNameComponentNickname = @"NSPersonNameComponentNickname";
NSString * const NSPersonNameComponentDelimiter = @"NSPersonNameComponentDelimiter";