Ticket #10555: trac_10555-extcode.patch

File trac_10555-extcode.patch, 16.5 KB (added by iandrus, 7 years ago)

Updating for changes to 8473

  • sage/ext/mac-app/AppController.h

    # HG changeset patch
    # User Ivan Andrus <darthandrus@gmail.com>
    # Date 1299947505 -3600
    # Node ID 3b81a593b20dcbdcd12a5f42f9d6ffa7a1b13df8
    # Parent  07e6d5b657e14da2b620dd8589f8c60b63f7a75b
    #10555/extcode: Add several services to Sage.app
    
    diff --git a/sage/ext/mac-app/AppController.h b/sage/ext/mac-app/AppController.h
    a b  
    6161-(IBAction)showPreferences:(id)sender;
    6262
    6363-(void)setupPaths;
     64-(NSString*)sageBinary;
    6465
    6566// Quit
    6667-(IBAction)stopServerAndQuit:(id)sender;
  • sage/ext/mac-app/AppController.m

    diff --git a/sage/ext/mac-app/AppController.m b/sage/ext/mac-app/AppController.m
    a b  
    302302    }
    303303}
    304304
     305-(NSString*)sageBinary{
     306    return sageBinary;
     307}
     308
    305309-(IBAction)revealInFinder:(id)sender{
    306310    if ( [[sender title] isEqualToString:@"Reveal in Shell"] ) {
    307311        [self terminalRun:[NSString stringWithFormat:@"cd '%@' && $SHELL",
  • sage/ext/mac-app/AppDelegate.h

    diff --git a/sage/ext/mac-app/AppDelegate.h b/sage/ext/mac-app/AppDelegate.h
    a b  
    3232
    3333-(IBAction)openDocumentWithDialogBox:(id)sender;
    3434
     35// Services
     36- (NSString*)writeData:(NSData*)data toTempFileWithSuffix:(NSString*)format;
     37- (NSString *)urlEncodeValue:(NSString *)str;
     38
     39- (void)serviceUnspkg:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error;
     40- (void)serviceExecute:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error;
     41- (void)serviceTerminalRun:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error;
     42- (void)serviceWorksheet:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error;
     43
    3544@end
  • sage/ext/mac-app/AppDelegate.m

    diff --git a/sage/ext/mac-app/AppDelegate.m b/sage/ext/mac-app/AppDelegate.m
    a b  
    1010#import <WebKit/WebFrame.h>
    1111#import <WebKit/WebView.h>
    1212#import <Carbon/Carbon.h>
     13#import <AppKit/NSPasteboard.h>
    1314
    1415@implementation AppDelegate
    1516
     
    6263        [[NSApp mainMenu] removeItemAtIndex:6]; // Window menu
    6364        [[NSApp mainMenu] removeItemAtIndex:2]; // Edit menu
    6465    }
     66
     67    [NSApp setServicesProvider:self];
    6568}
    6669
    6770- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
     
    7780    return NO;
    7881}
    7982
     83# pragma mark NSApplicationDelegate
     84
     85- (NSString *)urlEncodeValue:(NSString *)str {
     86    NSString *result = (NSString *)
     87    CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
     88                                            (CFStringRef)str,
     89                                            NULL,
     90                                            CFSTR(":/?#[]@!$&’()*+,;="),
     91                                            kCFStringEncodingUTF8);
     92    return [result autorelease];
     93}
     94
    8095// From here down are methods from NSApplicationDelegate, which probably do belong in another file.
    8196// If/when this is done, I think you have to change the "File's Owner"'s delegate in IB
    8297- (BOOL)application: (NSApplication * )theApplication openFile: (NSString * )filename{
     
    224239}
    225240
    226241
     242
     243#pragma mark Services
     244
     245- (NSArray*)extractFileURLs:(NSPasteboard *)pboard error:(NSString **)error {
     246
     247    NSArray *classes = [NSArray arrayWithObject:[NSURL class]];
     248
     249    // Only on 10.6
     250    if ( [pboard respondsToSelector:@selector(readObjectsForClasses:options:)] ) {
     251
     252        NSArray* fileURLs = [pboard readObjectsForClasses:classes
     253                                                  options:nil];
     254
     255
     256        NSMutableArray* tmpArray = [NSMutableArray arrayWithCapacity:[fileURLs count]];
     257        NSEnumerator *enumerator = [fileURLs objectEnumerator];
     258        id key;
     259        while( (key = [enumerator nextObject]) ) {
     260            if ([key isFileURL]) {
     261                [tmpArray addObject:[key path]];
     262            }
     263        }
     264        NSArray *filePaths = [NSArray arrayWithArray:tmpArray];
     265        return filePaths;
     266
     267    } else if ([[pboard types] containsObject:NSURLPboardType] ) {
     268        // On 10.5 I think you can only get one item no the paste board at a time, so this should be okay.
     269        // Ensure a URL on the pasteboard.
     270        NSURL *url = [NSURL URLFromPasteboard:pboard];
     271        if ([url isFileURL]) {
     272            return [NSArray arrayWithObject:[url path]];
     273        }
     274    }
     275    *error = NSLocalizedString(@"Error: couldn't execute file.",
     276                               @"pboard couldn't give URL.");
     277    return nil;
     278}
     279
     280
     281- (void)serviceTerminalRun:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
     282
     283    NSArray* files = [self extractFileURLs:pboard error:error];
     284    if (files) {
     285        [appController sageTerminalRun:userData withArguments:files];
     286    }
     287}
     288
     289- (void)serviceExecute:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
     290    NSLog(@"userData: %@",userData);
     291    NSArray *supportedTypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
     292    NSString *bestType = [pboard availableTypeFromArray:supportedTypes];
     293    if ( bestType ) {
     294        NSString *str = [pboard stringForType:bestType];
     295        [appController sageTerminalRun: ([userData length] > 0 ? userData : nil)
     296                         withArguments:[NSArray
     297                                        arrayWithObjects:
     298                                        @"\n",
     299                                        str,
     300                                        nil]];
     301    }
     302}
     303
     304- (void)serviceUnspkg:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
     305    NSArray* files = [self extractFileURLs:pboard error:error];
     306    if (files) {
     307
     308        NSWorkspace* ws = [NSWorkspace sharedWorkspace];
     309        NSEnumerator *enumerator = [files objectEnumerator];
     310        id file;
     311        while( (file = [enumerator nextObject]) ) {
     312
     313            [ws openFile:file withApplication: @"/System/Library/CoreServices/Archive Utility.app"] ||
     314            [ws openFile:file withApplication: @"/System/Library/CoreServices/BOMArchiveHelper.app"];
     315
     316        }
     317    }
     318}
     319
     320
     321- (NSString*)writeData:(NSData*)data toTempFileWithSuffix:(NSString*)suffix{
     322
     323    NSString *tempFileTemplate = [NSTemporaryDirectory()
     324                                  stringByAppendingPathComponent:
     325                                  [NSString stringWithFormat:@"sage.XXXX%@", suffix]];
     326    const char *tempFileTemplateCString = [tempFileTemplate fileSystemRepresentation];
     327    char *tempFileNameCString = (char *)malloc(strlen(tempFileTemplateCString) + 1);
     328    strcpy(tempFileNameCString, tempFileTemplateCString);
     329    int fileDescriptor = mkstemps(tempFileNameCString, [suffix length]);
     330    if (fileDescriptor == -1) {
     331        return nil;
     332    }
     333
     334    NSString* tempFileName = [[NSFileManager defaultManager]
     335                              stringWithFileSystemRepresentation:tempFileNameCString
     336                              length:strlen(tempFileNameCString)];
     337
     338    free(tempFileNameCString);
     339
     340    NSFileHandle* tempFileHandle = [[NSFileHandle alloc]
     341                                    initWithFileDescriptor:fileDescriptor
     342                                    closeOnDealloc:YES];
     343
     344    // write to file
     345    [tempFileHandle writeData:data];
     346    [tempFileHandle release];
     347
     348    // Return path to the file
     349    return [NSString stringWithString:tempFileName];
     350}
     351
     352
     353- (void)serviceWorksheet:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
     354
     355    NSArray *supportedTypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
     356    NSString *bestType = [pboard availableTypeFromArray:supportedTypes];
     357    if ( bestType ) {
     358        // Extract data from pasteboard
     359        NSString *str = [pboard stringForType:bestType];
     360
     361        // Give it a title and surround with {{{ }}} if needed
     362        // If it contains {{{ we assume they know what they are doing and pass it straight through
     363        NSData* data;
     364        NSRange match = [str rangeOfString:@"{{{" options:NSLiteralSearch];
     365        if ( match.length == 0 ) {
     366            NSString* tmpStr = [NSString stringWithFormat:@"Untitled\n{{{\n%@\n}}}", str];
     367            data = [tmpStr dataUsingEncoding:NSUTF8StringEncoding];
     368        } else {
     369            data = [str dataUsingEncoding:NSUTF8StringEncoding];
     370        }
     371
     372        // Write data to file
     373        NSString* tmpPath = [self writeData:data toTempFileWithSuffix:@".txt" ];
     374
     375        // upload temp file
     376        if (tmpPath) {
     377            [self application:nil openFile:tmpPath];
     378        }
     379        // tmp file will get cleaned up in 3 days by the system...
     380    }
     381}
     382
     383
     384- (void)servicePreparse:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
     385    NSArray *supportedTypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
     386    NSString *bestType = [pboard availableTypeFromArray:supportedTypes];
     387    if ( bestType ) {
     388        // Extract data from pasteboard
     389        NSString *str = [pboard stringForType:bestType];
     390
     391        // Write data to a temporary file
     392        NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
     393        NSString* tmpPath = [self writeData:data toTempFileWithSuffix:@".sage" ];
     394
     395        // preparse temp file
     396        if (tmpPath) {
     397            NSTask* preparser = [NSTask launchedTaskWithLaunchPath:[appController sageBinary]
     398                                                         arguments:[NSArray arrayWithObjects:@"--preparse",
     399                                                                    tmpPath,
     400                                                                    nil]];
     401            [preparser waitUntilExit];
     402            if ( [preparser terminationStatus] == 0 ) {
     403                NSString* preparsedFile = [[tmpPath stringByDeletingPathExtension]
     404                                           stringByAppendingPathExtension:@"py"];
     405                NSError* err;
     406                NSString* contents = [NSString stringWithContentsOfFile:preparsedFile
     407                                                               encoding:NSUTF8StringEncoding
     408                                                                  error:&err];
     409                if (contents) {
     410                    // The first line contains an autogenerated message that we don't want
     411                    NSRange firstLine = [contents rangeOfString:@"\n"];
     412                    NSRange autoGenerated = [contents rangeOfString:@"This file was *autogenerated* from the file"];
     413                    [pboard declareTypes:supportedTypes owner:nil];
     414
     415                    if ( autoGenerated.length > 0 && firstLine.length > 0 && autoGenerated.location < firstLine.location ) {
     416                        [pboard setString:[contents substringFromIndex:firstLine.location+firstLine.length] forType:NSStringPboardType];
     417                    } else {
     418                        [pboard setString:contents forType:NSStringPboardType];
     419                    }
     420                } else if (error) {
     421                    *error = [err localizedDescription];
     422                }
     423            } else if (error) {
     424                *error = @"Could not preparse file";
     425            }
     426        } else if (error) {
     427            *error = @"Could not create temp file";
     428        }
     429        // tmp file will get cleaned up in 3 days by the system...
     430    }
     431}
     432
     433
     434- (void)serviceEval:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
     435
     436    NSArray *supportedTypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
     437    NSString *bestType = [pboard availableTypeFromArray:supportedTypes];
     438    if ( bestType ) {
     439        NSString *str = [pboard stringForType:bestType];
     440
     441        NSPipe* sageOut = [NSPipe pipe];
     442        NSTask* task = [[NSTask alloc] init];
     443        [task setLaunchPath:[appController sageBinary]];
     444        [task setArguments:[NSArray arrayWithObjects:@"-c", str, nil]];
     445        [task setStandardOutput:sageOut];
     446
     447        [task launch];
     448
     449        // It it writes more than 8k we may be in trouble...
     450        [task waitUntilExit];
     451
     452        if ([task terminationStatus] == 0 ) {
     453
     454            NSData *data = [[sageOut fileHandleForReading] readDataToEndOfFile];
     455            [pboard declareTypes:supportedTypes owner:nil];
     456            [pboard setData:data forType:NSStringPboardType];
     457
     458        } else if (error) {
     459            *error = @"Could not evaluate code.";
     460        }
     461
     462        [task release];
     463    }
     464}
     465
     466
    227467@end
  • sage/ext/mac-app/Sage-Info.plist

    diff --git a/sage/ext/mac-app/Sage-Info.plist b/sage/ext/mac-app/Sage-Info.plist
    a b  
    158158        <string>MainMenu</string>
    159159        <key>NSPrincipalClass</key>
    160160        <string>NSApplication</string>
     161        <key>NSServices</key>
     162        <array>
     163                <dict>
     164                        <key>NSMenuItem</key>
     165                        <dict>
     166                                <key>default</key>
     167                                <string>Sage/Preparse File with Sage</string>
     168                        </dict>
     169                        <key>NSMessage</key>
     170                        <string>serviceTerminalRun</string>
     171                        <key>NSPortName</key>
     172                        <string>Sage</string>
     173                        <key>NSSendFileTypes</key>
     174                        <array>
     175                                <string>org.sagemath.sage-source</string>
     176                        </array>
     177                        <key>NSUserData</key>
     178                        <string>preparse</string>
     179                </dict>
     180                <dict>
     181                        <key>NSMenuItem</key>
     182                        <dict>
     183                                <key>default</key>
     184                                <string>Sage/Test file with Sage</string>
     185                        </dict>
     186                        <key>NSMessage</key>
     187                        <string>serviceTerminalRun</string>
     188                        <key>NSPortName</key>
     189                        <string>Sage</string>
     190                        <key>NSSendFileTypes</key>
     191                        <array>
     192                                <string>org.sagemath.sage-source</string>
     193                                <string>public.folder</string>
     194                        </array>
     195                        <key>NSUserData</key>
     196                        <string>t</string>
     197                </dict>
     198                <dict>
     199                        <key>NSMenuItem</key>
     200                        <dict>
     201                                <key>default</key>
     202                                <string>Sage/Create Sage Package</string>
     203                        </dict>
     204                        <key>NSMessage</key>
     205                        <string>serviceTerminalRun</string>
     206                        <key>NSPortName</key>
     207                        <string>Sage</string>
     208                        <key>NSSendFileTypes</key>
     209                        <array>
     210                                <string>public.folder</string>
     211                        </array>
     212                        <key>NSUserData</key>
     213                        <string>pkg</string>
     214                </dict>
     215                <dict>
     216                        <key>NSMenuItem</key>
     217                        <dict>
     218                                <key>default</key>
     219                                <string>Sage/Create Uncompressed Sage Package</string>
     220                        </dict>
     221                        <key>NSMessage</key>
     222                        <string>serviceTerminalRun</string>
     223                        <key>NSPortName</key>
     224                        <string>Sage</string>
     225                        <key>NSSendFileTypes</key>
     226                        <array>
     227                                <string>public.folder</string>
     228                        </array>
     229                        <key>NSUserData</key>
     230                        <string>pkg_nc</string>
     231                </dict>
     232                <dict>
     233                        <key>NSMenuItem</key>
     234                        <dict>
     235                                <key>default</key>
     236                                <string>Sage/Unpack Sage Package</string>
     237                        </dict>
     238                        <key>NSMessage</key>
     239                        <string>serviceUnspkg</string>
     240                        <key>NSPortName</key>
     241                        <string>Sage</string>
     242                        <key>NSSendFileTypes</key>
     243                        <array>
     244                                <string>org.sagemath.sage-package</string>
     245                        </array>
     246                </dict>
     247                <dict>
     248                        <key>NSMenuItem</key>
     249                        <dict>
     250                                <key>default</key>
     251                                <string>Sage/New Sage Worksheet with Selection</string>
     252                        </dict>
     253                        <key>NSMessage</key>
     254                        <string>serviceWorksheet</string>
     255                        <key>NSPortName</key>
     256                        <string>Sage</string>
     257                        <key>NSSendTypes</key>
     258                        <array>
     259                                <string>public.plain-text</string>
     260                                <string>NSStringPboardType</string>
     261                        </array>
     262                </dict>
     263                <dict>
     264                        <key>NSMenuItem</key>
     265                        <dict>
     266                                <key>default</key>
     267                                <string>Sage/Preparse Code in Sage (and replace)</string>
     268                        </dict>
     269                        <key>NSMessage</key>
     270                        <string>servicePreparse</string>
     271                        <key>NSPortName</key>
     272                        <string>Sage</string>
     273                        <key>NSReturnTypes</key>
     274                        <array>
     275                                <string>public.plain-text</string>
     276                                <string>NSStringPboardType</string>
     277                        </array>
     278                        <key>NSSendTypes</key>
     279                        <array>
     280                                <string>public.plain-text</string>
     281                                <string>NSStringPboardType</string>
     282                        </array>
     283                </dict>
     284                <dict>
     285                        <key>NSMenuItem</key>
     286                        <dict>
     287                                <key>default</key>
     288                                <string>Sage/Evaluate Code in Sage (and replace)</string>
     289                        </dict>
     290                        <key>NSMessage</key>
     291                        <string>serviceEval</string>
     292                        <key>NSPortName</key>
     293                        <string>Sage</string>
     294                        <key>NSReturnTypes</key>
     295                        <array>
     296                                <string>public.plain-text</string>
     297                                <string>NSStringPboardType</string>
     298                        </array>
     299                        <key>NSSendTypes</key>
     300                        <array>
     301                                <string>public.plain-text</string>
     302                                <string>NSStringPboardType</string>
     303                        </array>
     304                </dict>
     305                <dict>
     306                        <key>NSMenuItem</key>
     307                        <dict>
     308                                <key>default</key>
     309                                <string>Sage/New Sage Terminal Session with Selection</string>
     310                        </dict>
     311                        <key>NSMessage</key>
     312                        <string>serviceExecute</string>
     313                        <key>NSPortName</key>
     314                        <string>Sage</string>
     315                        <key>NSSendTypes</key>
     316                        <array>
     317                                <string>public.plain-text</string>
     318                                <string>NSStringPboardType</string>
     319                        </array>
     320                </dict>
     321        </array>
    161322        <key>UTExportedTypeDeclarations</key>
    162323        <array>
    163324                <dict>