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.