Skip to content

Commit

Permalink
Added methods to work with paragraphs to DTCoreTextLayoutFrame.
Browse files Browse the repository at this point in the history
  • Loading branch information
odrobnik committed Oct 28, 2011
1 parent 95a966d commit e8ae622
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 0 deletions.
9 changes: 9 additions & 0 deletions Classes/DTCoreTextLayoutFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
DTCoreTextLayouter *_layouter;

NSArray *_lines;
NSArray *_paragraphRanges;

NSInteger tag;

NSArray *_textAttachments;
Expand All @@ -49,6 +51,11 @@
- (NSArray *)linesContainedInRect:(CGRect)rect; // lines that are fully contained inside of rect
- (DTCoreTextLayoutLine *)lineContainingIndex:(NSUInteger)index; // line that contains the string index

// working with Paragraphs
- (NSArray *)linesInParagraphAtIndex:(NSUInteger)index;
- (NSUInteger)paragraphIndexContainingStringIndex:(NSUInteger)stringIndex;
- (NSRange)paragraphRangeContainingStringRange:(NSRange)stringRange;

- (NSArray *)stringIndices;

- (NSArray *)textAttachments;
Expand All @@ -60,6 +67,8 @@
@property (assign, readonly) DTCoreTextLayouter *layouter;

@property (nonatomic, retain, readonly) NSArray *lines;
@property (nonatomic, retain, readonly) NSArray *paragraphRanges;

@property (nonatomic, assign) NSInteger tag;


Expand Down
100 changes: 100 additions & 0 deletions Classes/DTCoreTextLayoutFrame.m
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,10 @@ - (void)dealloc
CFRelease(_textFrame);
_textFrame = NULL;
}

[_lines release];
[_paragraphRanges release];

[_layouter release];

if (_framesetter)
Expand Down Expand Up @@ -670,6 +673,74 @@ - (DTCoreTextLayoutLine *)lineContainingIndex:(NSUInteger)index
return nil;
}

- (NSArray *)linesInParagraphAtIndex:(NSUInteger)index
{
NSArray *paragraphRanges = self.paragraphRanges;

NSAssert(index < [paragraphRanges count], @"index parameter out of range");

NSRange range = [[paragraphRanges objectAtIndex:index] rangeValue];

NSMutableArray *tmpArray = [NSMutableArray array];

// find lines that are in this range

BOOL insideParagraph = NO;

for (DTCoreTextLayoutLine *oneLine in self.lines)
{
if (NSLocationInRange([oneLine stringRange].location, range))
{
insideParagraph = YES;
[tmpArray addObject:oneLine];
}
else
{
if (insideParagraph)
{
// that means we left the range

break;
}
}
}

// return array only if there is something in it
if ([tmpArray count])
{
return tmpArray;
}
else
{
return nil;
}
}

#pragma mark Paragraphs
- (NSUInteger)paragraphIndexContainingStringIndex:(NSUInteger)stringIndex
{
for (NSValue *oneValue in self.paragraphRanges)
{
NSRange range = [oneValue rangeValue];

if (NSLocationInRange(stringIndex, range))
{
return [self.paragraphRanges indexOfObject:oneValue];
}
}

return NSNotFound;
}

- (NSRange)paragraphRangeContainingStringRange:(NSRange)stringRange
{
NSUInteger firstParagraphIndex = [self paragraphIndexContainingStringIndex:stringRange.location];
NSUInteger lastParagraphIndex = [self paragraphIndexContainingStringIndex:NSMaxRange(stringRange)-1];

return NSMakeRange(firstParagraphIndex, lastParagraphIndex - firstParagraphIndex + 1);
}

#pragma mark Corrections
- (void)correctAttachmentHeights
{
CGFloat downShiftSoFar = 0;
Expand All @@ -696,9 +767,38 @@ - (void)correctAttachmentHeights
}

#pragma mark Properties

// builds an array
- (NSArray *)paragraphRanges
{
if (!_paragraphRanges)
{
NSString *plainString = [self.layouter.attributedString string];

NSArray *paragraphs = [plainString componentsSeparatedByString:@"\n"];
NSRange range = NSMakeRange(0, 0);
NSMutableArray *tmpArray = [NSMutableArray array];

for (NSString *oneString in paragraphs)
{
range.length = [oneString length]+1;

NSValue *value = [NSValue valueWithRange:range];
[tmpArray addObject:value];

range.location += range.length;
}

_paragraphRanges = [tmpArray copy];
}

return _paragraphRanges;
}

@synthesize frame = _frame;
@synthesize layouter = _layouter;
@synthesize lines = _lines;
@synthesize paragraphRanges = _paragraphRanges;
@synthesize tag;

@end

0 comments on commit e8ae622

Please sign in to comment.