From a8bd15e9b46ac61668476e8d84f12768c1bd8d14 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Tue, 26 Dec 2017 16:17:57 -0800 Subject: [PATCH] =?UTF-8?q?Add=20method=20to=20convert=20HTML=20to=20plain?= =?UTF-8?q?=20text=20suitable=20for=20copying=20to=20text-based=20apps.=20?= =?UTF-8?q?It=20could=20be=20much=20improved,=20but=20it=E2=80=99s=20bette?= =?UTF-8?q?r=20than=20nothing=20for=20right=20now.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Frameworks/RSCore/RSCore/NSString+RSCore.h | 1 + Frameworks/RSCore/RSCore/NSString+RSCore.m | 43 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/Frameworks/RSCore/RSCore/NSString+RSCore.h b/Frameworks/RSCore/RSCore/NSString+RSCore.h index 1f8e9354c..1a454fa89 100755 --- a/Frameworks/RSCore/RSCore/NSString+RSCore.h +++ b/Frameworks/RSCore/RSCore/NSString+RSCore.h @@ -59,6 +59,7 @@ typedef struct { - (NSString *)rs_stringByStrippingSuffix:(NSString *)suffix caseSensitive:(BOOL)caseSensitive; - (NSString *)rs_stringByStrippingHTML:(NSUInteger)maxCharacters; +- (NSString *)rs_stringByConvertingToPlainText; /*Filename from path, file URL string, or external URL string.*/ diff --git a/Frameworks/RSCore/RSCore/NSString+RSCore.m b/Frameworks/RSCore/RSCore/NSString+RSCore.m index c28a7e9c0..9e2ed073d 100755 --- a/Frameworks/RSCore/RSCore/NSString+RSCore.m +++ b/Frameworks/RSCore/RSCore/NSString+RSCore.m @@ -301,6 +301,49 @@ NSString *RSStringReplaceAll(NSString *stringToSearch, NSString *searchFor, NSSt return (__bridge_transfer NSString *)s; } +- (NSString *)rs_stringByConvertingToPlainText { + + if (![self containsString:@"<"]) { + return self; + } + + NSMutableString *preflightedCopy = [self mutableCopy]; + [preflightedCopy replaceOccurrencesOfString:@"
" withString:@"\n\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"
" withString:@"\n\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"

" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"

" withString:@"\n\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"
" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"
" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"
" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"
" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"
" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + [preflightedCopy replaceOccurrencesOfString:@"" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, preflightedCopy.length)]; + + CFMutableStringRef s = CFStringCreateMutable(kCFAllocatorDefault, (CFIndex)preflightedCopy.length); + NSUInteger level = 0; + + for (NSUInteger i = 0; i < preflightedCopy.length; i++) { + + unichar ch = [preflightedCopy characterAtIndex:i]; + + if (ch == '<') { + level++; + } + else if (ch == '>') { + level--; + } + else if (level == 0) { + CFStringAppendCharacters(s, &ch, 1); + } + } + + NSMutableString *plainTextString = [(__bridge_transfer NSString *)s mutableCopy]; + while ([plainTextString rangeOfString:@"\n\n\n"].location != NSNotFound) { + [plainTextString replaceOccurrencesOfString:@"\n\n\n" withString:@"\n\n" options:NSLiteralSearch range:NSMakeRange(0, plainTextString.length)]; + } + + return plainTextString; +} - (NSString *)rs_filename {