Revision: 29059 http://sourceforge.net/p/bibdesk/svn/29059 Author: hofman Date: 2025-02-24 15:17:46 +0000 (Mon, 24 Feb 2025) Log Message: ----------- get missing range boundary group from correct array of groups
Modified Paths: -------------- trunk/bibdesk/BibDocument+Scripting.m Modified: trunk/bibdesk/BibDocument+Scripting.m =================================================================== --- trunk/bibdesk/BibDocument+Scripting.m 2025-02-24 09:49:30 UTC (rev 29058) +++ trunk/bibdesk/BibDocument+Scripting.m 2025-02-24 15:17:46 UTC (rev 29059) @@ -731,74 +731,82 @@ if ([allGroups count] == 0) // If there are no groups, there can be no match. Just return now. return @[]; - + if ((startSpec == nil || [groupKeys() containsObject:startKey]) && (endSpec == nil || [groupKeys() containsObject:endKey])) { - NSInteger startIndex; - NSInteger endIndex; - + BOOL keyIsGroups = [key isEqual:@"scriptingGroups"]; + NSArray *rangeKeyObjects = (keyIsGroups ? nil : [self valueForKey:key]); + NSUInteger startIndex; + NSUInteger endIndex; + id object; + + if (keyIsGroups == NO && [rangeKeyObjects count] == 0) + // If there are no groups for the key, there can be no match. Just return now. + return @[]; + // The start and end keys are also ones we want to handle. // The strategy here is going to be to find the index of the start and stop object in the full groups array, regardless of what its key is. Then we can find what we're looking for in that range of the groups key (weeding out objects we don't want, if necessary). - + // First find the index of the first start object in the groups array - if (startSpec) { - id startObject = [startSpec objectsByEvaluatingWithContainers:self]; - if ([startObject isKindOfClass:[NSArray class]]) - startObject = [startObject firstObject]; - if (startObject == nil) - // Oops. We could not find the start object. - return nil; + if (startSpec == nil && keyIsGroups) { + startIndex = 0; + } else { + if (startSpec) { + object = [startSpec objectsByEvaluatingWithContainers:self]; + if ([object isKindOfClass:[NSArray class]]) + object = [object firstObject]; + if (object == nil) + // Oops. We could not find the start object. + return nil; + } else { + object = [rangeKeyObjects firstObject]; + } - startIndex = [allGroups indexOfObjectIdenticalTo:startObject]; + startIndex = [allGroups indexOfObjectIdenticalTo:object]; if (startIndex == NSNotFound) // Oops. We couldn't find the start object in the groups array. This should not happen. return nil; - - } else { - startIndex = 0; } - + // Now find the index of the last end object in the groups array - if (endSpec) { - id endObject = [endSpec objectsByEvaluatingWithContainers:self]; - if ([endObject isKindOfClass:[NSArray class]]) - endObject = [endObject lastObject]; - if (endObject == nil) - // Oops. We could not find the end object. - return nil; + if (endSpec == nil && keyIsGroups) { + endIndex = [allGroups count] - 1; + } else { + if (endSpec) { + object = [endSpec objectsByEvaluatingWithContainers:self]; + if ([object isKindOfClass:[NSArray class]]) + object = [object lastObject]; + if (object == nil) + // Oops. We could not find the end object. + return nil; + } else { + object = [rangeKeyObjects lastObject]; + } - endIndex = [allGroups indexOfObjectIdenticalTo:endObject]; + endIndex = [allGroups indexOfObjectIdenticalTo:object]; if (endIndex == NSNotFound) // Oops. We couldn't find the end object in the groups array. This should not happen. return nil; - - } else { - endIndex = [allGroups count] - 1; } - + if (endIndex < startIndex) { // Accept backwards ranges gracefully - NSInteger temp = endIndex; + NSUInteger temp = endIndex; endIndex = startIndex; startIndex = temp; } - + // Now startIndex and endIndex specify the end points of the range we want within the groups array. // We will traverse the range and pick the objects we want. // We do this by getting each object and seeing if it actually appears in the real key that we are trying to evaluate in. NSMutableArray *result = [NSMutableArray array]; - BOOL keyIsGroups = [key isEqual:@"scriptingGroups"]; - NSArray *rangeKeyObjects = (keyIsGroups ? nil : [self valueForKey:key]); - id curObj; - NSUInteger curKeyIndex; - NSInteger i; - - for (i = startIndex; i <= endIndex; i++) { + + for (NSUInteger i = startIndex; i <= endIndex; i++) { if (keyIsGroups) { [result addObject:[NSNumber numberWithInteger:i]]; } else { - curObj = [allGroups objectAtIndex:i]; - curKeyIndex = [rangeKeyObjects indexOfObjectIdenticalTo:curObj]; + object = [allGroups objectAtIndex:i]; + NSUInteger curKeyIndex = [rangeKeyObjects indexOfObjectIdenticalTo:object]; if (curKeyIndex != NSNotFound) [result addObject:[NSNumber numberWithInteger:curKeyIndex]]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Bibdesk-commit mailing list Bibdesk-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-commit