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

Reply via email to