Revision: 28367
          http://sourceforge.net/p/bibdesk/svn/28367
Author:   hofman
Date:     2023-09-22 15:28:12 +0000 (Fri, 22 Sep 2023)
Log Message:
-----------
separate parsing month from string

Modified Paths:
--------------
    trunk/bibdesk/BDSKFormatParser.m
    trunk/bibdesk/NSDate_BDSKExtensions.h
    trunk/bibdesk/NSDate_BDSKExtensions.m

Modified: trunk/bibdesk/BDSKFormatParser.m
===================================================================
--- trunk/bibdesk/BDSKFormatParser.m    2023-09-22 14:58:53 UTC (rev 28366)
+++ trunk/bibdesk/BDSKFormatParser.m    2023-09-22 15:28:12 UTC (rev 28367)
@@ -373,17 +373,7 @@
                        // month
                     NSString *monthString = [pub 
stringValueOfField:BDSKMonthString];
                     if ([NSString isEmptyString:monthString] == NO) {
-                        if([monthString isComplex]) {
-                            NSArray *nodes = [monthString nodes];
-                            if ([nodes count] > 1 && [(BDSKStringNode *)[nodes 
objectAtIndex:1] type] == BDSKStringNodeMacro)
-                                monthString = [(BDSKStringNode *)[nodes 
objectAtIndex:1] value];
-                            else if ([nodes count] > 2 && [(BDSKStringNode 
*)[nodes objectAtIndex:2] type] == BDSKStringNodeMacro)
-                                monthString = [(BDSKStringNode *)[nodes 
objectAtIndex:2] value];
-                            else
-                                monthString = [(BDSKStringNode *)[nodes 
objectAtIndex:0] value];
-                        }
-                        NSDate *date = [NSDate dateWithMonthString:monthString 
yearString:@"2000"];
-                        NSInteger m = [[[[NSCalendar alloc] 
initWithCalendarIdentifier:NSGregorianCalendar] autorelease] 
component:NSCalendarUnitMonth fromDate:date];
+                        NSInteger m = [NSDate monthFromString:monthString] ?: 
1;
                                                monthString = [NSString 
stringWithFormat:@"%.2ld", m];
                                                [parsedStr 
appendString:monthString];
                                        }

Modified: trunk/bibdesk/NSDate_BDSKExtensions.h
===================================================================
--- trunk/bibdesk/NSDate_BDSKExtensions.h       2023-09-22 14:58:53 UTC (rev 
28366)
+++ trunk/bibdesk/NSDate_BDSKExtensions.h       2023-09-22 15:28:12 UTC (rev 
28367)
@@ -48,6 +48,7 @@
 
 @interface NSDate (BDSKExtensions)
 
++ (NSInteger)monthFromString:(NSString *)monthString;
 + (NSDate *)dateWithMonthString:(NSString *)monthString yearString:(NSString 
*)yearString;
 
 - (NSString *)dateDescription;

Modified: trunk/bibdesk/NSDate_BDSKExtensions.m
===================================================================
--- trunk/bibdesk/NSDate_BDSKExtensions.m       2023-09-22 14:58:53 UTC (rev 
28366)
+++ trunk/bibdesk/NSDate_BDSKExtensions.m       2023-09-22 15:28:12 UTC (rev 
28367)
@@ -45,11 +45,16 @@
 
 @implementation NSDate (BDSKExtensions)
 
-+ (NSDate *)dateWithMonthString:(NSString *)monthString yearString:(NSString 
*)yearString {
-    if([yearString isComplex])
-        yearString = [(BDSKStringNode *)[[yearString nodes] objectAtIndex:0] 
value];
-    if ([NSString isEmptyString:yearString])
-        return nil;
+static NSCalendar *gregorianCalendar() {
+    static NSCalendar *gregorianCalendar = nil;
+    if (gregorianCalendar == nil) {
+        gregorianCalendar = [[NSCalendar alloc] 
initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
+        [gregorianCalendar setLocale:[NSLocale 
localeWithLocaleIdentifier:@"en_US_POSIX"]];
+    }
+    return gregorianCalendar;
+}
+
++ (NSInteger)monthFromString:(NSString *)monthString {
     if([monthString isComplex]) {
         BDSKStringNode *node = nil;
         NSArray *nodes = [monthString nodes];
@@ -81,37 +86,37 @@
         if (start > 0 || end < [monthString length])
             monthString = [monthString substringWithRange:NSMakeRange(start, 
end - start)];
     }
-    static NSCalendar *calendar = nil;
-    if (calendar == nil) {
-        calendar = [[NSCalendar alloc] 
initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
-        [calendar setLocale:[NSLocale 
localeWithLocaleIdentifier:@"en_US_POSIX"]];
-    }
-    if ([NSString isEmptyString:monthString])
-        monthString = @"1";
-    NSInteger year = [yearString integerValue];
-    if ([yearString length] <= 2) {
-        year += 2000;
-        if (year > [calendar component:NSCalendarUnitYear fromDate:[NSDate 
date]])
-            year -= 100;
-    }
-    NSInteger month = 1;
+    NSInteger month = 0;
     if ([monthString length] < 3 && [[NSCharacterSet decimalDigitCharacterSet] 
characterIsMember:[monthString characterAtIndex:0]]) {
         month = [monthString integerValue];
     } else {
         monthString = [monthString lowercaseString];
-        NSUInteger i = [[[calendar shortMonthSymbols] 
valueForKey:@"lowercaseString"] indexOfObject:monthString];
+        NSUInteger i = [[[gregorianCalendar() shortMonthSymbols] 
valueForKey:@"lowercaseString"] indexOfObject:monthString];
         if (i == NSNotFound) {
-            i = [[[calendar monthSymbols] valueForKey:@"lowercaseString"] 
indexOfObject:monthString];
+            i = [[[gregorianCalendar() monthSymbols] 
valueForKey:@"lowercaseString"] indexOfObject:monthString];
             if (i == NSNotFound && [[[NSLocale currentLocale] 
localeIdentifier] hasPrefix:@"en"] == NO) {
-                [calendar setLocale:[NSLocale currentLocale]];
-                i = [[[calendar shortMonthSymbols] 
valueForKey:@"lowercaseString"] indexOfObject:monthString];
+                [gregorianCalendar() setLocale:[NSLocale currentLocale]];
+                i = [[[gregorianCalendar() shortMonthSymbols] 
valueForKey:@"lowercaseString"] indexOfObject:monthString];
                 if (i == NSNotFound)
-                    i = [[[calendar monthSymbols] 
valueForKey:@"lowercaseString"] indexOfObject:monthString];
-                [calendar setLocale:[NSLocale 
localeWithLocaleIdentifier:@"en_US_POSIX"]];
+                    i = [[[gregorianCalendar() monthSymbols] 
valueForKey:@"lowercaseString"] indexOfObject:monthString];
+                [gregorianCalendar() setLocale:[NSLocale 
localeWithLocaleIdentifier:@"en_US_POSIX"]];
             }
         }
-        month = i == NSNotFound ? 1 : i + 1;
+        if (i != NSNotFound)
+            month = i + 1;
     }
+    return month;
+}
+
++ (NSDate *)dateWithMonthString:(NSString *)monthString yearString:(NSString 
*)yearString {
+    if([yearString isComplex])
+        yearString = [(BDSKStringNode *)[[yearString nodes] objectAtIndex:0] 
value];
+    if ([NSString isEmptyString:yearString])
+        return nil;
+    NSInteger year = [yearString integerValue];
+    if ([yearString length] <= 2)
+        year += year < 50 ? 2000 : 1900;
+    NSInteger month = [self monthFromString:monthString] ?: 1;
     NSDateComponents *components = [[[NSDateComponents alloc] init] 
autorelease];
     [components setYear:year];
     [components setMonth:month];
@@ -119,7 +124,7 @@
     [components setHour:12];
     [components setMonth:0];
     [components setSecond:0];
-    return [calendar dateFromComponents:components];
+    return [gregorianCalendar() dateFromComponents:components];
 }
 
 - (NSString *)dateDescription{

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to