Skip to content
This repository has been archived by the owner on Aug 10, 2024. It is now read-only.

Commit

Permalink
Merge pull request #65 from Wevah/entity-fix
Browse files Browse the repository at this point in the history
Re-encode special XML characters that aren't part of tags
  • Loading branch information
vincode-io authored Oct 6, 2020
2 parents 6c8e735 + 3d8a82d commit 21d57ff
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 1 deletion.
3 changes: 3 additions & 0 deletions Sources/ObjC/NSString+RSParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ NS_ASSUME_NONNULL_BEGIN

- (NSString *)rsparser_stringByDecodingHTMLEntities;

/// Returns a copy of \c self with <, >, and & entity-encoded.
@property (readonly, copy) NSString *rsparser_stringByEncodingRequiredEntities;

- (NSString *)rsparser_md5Hash;

- (BOOL)rsparser_contains:(NSString *)s;
Expand Down
25 changes: 25 additions & 0 deletions Sources/ObjC/NSString+RSParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,31 @@ - (NSString * _Nullable)rs_stringByDecodingEntity {
return nil;
}

- (NSString *)rsparser_stringByEncodingRequiredEntities {
NSMutableString *result = [NSMutableString string];

for (NSUInteger i = 0; i < self.length; ++i) {
unichar c = [self characterAtIndex:i];

switch (c) {
case '<':
[result appendString:@"&lt;"];
break;
case '>':
[result appendString:@"&gt;"];
break;
case '&':
[result appendString:@"&amp;"];
break;
default:
[result appendFormat:@"%C", c];
break;
}
}

return [result copy];
}

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (NSData *)_rsparser_md5HashData {
Expand Down
4 changes: 3 additions & 1 deletion Sources/ObjC/RSAtomParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,9 @@ - (void)saxParser:(RSSAXParser *)SAXParser XMLCharactersFound:(const unsigned ch
if (s == nil) {
return;
}
[self.xhtmlString appendString:[[NSString alloc] initWithBytesNoCopy:(void *)characters length:length encoding:NSUTF8StringEncoding freeWhenDone:NO]];
// libxml decodes all entities; we need to re-encode certain characters
// (<, >, and &) when inside XHTML text content.
[self.xhtmlString appendString:s.rsparser_stringByEncodingRequiredEntities];
}
}

Expand Down

0 comments on commit 21d57ff

Please sign in to comment.