This is HTMLConverter.m in view mode; [Download] [Up]
/** ** HTMLConverter Mail Bundle ** **/ /* C functions */ /* import <stdio.h> */ /* import <strings.h> */ /* Obj-C Classes */ #import <appkit/appkit.h> /* Mail stuff */ #import "HTMLConverter.h" @implementation HTMLConverter /*****************/ /* Class Methods */ /*****************/ + initialize; { [NXApp addDisplayFilter:[[self alloc] init]]; return self; } /********************/ /* Instance Methods */ /********************/ - init; { if (nil == [super init]) return nil; /* prepare instance variables */ conversionMap = nil; htmlMapFileName = NULL; htmlSavePathName = NULL; htmlServiceName = NULL; [self setFileCount:0]; /* build the HTMLConverter file name string and the flag on whether to convert */ [self loadDefaults]; /* if don't convert and don't display, don't use. */ if (![self performHTMLConversion] && ![self performHTMLDisplay]) { [self free]; return nil; } /* load up the file */ if ([self performHTMLConversion]) { [self setConversionMap:[[NXStringTable alloc] init]]; [[self conversionMap] readFromFile:[self htmlMapFileName]]; /* if no conversion file data & not displaying, don't use. */ if ((0 == [[self conversionMap] count]) && ![self performHTMLDisplay]) { [self free]; return nil; } } /* delete old files */ if ([self performHTMLDisplay]) { char systemCall[MAXPATHLEN] = "rm "; strcat(systemCall, [self htmlSavePathName]); strcat(systemCall, "HTMLConvert*"); system(systemCall); /* stdlib */ } return self; } - free; { /* This doesn't malloc space for htmlMapFileName, so not freeing it. */ [self setConversionMap:nil]; return [super free]; } /********************/ /* Accessor Methods */ /********************/ /* conversion info */ - (BOOL)performHTMLConversion; { return performHTMLConversion; } - (void)setPerformHTMLConversion:(BOOL)value; { performHTMLConversion = value; } - (const char *)htmlMapFileName; { return htmlMapFileName; } - (void)setHtmlMapFileName:(const char *)value; { htmlMapFileName = value; } - (NXStringTable *)conversionMap; { return conversionMap; } - (void)setConversionMap:(NXStringTable *)value; { [conversionMap free]; conversionMap = value; } /* display info */ - (BOOL)performHTMLDisplay; { return performHTMLDisplay; } - (void)setPerformHTMLDisplay:(BOOL)value; { performHTMLDisplay = value; } - (const char *)htmlSavePathName; { return htmlSavePathName; } - (void)setHtmlSavePathName:(const char *)value; { htmlSavePathName = value; } - (const char *)htmlServiceName; { return htmlServiceName; } - (void)setHtmlServiceName:(const char *)value; { htmlServiceName = value; } - (int)fileCount; { return fileCount++; /* increment for next request */ } - (void)setFileCount:(int)value; { fileCount = value; } /********************/ - (void)loadDefaults; { /* The values MUST be unique, else all array elements are pointers */ /* to the exact same value! */ static NXDefaultsVector standardDefaults = { {"HTMLServiceName", "OmniWeb/Open URL"} ,{"HTMLSavePathName", "/tmp/"} ,{NULL} }; const char *boolValue = NULL; char path[MAXPATHLEN]; NXRegisterDefaults([NXApp appName], standardDefaults); /* Should the conversion happen? */ boolValue = NULL; boolValue = NXGetDefaultValue([NXApp appName], "HTMLConvert"); if ((NULL == boolValue) || (strcmp(boolValue, "YES") == 0)) { [self setPerformHTMLConversion:YES]; } else { [self setPerformHTMLConversion:NO]; } /* Should the display happen? */ boolValue = NULL; boolValue = NXGetDefaultValue([NXApp appName], "HTMLDisplay"); if ((NULL == boolValue) || (strcmp(boolValue, "YES") == 0)) { [self setPerformHTMLDisplay:YES]; } else { [self setPerformHTMLDisplay:NO]; } if (![self performHTMLConversion] && ![self performHTMLDisplay]) { /* if don't convert or display, don't need any other defaults...return */ return; } /* where is the path to use for saving */ [self setHtmlSavePathName:(const char *)NXGetDefaultValue([NXApp appName], "HTMLSavePathName")]; /* what is the name of the service to open URLs */ [self setHtmlServiceName:(const char *)NXGetDefaultValue([NXApp appName], "HTMLServiceName")]; /* where is the file to use for the conversion */ [self setHtmlMapFileName:(const char *)NXGetDefaultValue([NXApp appName], "HTMLMapPathFileName")]; /* if path found, done. */ if (NULL != [self htmlMapFileName]) { return; } /* if NO path found, look in bundle */ if ([[NXBundle bundleForClass:[self class]] getPath:path forResource:"HTMLMap" ofType:"plist"]) { [self setHtmlMapFileName:(const char *)path]; } else { fprintf(stderr, "*** Can't find HTMLMap.plist in bundle\n"); [self setHtmlMapFileName:(const char *)NULL]; return; } } - (BOOL)convertText:(Text*)text; { /* This is how to enumerate through a hashTable (NSStringTable is subclass) */ NXStringTable *table = [self conversionMap]; const void *key; void *value; NXHashState state = [table initState]; /* Enumerate (loop) through the key/values. Perform conversion. */ while ([table nextState:&state key:&key value:&value]) { /* printf("test*** key:%s value:%s\n", (const char *)key, (char *)value); */ /* have to loop through replacing multiple -keys- */ while ([text findText:key ignoreCase:YES backwards:NO wrap:YES]) { [text replaceSel:value]; } } return YES; } - (BOOL)openBrowserWithText:(Text*)text; { Pasteboard *pboard = nil; const char *pboardTypes[1]; char fileName[MAXPATHLEN]; char pbData[MAXPATHLEN] = "file:"; int length = 0; /* save Text to a file */ /* generate fileName with format like: "/tmp/HTMLConverter0.html" */ sprintf(fileName, "%sHTMLConverter%d.html", [self htmlSavePathName], [self fileCount]); [self saveText:text toFileNamed:fileName]; /* open file in HTML Browser through services */ /* filename with format like: "file:/tmp/HTMLConverter0.html" */ strcat(pbData, fileName); length = strlen(pbData) + 1; pboard = [Pasteboard newName:NXGeneralPboard]; /* Have to declare types & self as owner before able to successfully write to pboard */ pboardTypes[0] = NXAsciiPboardType; [pboard declareTypes:pboardTypes num:1 owner:self]; [pboard writeType:NXAsciiPboardType data:pbData length:length]; /* pboard data must include the "file:" http designation */ return NXPerformService([self htmlServiceName], pboard); /* standard pasteboards generally should not be freed at all. */ } - (BOOL)saveText:(Text*)text toFileNamed:(const char *)filename; { NXStream *stream; BOOL failed = NO; /* open data stream */ stream = NXOpenMemory(NULL, 0, NX_READWRITE); if (stream) { /* write data to stream */ NX_DURING [text writeText:stream]; NX_HANDLER failed = YES; NX_ENDHANDLER if (!failed) { /* write steam data to file */ NX_DURING NXSaveToFile(stream, filename); NX_HANDLER failed = YES; NX_ENDHANDLER } NXCloseMemory(stream, NX_FREEBUFFER); } if (failed || !stream) { NXRunAlertPanel("Error", "Couldn't save HTML to: %s", NULL, NULL, NULL, filename); return NO; } return YES; } /********************/ /* Delegate Methods */ /********************/ - (void)willDisplayText:(Text *)text; { /* Check if conversion is wanted & possible */ if ( !text && ([text textLength] < 10)) { return; } /* Check if conversion should be performed */ /* does <html> tag exist. (could also check that </html> tag exists) */ if ( !([text findText:"<html>" ignoreCase:YES backwards:NO wrap:YES])) { return; } /* This Text Object does contain HTML! */ /* if display requested, display */ if ([self performHTMLDisplay]) { [self openBrowserWithText:text]; } /* if conversion requested, perform AFTER display */ if ([self performHTMLConversion]) { [self convertText:text]; } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.