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
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit