Revision: 29353
          http://sourceforge.net/p/bibdesk/svn/29353
Author:   hofman
Date:     2025-07-24 15:53:52 +0000 (Thu, 24 Jul 2025)
Log Message:
-----------
NSString category to search a 'word' delimited by non-word characters, to find 
a cite key substring

Modified Paths:
--------------
    trunk/bibdesk/BibDocument_UI.m
    trunk/bibdesk/NSString_BDSKExtensions.h
    trunk/bibdesk/NSString_BDSKExtensions.m

Modified: trunk/bibdesk/BibDocument_UI.m
===================================================================
--- trunk/bibdesk/BibDocument_UI.m      2025-07-24 15:16:48 UTC (rev 29352)
+++ trunk/bibdesk/BibDocument_UI.m      2025-07-24 15:53:52 UTC (rev 29353)
@@ -1479,10 +1479,8 @@
                     NSString *value = [aPub valueOfField:field inherit:NO];
                     // value may be nil, so check before calling rangeOfString:
                     if (nil != value) {
-                        NSRange range = [value rangeOfString:oldKey 
options:NSCaseInsensitiveSearch];
-                        if (range.location != NSNotFound &&
-                            (range.location == 0 || [invalidSet 
characterIsMember:[value characterAtIndex:range.location - 1]]) &&
-                            (NSMaxRange(range) == [value length] || 
[invalidSet characterIsMember:[value characterAtIndex:NSMaxRange(range)]])) {
+                        NSRange range = [value rangeOfWord:oldKey 
nonWordCharacters:invalidSet ptions:NSCaseInsensitiveSearch];
+                        if (range.location != NSNotFound) {
                             NSMutableString *tmpString = [value mutableCopy];
                             [tmpString replaceCharactersInRange:range 
withString:key];
                             [aPub setField:field toValue:tmpString];

Modified: trunk/bibdesk/NSString_BDSKExtensions.h
===================================================================
--- trunk/bibdesk/NSString_BDSKExtensions.h     2025-07-24 15:16:48 UTC (rev 
29352)
+++ trunk/bibdesk/NSString_BDSKExtensions.h     2025-07-24 15:53:52 UTC (rev 
29353)
@@ -360,6 +360,12 @@
 
 #pragma mark -
 
+- (NSRange)rangeOfWord:(NSString *)searchString 
nonWordCharacters:(NSCharacterSet *)nonWordCharacters 
ptions:(NSStringCompareOptions)mask range:(NSRange)searchRange;
+- (NSRange)rangeOfWord:(NSString *)searchString 
nonWordCharacters:(NSCharacterSet *)nonWordCharacters 
ptions:(NSStringCompareOptions)mask;
+- (NSRange)rangeOfWord:(NSString *)searchString 
nonWordCharacters:(NSCharacterSet *)nonWordCharacters;
+
+#pragma mark -
+
 /*!
 @method     booleanValue
 @abstract   Compares with Yes, y, or 1 using case insensitive search to return 
YES.

Modified: trunk/bibdesk/NSString_BDSKExtensions.m
===================================================================
--- trunk/bibdesk/NSString_BDSKExtensions.m     2025-07-24 15:16:48 UTC (rev 
29352)
+++ trunk/bibdesk/NSString_BDSKExtensions.m     2025-07-24 15:53:52 UTC (rev 
29353)
@@ -985,6 +985,37 @@
     return [self caseInsensitiveCompare:aString] == NSOrderedSame;
 }
 
+#pragma mark Word searching
+
+- (NSRange)rangeOfWord:(NSString *)searchString 
nonWordCharacters:(NSCharacterSet *)nonWordCharacters 
ptions:(NSStringCompareOptions)mask range:(NSRange)searchRange {
+    NSRange range = [self rangeOfString:searchString options:mask 
range:searchRange];
+    if (range.location != NSNotFound) {
+        if ((range.location == 0 || [nonWordCharacters characterIsMember:[self 
characterAtIndex:range.location]]) && (NSMaxRange(range) == [self length] || 
[nonWordCharacters characterIsMember:[self 
characterAtIndex:NSMaxRange(range)]]))
+            return range;
+        if (mask & NSAnchoredSearch)
+            return NSMakeRange(NSNotFound, 0);
+        if ((mask & NSBackwardsSearch) == 0) {
+            if (NSMaxRange(searchRange) <= NSMaxRange(range) + [searchString 
length])
+                return NSMakeRange(NSNotFound, 0);
+            searchRange = NSMakeRange(NSMaxRange(range) + 1, 
NSMaxRange(searchRange) - NSMaxRange(range) - 1);
+        } else {
+            if (range.location >= searchRange.location + [searchString length])
+                return NSMakeRange(NSNotFound, 0);
+            searchRange = NSMakeRange(searchRange.location, range.location - 
searchRange.location - 1);
+        }
+        return [self rangeOfWord:searchString 
nonWordCharacters:nonWordCharacters ptions:mask range:searchRange];
+    }
+    return range;
+}
+
+- (NSRange)rangeOfWord:(NSString *)searchString 
nonWordCharacters:(NSCharacterSet *)nonWordCharacters 
ptions:(NSStringCompareOptions)mask {
+    return [self rangeOfWord:searchString nonWordCharacters:nonWordCharacters 
ptions:mask range:NSMakeRange(0, [self length])];
+}
+
+- (NSRange)rangeOfWord:(NSString *)searchString 
nonWordCharacters:(NSCharacterSet *)nonWordCharacters {
+    return [self rangeOfWord:searchString nonWordCharacters:nonWordCharacters 
ptions:0 range:NSMakeRange(0, [self length])];
+}
+
 #pragma mark -
 
 - (BOOL)booleanValue{

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