forked from objcio/issue-5-textkit
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
146 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// | ||
// TKDHighlightingTextStorage.h | ||
// TextKitDemo | ||
// | ||
// Created by Max Seelemann on 29.09.13. | ||
// Copyright (c) 2013 Max Seelemann. All rights reserved. | ||
// | ||
|
||
#import <UIKit/UIKit.h> | ||
|
||
@interface TKDHighlightingTextStorage : NSTextStorage | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// | ||
// TKDHighlightingTextStorage.m | ||
// TextKitDemo | ||
// | ||
// Created by Max Seelemann on 29.09.13. | ||
// Copyright (c) 2013 Max Seelemann. All rights reserved. | ||
// | ||
|
||
#import "TKDHighlightingTextStorage.h" | ||
|
||
|
||
@implementation TKDHighlightingTextStorage | ||
{ | ||
NSTextStorage *_imp; | ||
} | ||
|
||
- (id)init | ||
{ | ||
self = [super init]; | ||
|
||
if (self) { | ||
_imp = [NSTextStorage new]; | ||
} | ||
|
||
return self; | ||
} | ||
|
||
|
||
#pragma mark - Reading Text | ||
|
||
- (NSString *)string | ||
{ | ||
return _imp.string; | ||
} | ||
|
||
- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range | ||
{ | ||
return [_imp attributesAtIndex:location effectiveRange:range]; | ||
} | ||
|
||
|
||
#pragma mark - Text Editing | ||
|
||
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str | ||
{ | ||
[_imp replaceCharactersInRange:range withString:str]; | ||
[self edited:NSTextStorageEditedCharacters range:range changeInLength:(NSInteger)str.length - (NSInteger)range.length]; | ||
} | ||
|
||
- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range | ||
{ | ||
[_imp setAttributes:attrs range:range]; | ||
[self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; | ||
} | ||
|
||
|
||
#pragma mark - Syntax highlighting | ||
|
||
- (void)processEditing | ||
{ | ||
[super processEditing]; | ||
|
||
|
||
// Regular expression matching all iWords -- first character i, followed by an uppercase alphabetic character, followed by at least one other character. Matches words like iPod, iPhone, etc. | ||
static NSRegularExpression *iExpression; | ||
iExpression = iExpression ?: [NSRegularExpression regularExpressionWithPattern:@"i[\\p{Alphabetic}&&\\p{Uppercase}][\\p{Alphabetic}]+" options:0 error:NULL]; | ||
|
||
|
||
// Clear text color of edited range | ||
NSRange paragaphRange = [self.string paragraphRangeForRange: self.editedRange]; | ||
[self removeAttribute:NSForegroundColorAttributeName range:paragaphRange]; | ||
|
||
// Find all iWords in range | ||
[iExpression enumerateMatchesInString:self.string options:0 range:paragaphRange usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { | ||
// Add red highlight color | ||
[self addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:result.range]; | ||
}]; | ||
|
||
|
||
// Note that we did change text attributes | ||
[self edited:NSTextStorageEditedAttributes range:paragaphRange changeInLength:0]; | ||
} | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
Lorem iPsum dolor sit amet, consectetur adipiscing iPod. Phasellus magna dolor, volutpat a iPsum et, molestie justo. Vestibulum sed augue malesuada, congue iWork sed, fringilla ligula. Sed aliquet iCloud vestibulum. Phasellus gravida elit ut ligula vulputate fringilla. Pellentesque sit amet dolor pulvinar, dictum eros non, suscipit purus. Aenean metus mi, sodales ut augue in, varius sagittis mi. Sed semper est vel placerat scelerisque. In hac habitasse platea dictumst. Mauris auctor accumsan sagittis. Etiam interdum ante in condimentum iaculis. Aliquam porta facilisis lorem in auctor. Nullam non tortor eget urna iaculis faucibus et in augue. Integer nec libero placerat magna rhoncus ultrices eu venenatis massa. Suspendisse ullamcorper molestie lorem eget consequat. | ||
|
||
Duis viverra, nibh vitae dapibus aliquet, dui sapien tristique enim, sit amet lacinia justo ligula sit amet arcu. Donec consequat, sapien nec varius placerat, lectus ante sollicitudin lorem, mattis dictum nisl diam id massa. Curabitur mattis turpis ac est cursus sagittis. Nunc in mattis mi, eu aliquet magna. Suspendisse arcu dolor, tincidunt nec eros in, dapibus auctor risus. Curabitur auctor sit amet eros sit amet imperdiet. Etiam et eros tempus, posuere justo ut, ultrices risus. Cras fringilla risus sapien, sit amet congue mauris fringilla quis. Mauris molestie tincidunt iaculis. Mauris nunc ante, faucibus et eros sed, imperdiet congue justo. Suspendisse euismod rhoncus sollicitudin. Maecenas non pretium nulla. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus magna dolor, volutpat a ipsum et, porttitor molestie justo. Vestibulum sed augue malesuada, congue magna sed, fringilla ligula. Sed aliquet porta vestibulum. Phasellus gravida elit ut ligula vulputate fringilla. Pellentesque sit amet dolor pulvinar, dictum eros non, suscipit purus. Aenean metus mi, sodales ut augue in, varius sagittis mi. Sed semper est vel placerat scelerisque. In hac habitasse platea dictumst. Mauris auctor accumsan sagittis. Etiam interdum ante in condimentum iaculis. Aliquam porta facilisis lorem in auctor. Nullam non tortor eget urna iaculis faucibus et in augue. Integer nec libero placerat magna rhoncus ultrices eu venenatis massa. Suspendisse ullamcorper molestie lorem eget consequat. | ||
|
||
Duis viverra, nibh vitae dapibus aliquet, dui sapien tristique enim, sit amet lacinia justo ligula sit amet arcu. Donec consequat, sapien nec varius placerat, lectus ante sollicitudin lorem, mattis dictum nisl diam id massa. Curabitur mattis turpis ac est cursus sagittis. Nunc in mattis mi, eu aliquet magna. Suspendisse arcu dolor, tincidunt nec eros in, dapibus auctor risus. Curabitur auctor sit amet eros sit amet imperdiet. Etiam et eros tempus, posuere justo ut, ultrices risus. Cras fringilla risus sapien, sit amet congue mauris fringilla quis. Mauris molestie tincidunt iaculis. Mauris nunc ante, faucibus et eros sed, imperdiet congue justo. Suspendisse euismod rhoncus sollicitudin. Maecenas non pretium nulla. |