Adium

Changeset 24380

Show
Ignore:
Timestamp:
07/16/2008 04:31:13 PM (6 months ago)
Author:
sholt
Message:

Cleaning up the code a bit.

  • Removed a few more unnecessary local variables
  • Abstracted out the balanced enclosure finding code to a private method for future cleanup.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Frameworks/AutoHyperlinks Framework/Source/AHHyperlinkScanner.m

    r24362 r24380  
    3535 
    3636@interface AHHyperlinkScanner (PRIVATE) 
     37- (NSRange)_longestBalancedEnclosureInRange:(NSRange)inRange; 
    3738- (BOOL)_scanString:(NSString *)inString upToCharactersFromSet:(NSCharacterSet *)inCharSet intoRange:(NSRange *)outRangeRef fromIndex:(unsigned long *)idx; 
    3839- (BOOL)_scanString:(NSString *)inString charactersFromSet:(NSCharacterSet *)inCharSet intoRange:(NSRange *)outRangeRef fromIndex:(unsigned long *)idx; 
     
    244245{ 
    245246        NSRange scannedRange; 
     247        unsigned long scannedLocation = m_scanLocation; 
     248         
    246249    // scan upto the next whitespace char so that we don't unnecessarity confuse flex 
    247250    // otherwise we end up validating urls that look like this "http://www.adiumx.com/ <--cool" 
    248         unsigned long scannedLocation = m_scanLocation; 
    249251        [self _scanString:m_scanString charactersFromSet:startSet intoRange:nil fromIndex:&scannedLocation]; 
     252         
     253        // main scanning loop 
    250254        while([self _scanString:m_scanString upToCharactersFromSet:skipSet intoRange:&scannedRange fromIndex:&scannedLocation]) { 
     255         
    251256                unsigned long _scanLoc = scannedLocation; 
     257                 
     258                // Check for and filter  enclosures.  We can't add (, [, etc. to the skipSet as they may be in a URI 
    252259                if([enclosureSet characterIsMember:[m_scanString characterAtIndex:scannedRange.location]]){ 
    253260                        unsigned long encIdx = [enclosureStartArray indexOfObject:[m_scanString substringWithRange:NSMakeRange(scannedRange.location, 1)]]; 
     
    262269                } 
    263270                if(!scannedRange.length) break; 
    264                  
    265                 unsigned long localStringLen = scannedRange.length; 
    266                 unsigned long finalStringLen = localStringLen; 
    267                  
     271                                 
    268272                // Find balanced enclosure chars 
    269                 NSMutableArray  *enclosureStack = nil, *enclosureArray = nil; 
    270                 NSString  *matchChar = nil; 
    271                 NSDictionary *encDict; 
    272                  
    273                 unsigned long encScanLocation = scannedRange.location; 
    274                  
    275                 while(encScanLocation < finalStringLen + scannedRange.location) { 
    276                         [self _scanString:m_scanString upToCharactersFromSet:enclosureSet intoRange:nil fromIndex:&encScanLocation]; 
    277                          
    278                         if(encScanLocation >= (scannedRange.location + scannedRange.length)) break; 
    279                          
    280                         matchChar = [m_scanString substringWithRange:NSMakeRange(encScanLocation, 1)]; 
    281                          
    282                         if([enclosureStartArray containsObject:matchChar]) { 
    283                                 encDict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithUnsignedLong:encScanLocation], matchChar, nil] 
    284                                                                                                           forKeys:encKeys]; 
    285                                 if(!enclosureStack) enclosureStack = [NSMutableArray arrayWithCapacity:1]; 
    286                                 [enclosureStack addObject:encDict]; 
    287                         }else if([enclosureStopArray containsObject:matchChar]) { 
    288                                 NSEnumerator *encEnumerator = [enclosureStack objectEnumerator]; 
    289                                 while ((encDict = [encEnumerator nextObject])) { 
    290                                         unsigned long encTagIndex = [(NSNumber *)[encDict objectForKey:ENC_INDEX_KEY] unsignedLongValue]; 
    291                                         unsigned long encStartIndex = [enclosureStartArray indexOfObjectIdenticalTo:[encDict objectForKey:ENC_CHAR_KEY]]; 
    292                                         if([enclosureStopArray indexOfObjectIdenticalTo:matchChar] == encStartIndex) { 
    293                                                 NSRange encRange = NSMakeRange(encTagIndex, encScanLocation - encTagIndex); 
    294                                                 if(!enclosureStack) enclosureStack = [NSMutableArray arrayWithCapacity:1]; 
    295                                                 if(!enclosureArray) enclosureArray = [NSMutableArray arrayWithCapacity:1]; 
    296                                                 [enclosureStack removeObject:encDict]; 
    297                                                 [enclosureArray addObject:NSStringFromRange(encRange)]; 
    298                                                 break; 
    299                                         } 
    300                                 } 
    301                         } 
    302                         if(encScanLocation < finalStringLen + scannedRange.location) 
    303                                 encScanLocation++; 
    304                 } 
    305                 NSRange lastEnclosureRange = NSMakeRange(0, 0); 
    306                 if(enclosureArray && [enclosureArray count]) lastEnclosureRange = NSRangeFromString([enclosureArray lastObject]); 
    307                 while (finalStringLen > 2 && [endSet characterIsMember:[m_scanString characterAtIndex:(scannedRange.location + finalStringLen - 1)]]) { 
    308                         if((lastEnclosureRange.location + lastEnclosureRange.length + 1) < finalStringLen){ 
     273                NSRange longestEnclosure = [self _longestBalancedEnclosureInRange:scannedRange]; 
     274                while (scannedRange.length > 2 && [endSet characterIsMember:[m_scanString characterAtIndex:(scannedRange.location + scannedRange.length - 1)]]) { 
     275                        if((longestEnclosure.location + longestEnclosure.length) < scannedRange.length){ 
    309276                                scannedRange.length--; 
    310                                 finalStringLen--; 
    311277                        }else break; 
    312278                } 
     
    317283                AH_URI_VERIFICATION_STATUS       validStatus; 
    318284                NSString                                        *_scanString = [m_scanString substringWithRange:scannedRange]; 
    319         if((finalStringLen > 0) && [[self class] isStringValidURI:_scanString usingStrict:m_strictChecking fromIndex:&m_scanLocation withStatus:&validStatus]){ 
     285        if(_scanString && [[self class] isStringValidURI:_scanString usingStrict:m_strictChecking fromIndex:&m_scanLocation withStatus:&validStatus]){ 
    320286            AHMarkedHyperlink   *markedLink; 
    321287                         
     
    365331                                m_scanLocation--; 
    366332                }else{ 
    367                         m_scanLocation += finalStringLen
     333                        m_scanLocation += scannedRange.length
    368334                        if(m_scanLocation > m_scanStringLength) 
    369335                                m_scanLocation--; 
     
    436402 
    437403#pragma mark Below Here There Be Private Methods 
     404 
     405- (NSRange)_longestBalancedEnclosureInRange:(NSRange)inRange 
     406{ 
     407        NSMutableArray  *enclosureStack = nil, *enclosureArray = nil; 
     408        NSString  *matchChar = nil; 
     409        NSDictionary *encDict; 
     410        unsigned long encScanLocation = inRange.location; 
     411         
     412        while(encScanLocation < inRange.length + inRange.location) { 
     413                [self _scanString:m_scanString upToCharactersFromSet:enclosureSet intoRange:nil fromIndex:&encScanLocation]; 
     414                         
     415                if(encScanLocation >= (inRange.location + inRange.length)) break; 
     416                         
     417                matchChar = [m_scanString substringWithRange:NSMakeRange(encScanLocation, 1)]; 
     418                         
     419                if([enclosureStartArray containsObject:matchChar]) { 
     420                        encDict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithUnsignedLong:encScanLocation], matchChar, nil] 
     421                                                                                                forKeys:encKeys]; 
     422                        if(!enclosureStack) enclosureStack = [NSMutableArray arrayWithCapacity:1]; 
     423                        [enclosureStack addObject:encDict]; 
     424                }else if([enclosureStopArray containsObject:matchChar]) { 
     425                        NSEnumerator *encEnumerator = [enclosureStack objectEnumerator]; 
     426                        while ((encDict = [encEnumerator nextObject])) { 
     427                                unsigned long encTagIndex = [(NSNumber *)[encDict objectForKey:ENC_INDEX_KEY] unsignedLongValue]; 
     428                                unsigned long encStartIndex = [enclosureStartArray indexOfObjectIdenticalTo:[encDict objectForKey:ENC_CHAR_KEY]]; 
     429                                if([enclosureStopArray indexOfObjectIdenticalTo:matchChar] == encStartIndex) { 
     430                                        NSRange encRange = NSMakeRange(encTagIndex, encScanLocation - encTagIndex + 1); 
     431                                        if(!enclosureStack) enclosureStack = [NSMutableArray arrayWithCapacity:1]; 
     432                                        if(!enclosureArray) enclosureArray = [NSMutableArray arrayWithCapacity:1]; 
     433                                        [enclosureStack removeObject:encDict]; 
     434                                        [enclosureArray addObject:NSStringFromRange(encRange)]; 
     435                                        break; 
     436                                } 
     437                        } 
     438                } 
     439                if(encScanLocation < inRange.length + inRange.location) 
     440                        encScanLocation++; 
     441        } 
     442        return (enclosureArray && [enclosureArray count])? NSRangeFromString([enclosureArray lastObject]) : NSMakeRange(0, 0); 
     443} 
     444 
    438445// functional replacement for -[NSScanner scanUpToCharactersFromSet:intoString:] 
    439446- (BOOL)_scanString:(NSString *)inString upToCharactersFromSet:(NSCharacterSet *)inCharSet intoRange:(NSRange *)outRangeRef fromIndex:(unsigned long *)idx