Well, I just reverted it after discovering that it was writing data as @type{citekey} when doing a copy/paste or save from tugboat.bib, not to mention the debugging problem.
-- adam On Dec 19, 2007, at 5:25 PM, Christiaan Hofman wrote: > Only using code duplication, as it is about setting up the local > variables. > > Christiaan > > On 20 Dec 2007, at 2:19 AM, Adam R. Maxwell wrote: > >> Can we do this without a macro? Debugging with gdb is impossible >> when >> you don't have correct line numbers (I hate the macro in the >> TextWithIconCell for that reason). It also makes it harder to see >> the >> flow, and this code is critical. >> >> >> On Dec 19, 2007, at 9:11 AM, [EMAIL PROTECTED] wrote: >> >>> Revision: 11977 >>> http://bibdesk.svn.sourceforge.net/bibdesk/? >>> rev=11977&view=rev >>> Author: hofman >>> Date: 2007-12-19 09:11:28 -0800 (Wed, 19 Dec 2007) >>> >>> Log Message: >>> ----------- >>> Add empty fields that always should be included only when they are >>> required or optional, and also if they are nil. Field values can now >>> be nil, so make sure we don't append nil strings or data. Define a >>> macro for some common setup code. >>> >>> Modified Paths: >>> -------------- >>> trunk/bibdesk/BibItem.m >>> >>> Modified: trunk/bibdesk/BibItem.m >>> =================================================================== >>> --- trunk/bibdesk/BibItem.m 2007-12-19 17:08:39 UTC (rev 11976) >>> +++ trunk/bibdesk/BibItem.m 2007-12-19 17:11:28 UTC (rev 11977) >>> @@ -1590,119 +1590,109 @@ >>> return string; >>> } >>> >>> +#define PREPARE_KEYS \ >>> + NSAssert1(type != nil, @"Tried to use a nil pubtype in [EMAIL >>> PROTECTED] You >>> will need to quit and relaunch BibDesk after fixing the error >>> manually.", self ); \ >>> + if (shouldTeXify) \ >>> + urlKeys = [btm allURLFieldsSet]; \ >>> + if (drop || keysToWriteIfEmpty) { \ >>> + knownKeys = [[NSMutableSet alloc] initWithCapacity:14]; \ >>> + [knownKeys addObjectsFromArray:[btm >>> requiredFieldsForType:type]]; \ >>> + [knownKeys addObjectsFromArray:[btm >>> optionalFieldsForType:type]]; \ >>> + [keysToWriteIfEmpty intersectSet:knownKeys]; \ >>> + [knownKeys addObject:BDSKCrossrefString]; \ >>> + if ([keysToWriteIfEmpty count]) { \ >>> + e = [keysToWriteIfEmpty objectEnumerator]; \ >>> + while (field = [e nextObject]) { \ >>> + if ([keys containsObject:field] == NO) \ >>> + [keys addObject:field]; \ >>> + } \ >>> + } else { \ >>> + [keysToWriteIfEmpty release]; \ >>> + keysToWriteIfEmpty = nil; \ >>> + } \ >>> + } \ >>> + [keys sortUsingSelector:@selector(caseInsensitiveCompare:)]; \ >>> + if ([pw boolForKey:BDSKSaveAnnoteAndAbstractAtEndOfItemKey]) >>> { \ >>> + NSMutableArray *noteKeys = [[[btm noteFieldsSet] allObjects] >>> mutableCopy]; \ >>> + [noteKeys >>> sortUsingSelector:@selector(caseInsensitiveCompare:)]; \ >>> + [keys removeObjectsInArray:noteKeys]; \ >>> + [keys addObjectsFromArray:noteKeys]; \ >>> + [noteKeys release]; \ >>> + } \ >>> + e = [keys objectEnumerator]; \ >>> + [keys release]; >>> + >>> - (NSString *)bibTeXStringDroppingInternal:(BOOL)drop texify: >>> (BOOL)shouldTeXify{ >>> OFPreferenceWrapper *pw = [OFPreferenceWrapper >>> sharedPreferenceWrapper]; >>> + BDSKTypeManager *btm = [BDSKTypeManager sharedManager]; >>> + NSString *type = [self pubType]; >>> NSMutableSet *knownKeys = nil; >>> + NSMutableSet *keysToWriteIfEmpty = [fieldsToWriteIfEmpty >>> mutableCopy]; >>> NSSet *urlKeys = nil; >>> + NSMutableArray *keys = [[self allFieldNames] mutableCopy]; >>> + NSEnumerator *e; >>> NSString *field; >>> NSString *value; >>> NSMutableString *s = [NSMutableString stringWithCapacity:200]; >>> - NSMutableArray *keys = [[self allFieldNames] mutableCopy]; >>> - NSEnumerator *e; >>> >>> - BDSKTypeManager *btm = [BDSKTypeManager sharedManager]; >>> - NSString *type = [self pubType]; >>> - NSAssert1(type != nil, @"Tried to use a nil pubtype in [EMAIL >>> PROTECTED] You >>> will need to quit and relaunch BibDesk after fixing the error >>> manually.", self ); >>> - [keys sortUsingSelector:@selector(caseInsensitiveCompare:)]; >>> - if ([pw boolForKey:BDSKSaveAnnoteAndAbstractAtEndOfItemKey]) { >>> - NSMutableArray *noteKeys = [[[btm noteFieldsSet] allObjects] >>> mutableCopy]; >>> - [noteKeys >>> sortUsingSelector:@selector(caseInsensitiveCompare:)]; >>> - [keys removeObjectsInArray:noteKeys]; // make sure these >>> fields are at the end, as they can be long >>> - [keys addObjectsFromArray:noteKeys]; >>> - [noteKeys release]; >>> - } >>> - if (drop) { >>> - knownKeys = [[NSMutableSet alloc] initWithCapacity:14]; >>> - [knownKeys addObjectsFromArray:[btm >>> requiredFieldsForType:type]]; >>> - [knownKeys addObjectsFromArray:[btm >>> optionalFieldsForType:type]]; >>> - [knownKeys addObject:BDSKCrossrefString]; >>> - } >>> - if(shouldTeXify) >>> - urlKeys = [[BDSKTypeManager sharedManager] >>> allURLFieldsSet]; >>> - >>> - e = [keys objectEnumerator]; >>> - [keys release]; >>> - >>> - //build BibTeX entry: >>> - [s appendString:@"@"]; >>> + PREPARE_KEYS >>> >>> + [s appendString:@"@"]; >>> [s appendString:type]; >>> [s appendString:@"{"]; >>> [s appendString:[self citeKey]]; >>> >>> NSSet *personFields = [btm personFieldsSet]; >>> >>> - while(field = [e nextObject]){ >>> - if (drop && ![knownKeys containsObject:field]) >>> - continue; >>> - >>> - value = [pubFields objectForKey:field]; >>> - >>> - if([personFields containsObject:field] && [pw >>> boolForKey:BDSKShouldSaveNormalizedAuthorNamesKey] && ![value >>> isComplex]){ // only if it's not complex, use the normalized author >>> name >>> - value = [self bibTeXNameStringForField:field >>> normalized:YES inherit:NO]; >>> + while (field = [e nextObject]) { >>> + if (drop == NO || [knownKeys containsObject:field]) { >>> + value = [pubFields objectForKey:field]; >>> + >>> + // only if it's not complex, use the normalized author >>> name >>> + if ([personFields containsObject:field] && [pw >>> boolForKey:BDSKShouldSaveNormalizedAuthorNamesKey] && NO == [value >>> isComplex]) >>> + value = [self bibTeXNameStringForField:field >>> normalized:YES inherit:NO]; >>> + >>> + if (shouldTeXify && NO == [urlKeys >>> containsObject:field]) >>> + value = [value stringByTeXifyingString]; >>> + >>> + if ([NSString isEmptyString:value] || >>> [keysToWriteIfEmpty containsObject:field]) { >>> + [s appendString:@",\n\t"]; >>> + [s appendString:field]; >>> + [s appendString:@" = "]; >>> + [s appendString:[(value ? value : @"") >>> stringAsBibTeXString]]; >>> + } >>> } >>> - >>> - if(shouldTeXify && ![urlKeys containsObject:field]){ >>> - value = [value stringByTeXifyingString]; >>> - } >>> - >>> - if(![value isEqualToString:@""] || [fieldsToWriteIfEmpty >>> containsObject:field]){ >>> - [s appendString:@",\n\t"]; >>> - [s appendString:field]; >>> - [s appendString:@" = "]; >>> - [s appendString:[value stringAsBibTeXString]]; >>> - } >>> } >>> >>> // make sure to add these at the end to avoid problems with >>> BibTeX's buffers >>> - if (!drop) { >>> - value = [self filesAsBibTeXFragmentRelativeToPath:[self >>> basePath]]; >>> - if (value) [s appendString:value]; >>> - } >>> - [knownKeys release]; >>> + if (drop == NO && (value = [self >>> filesAsBibTeXFragmentRelativeToPath:[self basePath]])) >>> + [s appendString:value]; >>> [s appendString:@"}"]; >>> >>> + [knownKeys release]; >>> + [keysToWriteIfEmpty release]; >>> + >>> return s; >>> } >>> >>> - (NSData *)bibTeXDataDroppingInternal:(BOOL)drop relativeToPath: >>> (NSString *)basePath encoding:(NSStringEncoding)encoding error: >>> (NSError **)outError{ >>> OFPreferenceWrapper *pw = [OFPreferenceWrapper >>> sharedPreferenceWrapper]; >>> BOOL shouldTeXify = [pw >>> boolForKey:BDSKShouldTeXifyWhenSavingAndCopyingKey]; >>> + BDSKTypeManager *btm = [BDSKTypeManager sharedManager]; >>> + NSString *type = [self pubType]; >>> NSMutableSet *knownKeys = nil; >>> + NSMutableSet *keysToWriteIfEmpty = [fieldsToWriteIfEmpty >>> mutableCopy]; >>> NSSet *urlKeys = nil; >>> + NSMutableArray *keys = [[self allFieldNames] mutableCopy]; >>> + NSEnumerator *e; >>> NSString *field; >>> NSString *value; >>> NSMutableData *data = [NSMutableData dataWithCapacity:200]; >>> - NSMutableArray *keys = [[self allFieldNames] mutableCopy]; >>> - NSEnumerator *e; >>> - NSError *error= nil; >>> + NSError *error = nil; >>> BOOL isOK = YES; >>> >>> - >>> - BDSKTypeManager *btm = [BDSKTypeManager sharedManager]; >>> - NSString *type = [self pubType]; >>> - NSAssert1(type != nil, @"Tried to use a nil pubtype in [EMAIL >>> PROTECTED] You >>> will need to quit and relaunch BibDesk after fixing the error >>> manually.", self ); >>> - [keys sortUsingSelector:@selector(caseInsensitiveCompare:)]; >>> - if ([pw boolForKey:BDSKSaveAnnoteAndAbstractAtEndOfItemKey]) { >>> - NSMutableArray *noteKeys = [[[btm noteFieldsSet] allObjects] >>> mutableCopy]; >>> - [noteKeys >>> sortUsingSelector:@selector(caseInsensitiveCompare:)]; >>> - [keys removeObjectsInArray:noteKeys]; // make sure these >>> fields are at the end, as they can be long >>> - [keys addObjectsFromArray:noteKeys]; >>> - [noteKeys release]; >>> - } >>> - if (drop) { >>> - knownKeys = [[NSMutableSet alloc] initWithCapacity:14]; >>> - [knownKeys addObjectsFromArray:[btm >>> requiredFieldsForType:type]]; >>> - [knownKeys addObjectsFromArray:[btm >>> optionalFieldsForType:type]]; >>> - [knownKeys addObject:BDSKCrossrefString]; >>> - } >>> - if(shouldTeXify) >>> - urlKeys = [[BDSKTypeManager sharedManager] >>> allURLFieldsSet]; >>> - >>> - e = [keys objectEnumerator]; >>> - [keys release]; >>> + PREPARE_KEYS >>> >>> - //build BibTeX entry: >>> isOK = [data appendDataFromString:@"@" encoding:encoding >>> error:&error] && >>> [data appendDataFromString:type encoding:encoding >>> error:&error] && >>> [data appendDataFromString:@"{" encoding:encoding >>> error:&error] && >>> @@ -1717,47 +1707,45 @@ >>> NSData *lineSeparator = [@",\n\t" dataUsingEncoding:encoding]; >>> NSData *fieldValueSeparator = [@" = " >>> dataUsingEncoding:encoding]; >>> >>> - while(isOK && (field = [e nextObject])){ >>> - if (drop && ![knownKeys containsObject:field]) >>> - continue; >>> - >>> - value = [pubFields objectForKey:field]; >>> - >>> - if([personFields containsObject:field] && [pw >>> boolForKey:BDSKShouldSaveNormalizedAuthorNamesKey] && ![value >>> isComplex]){ // only if it's not complex, use the normalized author >>> name >>> - value = [self bibTeXNameStringForField:field >>> normalized:YES inherit:NO]; >>> - } >>> - >>> - if(shouldTeXify && ![urlKeys containsObject:field]){ >>> - value = [value stringByTeXifyingString]; >>> - } >>> - >>> - if(NO == [value isEqualToString:@""] || >>> [fieldsToWriteIfEmpty containsObject:field]){ >>> + while (isOK && (field = [e nextObject])) { >>> + if (drop == NO || [knownKeys containsObject:field]) { >>> + value = [pubFields objectForKey:field]; >>> >>> - [data appendData:lineSeparator]; >>> - isOK = [data appendDataFromString:field >>> encoding:encoding error:&error]; >>> - [data appendData:fieldValueSeparator]; >>> + // only if it's not complex, use the normalized author >>> name >>> + if ([personFields containsObject:field] && [pw >>> boolForKey:BDSKShouldSaveNormalizedAuthorNamesKey] && NO == [value >>> isComplex]) >>> + value = [self bibTeXNameStringForField:field >>> normalized:YES inherit:NO]; >>> >>> - if(isOK) >>> - isOK = [data appendDataFromString:[value >>> stringAsBibTeXString] encoding:encoding error:&error]; >>> - >>> - if(isOK == NO) { >>> - error = [[error mutableCopy] autorelease]; >>> - [error setValue:[NSString >>> stringWithFormat:NSLocalizedString(@"Unable to convert field \"[EMAIL >>> PROTECTED]" >>> of item with cite key \"[EMAIL PROTECTED]".", @"string encoding error >>> context"), >>> [field localizedFieldName], [self citeKey]] >>> forKey:NSLocalizedRecoverySuggestionErrorKey]; >>> + if (shouldTeXify && NO == [urlKeys >>> containsObject:field]) >>> + value = [value stringByTeXifyingString]; >>> + >>> + if ([NSString isEmptyString:value] || >>> [keysToWriteIfEmpty containsObject:field]) { >>> + >>> + [data appendData:lineSeparator]; >>> + isOK = [data appendDataFromString:field >>> encoding:encoding error:&error]; >>> + [data appendData:fieldValueSeparator]; >>> + >>> + if (isOK) >>> + isOK = [data appendDataFromString:[(value ? >>> value : @"") stringAsBibTeXString] encoding:encoding error:&error]; >>> + >>> + if (isOK == NO) { >>> + error = [[error mutableCopy] autorelease]; >>> + [error setValue:[NSString >>> stringWithFormat:NSLocalizedString(@"Unable to convert field \"[EMAIL >>> PROTECTED]" >>> of item with cite key \"[EMAIL PROTECTED]".", @"string encoding error >>> context"), >>> [field localizedFieldName], [self citeKey]] >>> forKey:NSLocalizedRecoverySuggestionErrorKey]; >>> + } >>> } >>> } >>> } >>> + >>> [knownKeys release]; >>> + [keysToWriteIfEmpty release]; >>> >>> // make sure to add these at the end to avoid problems with >>> BibTeX's buffers >>> - if(isOK && !drop) { >>> - value = [self >>> filesAsBibTeXFragmentRelativeToPath:basePath]; >>> + if (isOK && drop == NO && (value = [self >>> filesAsBibTeXFragmentRelativeToPath:basePath])) >>> // assumes encoding is ascii-compatible, but btparse does as >>> well >>> - if (value) [data appendDataFromString:value >>> encoding:encoding error:&error]; >>> - } >>> - if(isOK) >>> + [data appendDataFromString:value encoding:encoding >>> error:&error]; >>> + if (isOK) >>> isOK = [data appendDataFromString:@"}" encoding:encoding >>> error:&error]; >>> >>> - if(isOK == NO && outError) >>> + if (isOK == NO && outError) >>> *outError = error; >>> >>> return isOK ? data : nil; >>> >>> >>> This was sent by the SourceForge.net collaborative development >>> platform, the world's largest Open Source development site. >>> >>> --------------------------------------------------------------------- >>> ---- >>> SF.Net email is sponsored by: >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services >>> for just about anything Open Source. >>> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/ >>> marketplace >>> _______________________________________________ >>> Bibdesk-commit mailing list >>> [EMAIL PROTECTED] >>> https://lists.sourceforge.net/lists/listinfo/bibdesk-commit >> >> >> ---------------------------------------------------------------------- >> --- >> SF.Net email is sponsored by: >> Check out the new SourceForge.net Marketplace. >> It's the best place to buy or sell services >> for just about anything Open Source. >> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/ >> marketplace >> _______________________________________________ >> Bibdesk-develop mailing list >> Bibdesk-develop@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/bibdesk-develop > > > ------------------------------------------------------------------------- > SF.Net email is sponsored by: > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services > for just about anything Open Source. > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > _______________________________________________ > Bibdesk-develop mailing list > Bibdesk-develop@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/bibdesk-develop ------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ Bibdesk-develop mailing list Bibdesk-develop@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-develop