Reputation: 943
I am trying to set the text of a label to a string that I pull from a text file on a server. The text in this file is in an HTML format. Is there a way to read the text from this file and display it in my label while keeping the HTML format?
For example if in the file there is a line such as <b>hello world!</b>
then the label would show hello world!
in bold.
Upvotes: 1
Views: 451
Reputation: 5343
NSAttributedText
is what you are looking for!
Here is the implementation
NSData *htmlData = [NSData dataWithContentsOfURL:url];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:htmlData options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil];
[yourLabel setAttributedText:attrString];
Upvotes: 1
Reputation: 13783
Google has a perfect library for decoding HTML entities.
You can convert html to plain text using another perfect class that extends google's implementation.
If you want a Swift implementation you can create a String extension:
extension String {
static func stringByRemovingHTMLEntities(string: String) -> String {
var result = string
result = result.stringByReplacingOccurrencesOfString("<p>", withString: "\n\n", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("</p>", withString: "", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("–", withString: "-", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("“", withString: "\"", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("”", withString: "\"", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("<i>", withString: "", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("</i>", withString: "", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("&", withString: "&", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString(">", withString: ">", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("'", withString: "'", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("/", withString: "/", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString(""", withString: "\"", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("<", withString: "<", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("<", withString: "<", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString(">", withString: ">", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("&", withString: "&", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("<pre><code>", withString: "", options: .CaseInsensitiveSearch, range: nil)
result = result.stringByReplacingOccurrencesOfString("</code></pre>", withString: "", options: .CaseInsensitiveSearch, range: nil)
var regex = NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>.*?</a>",
options: NSRegularExpressionOptions.CaseInsensitive, error: nil)
result = regex!.stringByReplacingMatchesInString(result, options: nil, range: NSMakeRange(0, result.utf16Count), withTemplate: "$1")
return result
}
func stringByDecodingHTMLEntities() -> String? {
var r: NSRange
let pattern = "<[^>]+>"
var s = self.stringByDecodingHTMLEscapeCharacters()
r = (s as NSString).rangeOfString(pattern, options: NSStringCompareOptions.RegularExpressionSearch)
while (r.location != NSNotFound) {
s = (s as NSString).stringByReplacingCharactersInRange(r, withString: " ")
r = (s as NSString).rangeOfString(pattern, options: NSStringCompareOptions.RegularExpressionSearch)
}
return s.stringByReplacingOccurrencesOfString(" ", withString: " ")
}
func stringByDecodingHTMLEscapeCharacters() -> String {
var s = self.stringByReplacingOccurrencesOfString(""", withString: "\"")
s = s.stringByReplacingOccurrencesOfString("'", withString: "'")
s = s.stringByReplacingOccurrencesOfString("&", withString: "&")
s = s.stringByReplacingOccurrencesOfString("<", withString: "<")
s = s.stringByReplacingOccurrencesOfString(">", withString: ">")
s = s.stringByReplacingOccurrencesOfString("'", withString: "'")
s = s.stringByReplacingOccurrencesOfString("&ldquot;", withString: "\"")
s = s.stringByReplacingOccurrencesOfString("&rdquot;", withString: "\"")
s = s.stringByReplacingOccurrencesOfString(" ", withString: " ")
s = s.stringByReplacingOccurrencesOfString("á", withString: "á")
s = s.stringByReplacingOccurrencesOfString("é", withString: "é")
s = s.stringByReplacingOccurrencesOfString("í", withString: "í")
s = s.stringByReplacingOccurrencesOfString("ó", withString: "ó")
s = s.stringByReplacingOccurrencesOfString("ú", withString: "ú")
s = s.stringByReplacingOccurrencesOfString("ñ", withString: "ñ")
s = s.stringByReplacingOccurrencesOfString("’", withString: "'")
return s
}
}
Upvotes: 0