From: <ho...@us...> - 2010-09-27 11:55:20
|
Revision: 17152 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=17152&view=rev Author: hofman Date: 2010-09-27 11:55:13 +0000 (Mon, 27 Sep 2010) Log Message: ----------- save all link templates in an BDSKAttributeTemplate and remember the class of the original value Modified Paths: -------------- trunk/bibdesk/BDSKTemplateParser.m trunk/bibdesk/BDSKTemplateTag.h trunk/bibdesk/BDSKTemplateTag.m Modified: trunk/bibdesk/BDSKTemplateParser.m =================================================================== --- trunk/bibdesk/BDSKTemplateParser.m 2010-09-27 11:29:48 UTC (rev 17151) +++ trunk/bibdesk/BDSKTemplateParser.m 2010-09-27 11:55:13 UTC (rev 17152) @@ -707,7 +707,7 @@ for (BDSKAttributeTemplate *linkTemplate in linkTemplates) { NSRange range = [linkTemplate range]; id aLink = [self stringFromTemplateArray:[linkTemplate template] usingObject:object atIndex:anIndex]; - if ([[tmpAttrStr attribute:NSLinkAttributeName atIndex:range.location effectiveRange:NULL] isKindOfClass:[NSURL class]]) + if ([[linkTemplate attributeClass] isSubclassOfClass:[NSURL class]]) aLink = [NSURL URLWithStringByNormalizingPercentEscapes:aLink]; [tmpMutAttrStr addAttribute:NSLinkAttributeName value:aLink range:range]; } @@ -727,11 +727,11 @@ if (keyValue) { NSAttributedString *tmpAttrStr; NSDictionary *attrs = [(BDSKRichValueTemplateTag *)tag attributes]; - NSArray *linkTemplate = [(BDSKRichValueTemplateTag *)tag linkTemplate]; + BDSKAttributeTemplate *linkTemplate = [(BDSKRichValueTemplateTag *)tag linkTemplate]; if (linkTemplate) { NSMutableDictionary *tmpAttrs = [attrs mutableCopy]; - id aLink = [self stringFromTemplateArray:linkTemplate usingObject:object atIndex:anIndex]; - if ([[attrs objectForKey:NSLinkAttributeName] isKindOfClass:[NSURL class]]) + id aLink = [self stringFromTemplateArray:[linkTemplate template] usingObject:object atIndex:anIndex]; + if ([[linkTemplate attributeClass] isSubclassOfClass:[NSURL class]]) aLink = [NSURL URLWithStringByNormalizingPercentEscapes:aLink]; [tmpAttrs setObject:aLink forKey:NSLinkAttributeName]; tmpAttrStr = [keyValue templateAttributedStringValueWithAttributes:tmpAttrs]; Modified: trunk/bibdesk/BDSKTemplateTag.h =================================================================== --- trunk/bibdesk/BDSKTemplateTag.h 2010-09-27 11:29:48 UTC (rev 17151) +++ trunk/bibdesk/BDSKTemplateTag.h 2010-09-27 11:55:13 UTC (rev 17152) @@ -55,10 +55,12 @@ }; typedef NSInteger BDSKTemplateTagMatchType; +@class BDSKAttributeTemplate; -@interface BDSKTemplateTag : NSObject { -} +@interface BDSKTemplateTag : NSObject + - (BDSKTemplateTagType)type; + @end #pragma mark - @@ -77,14 +79,14 @@ @interface BDSKRichValueTemplateTag : BDSKValueTemplateTag { NSDictionary *attributes; - NSArray *linkTemplate; + BDSKAttributeTemplate *linkTemplate; } - (id)initWithKeyPath:(NSString *)aKeyPath attributes:(NSDictionary *)anAttributes; - (NSDictionary *)attributes; -- (NSArray *)linkTemplate; +- (BDSKAttributeTemplate *)linkTemplate; @end @@ -178,14 +180,17 @@ #pragma mark - @interface BDSKAttributeTemplate : NSObject { + NSArray *template; NSRange range; - NSArray *template; + Class attributeClass; } -- (id)initWithTemplate:(NSArray *)aTemplate range:(NSRange)aRange; +- (id)initWithTemplate:(NSArray *)aTemplate range:(NSRange)aRange attributeClass:(Class)aClass; +- (NSArray *)template; + - (NSRange)range; -- (NSArray *)template; +- (Class)attributeClass; @end Modified: trunk/bibdesk/BDSKTemplateTag.m =================================================================== --- trunk/bibdesk/BDSKTemplateTag.m 2010-09-27 11:29:48 UTC (rev 17151) +++ trunk/bibdesk/BDSKTemplateTag.m 2010-09-27 11:55:13 UTC (rev 17152) @@ -40,29 +40,27 @@ #import "BDSKTemplateParser.h" -static inline NSArray *templateForLink(id aLink) { - NSArray *template = nil; +static inline BDSKAttributeTemplate *copyTemplateForLink(id aLink, NSRange range) { + BDSKAttributeTemplate *linkTemplate = nil; if ([aLink isKindOfClass:[NSURL class]]) aLink = [[aLink absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; if ([aLink isKindOfClass:[NSString class]]) { - template = [BDSKTemplateParser arrayByParsingTemplateString:aLink]; - if ([template count] == 0 || ([template count] == 1 && [(BDSKTemplateTag *)[template lastObject] type] == BDSKTextTemplateTagType)) - template = nil; + NSArray *template = [BDSKTemplateParser arrayByParsingTemplateString:aLink]; + if ([template count] > 1 || ([template count] == 1 && [(BDSKTemplateTag *)[template lastObject] type] != BDSKTextTemplateTagType)) + linkTemplate = [[BDSKAttributeTemplate alloc] initWithTemplate:template range:range attributeClass:[aLink class]]; } - return template; + return linkTemplate; } static inline NSArray *copyTemplatesForLinksFromAttributedString(NSAttributedString *attrString) { NSRange range = NSMakeRange(0, 0); NSUInteger len = [attrString length]; NSMutableArray *templates = [[NSMutableArray alloc] init]; - NSArray *template; BDSKAttributeTemplate *linkTemplate; while (NSMaxRange(range) < len) { - template = templateForLink([attrString attribute:NSLinkAttributeName atIndex:NSMaxRange(range) longestEffectiveRange:&range inRange:NSMakeRange(NSMaxRange(range), len - NSMaxRange(range))]); - if (template) { - linkTemplate = [[BDSKAttributeTemplate alloc] initWithTemplate:template range:range]; + id aLink = [attrString attribute:NSLinkAttributeName atIndex:NSMaxRange(range) longestEffectiveRange:&range inRange:NSMakeRange(NSMaxRange(range), len - NSMaxRange(range))]; + if (linkTemplate = copyTemplateForLink(aLink, range)) { [templates addObject:linkTemplate]; [linkTemplate release]; } @@ -121,10 +119,10 @@ return attributes; } -- (NSArray *)linkTemplate { +- (BDSKAttributeTemplate *)linkTemplate { if (linkTemplate == nil) - linkTemplate = [templateForLink([attributes objectForKey:NSLinkAttributeName]) retain] ?: [[NSArray alloc] init]; - return [linkTemplate count] ? linkTemplate : nil; + linkTemplate = copyTemplateForLink([attributes objectForKey:NSLinkAttributeName], NSMakeRange(0, 0)) ?: [[BDSKAttributeTemplate alloc] init]; + return [linkTemplate template] ? linkTemplate : nil; } @end @@ -349,15 +347,19 @@ @implementation BDSKAttributeTemplate - -- (id)initWithTemplate:(NSArray *)aTemplate range:(NSRange)aRange { +- (id)initWithTemplate:(NSArray *)aTemplate range:(NSRange)aRange attributeClass:(Class)aClass { if (self = [super init]) { template = [aTemplate copy]; range = aRange; + attributeClass = aClass; } return self; } +- (id)init { + return [self initWithTemplate:nil range:NSMakeRange(0, 0) attributeClass:NULL]; +} + - (void)dealloc { BDSKDESTROY(template); [super dealloc]; @@ -371,4 +373,8 @@ return template; } +- (Class)attributeClass { + return attributeClass; +} + @end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |