Revision: 14926 http://sourceforge.net/p/skim-app/code/14926 Author: hofman Date: 2025-02-23 16:10:38 +0000 (Sun, 23 Feb 2025) Log Message: ----------- Fix range specifiers for character ranges when evaluating indices in NSTextStorage rather than NSScriptCommand parameters
Modified Paths: -------------- trunk/NSAttributedString_SKExtensions.m trunk/NSScriptCommand_SKExtensions.m Modified: trunk/NSAttributedString_SKExtensions.m =================================================================== --- trunk/NSAttributedString_SKExtensions.m 2025-02-13 17:24:21 UTC (rev 14925) +++ trunk/NSAttributedString_SKExtensions.m 2025-02-23 16:10:38 UTC (rev 14926) @@ -158,5 +158,23 @@ } } +- (NSArray *)indicesOfObjectsByEvaluatingObjectSpecifier:(NSScriptObjectSpecifier *)specifier { + // Workaround for Cocoa Scripting and AppleScript bugs. + // Cocoa Scripting does not accept range specifiers whose start/end specifier have an absolute container specifier, but AppleScript does not accept range specifiers with relative container specifiers, so we cannot return those from PDFSelection + if ([specifier isKindOfClass:[NSRangeSpecifier class]]) { + NSScriptObjectSpecifier *childSpec = [(NSRangeSpecifier *)specifier startSpecifier]; + if ([childSpec containerSpecifier]) { + [childSpec setContainerSpecifier:nil]; + [childSpec setContainerIsRangeContainerObject:YES]; + } + childSpec = [(NSRangeSpecifier *)specifier endSpecifier]; + if ([childSpec containerSpecifier]) { + [childSpec setContainerSpecifier:nil]; + [childSpec setContainerIsRangeContainerObject:YES]; + } + } + return nil; +} + @end Modified: trunk/NSScriptCommand_SKExtensions.m =================================================================== --- trunk/NSScriptCommand_SKExtensions.m 2025-02-13 17:24:21 UTC (rev 14925) +++ trunk/NSScriptCommand_SKExtensions.m 2025-02-23 16:10:38 UTC (rev 14926) @@ -37,62 +37,10 @@ */ #import "NSScriptCommand_SKExtensions.h" -#import "SKRuntime.h" @implementation NSScriptCommand (SKExtensions) -static void (*original_setReceiversSpecifier)(id, SEL, id) = NULL; -static void (*original_setArguments)(id, SEL, id) = NULL; -static void (*original_setDirectParameter)(id, SEL, id) = NULL; - -// Workaround for Cocoa Scripting and AppleScript bugs. -// Cocoa Scripting does not accept range specifiers whose start/end specifier have an absolute container specifier, but AppleScript does not accept range specifiers with relative container specifiers, so we cannot return those from PDFSelection -static void fixRangeSpecifiers(id object) { - if ([object isKindOfClass:[NSArray class]]) { - for (id subobject in (NSArray *)object) - fixRangeSpecifiers(subobject); - } else if ([object isKindOfClass:[NSDictionary class]]) { - for (id subobject in [object allValues]) - fixRangeSpecifiers(subobject); - } else if ([object isKindOfClass:[NSScriptObjectSpecifier class]]) { - fixRangeSpecifiers([(NSScriptObjectSpecifier *)object containerSpecifier]); - if ([object isKindOfClass:[NSRangeSpecifier class]]) { - NSScriptObjectSpecifier *childSpec = [(NSRangeSpecifier *)object startSpecifier]; - if ([childSpec containerSpecifier]) { - [childSpec setContainerSpecifier:nil]; - [childSpec setContainerIsRangeContainerObject:YES]; - } - childSpec = [(NSRangeSpecifier *)object endSpecifier]; - if ([childSpec containerSpecifier]) { - [childSpec setContainerSpecifier:nil]; - [childSpec setContainerIsRangeContainerObject:YES]; - } - } - } -} - -static void replacement_setReceiversSpecifier(id self, SEL _cmd, NSScriptObjectSpecifier *receiversSpec) { - fixRangeSpecifiers(receiversSpec); - original_setReceiversSpecifier(self, _cmd, receiversSpec); -} - -static void replacement_setArguments(id self, SEL _cmd, NSDictionary *args) { - fixRangeSpecifiers(args); - original_setArguments(self, _cmd, args); -} - -static void replacement_setDirectParameter(id self, SEL _cmd, id directParameter) { - fixRangeSpecifiers(directParameter); - original_setDirectParameter(self, _cmd, directParameter); -} - -+ (void)load { - original_setReceiversSpecifier = (void (*)(id, SEL, id))SKReplaceInstanceMethodImplementation(self, @selector(setReceiversSpecifier:), (IMP)replacement_setReceiversSpecifier); - original_setArguments = (void (*)(id, SEL, id))SKReplaceInstanceMethodImplementation(self, @selector(setArguments:), (IMP)replacement_setArguments); - original_setDirectParameter = (void (*)(id, SEL, id))SKReplaceInstanceMethodImplementation(self, @selector(setDirectParameter:), (IMP)replacement_setDirectParameter); -} - - (NSScriptObjectSpecifier *)subjectSpecifier { return [NSScriptObjectSpecifier objectSpecifierWithDescriptor:[[self appleEvent] attributeDescriptorForKeyword:'subj']]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Skim-app-commit mailing list Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit