From 482d93619680eb9ea191071041160f4d6d0aae62 Mon Sep 17 00:00:00 2001 From: iska Date: Thu, 10 May 2018 23:11:32 +0200 Subject: [PATCH] Add HTML-escaping category method for NSString Escapes HTML as described in: https://html.spec.whatwg.org/multipage/parsing.html#escapingString --- Sources/NSString+HTMLKit.m | 11 +++++++++++ Sources/include/NSString+HTMLKit.h | 7 +++++++ Tests/HTMLKitTests/HTMLStringCategoryTests.m | 17 +++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/Sources/NSString+HTMLKit.m b/Sources/NSString+HTMLKit.m index 2d37ac4..c65bc8f 100644 --- a/Sources/NSString+HTMLKit.m +++ b/Sources/NSString+HTMLKit.m @@ -58,4 +58,15 @@ NS_INLINE BOOL isHtmlWhitespaceChar(unichar c) return idx; } +- (NSString *)stringByEscapingForHTML +{ + NSMutableString *escaped = [self mutableCopy]; + [escaped replaceOccurrencesOfString:@"&" withString:@"&" options:0 range:NSMakeRange(0, escaped.length)]; + [escaped replaceOccurrencesOfString:@"0x00A0" withString:@" " options:0 range:NSMakeRange(0, escaped.length)]; + [escaped replaceOccurrencesOfString:@"\"" withString:@""" options:0 range:NSMakeRange(0, escaped.length)]; + [escaped replaceOccurrencesOfString:@"<" withString:@"<" options:0 range:NSMakeRange(0, escaped.length)]; + [escaped replaceOccurrencesOfString:@">" withString:@">" options:0 range:NSMakeRange(0, escaped.length)]; + return escaped; +} + @end diff --git a/Sources/include/NSString+HTMLKit.h b/Sources/include/NSString+HTMLKit.h index b73d0ad..cd532d2 100644 --- a/Sources/include/NSString+HTMLKit.h +++ b/Sources/include/NSString+HTMLKit.h @@ -48,6 +48,13 @@ NS_ASSUME_NONNULL_BEGIN */ - (NSUInteger)leadingHTMLWhitespaceLength; +/** +Escapes this string as specified in `https://html.spec.whatwg.org/multipage/parsing.html#escapingString` + + @return A copy of this string by HTML-escaping this stirng. + */ +- (NSString *)stringByEscapingForHTML; + @end NS_ASSUME_NONNULL_END diff --git a/Tests/HTMLKitTests/HTMLStringCategoryTests.m b/Tests/HTMLKitTests/HTMLStringCategoryTests.m index b5d5571..c66e422 100644 --- a/Tests/HTMLKitTests/HTMLStringCategoryTests.m +++ b/Tests/HTMLKitTests/HTMLStringCategoryTests.m @@ -8,6 +8,7 @@ #import #import "NSString+HTMLKit.h" +#import "HTMLDOM.h" @interface HTMLKitStringCategoryTests : XCTestCase @@ -79,4 +80,20 @@ XCTAssertEqual([@"\t\r\n\f\0 " leadingHTMLWhitespaceLength], 4); } +- (void)testStringByEscapingForHTML +{ + XCTAssertEqualObjects(@"".stringByEscapingForHTML, @""); + XCTAssertEqualObjects(@"&".stringByEscapingForHTML, @"&"); + XCTAssertEqualObjects(@"0x00A0".stringByEscapingForHTML, @" "); + XCTAssertEqualObjects(@"\"".stringByEscapingForHTML, @"""); + XCTAssertEqualObjects(@"<".stringByEscapingForHTML, @"<"); + XCTAssertEqualObjects(@">".stringByEscapingForHTML, @">"); + XCTAssertEqualObjects(@"&0x00A0\"<>".stringByEscapingForHTML, @"& "<>"); + + NSString *input = @"This is an email: John Do "; + NSString *escaped = input.stringByEscapingForHTML; + XCTAssertNotEqual(input, escaped); + XCTAssertEqualObjects(escaped, @"This is an <b>email</b>: John Do <john@do.com>"); +} + @end