| 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){ |
|---|
| | 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 | |
|---|