Vous avez besoin de passer l'un des NSAttributedString DocumentType options:
HTML (Hypertext Markup Language) dans le document.
static let html: NSAttributedString.DocumentType
Documents en texte brut.
static let plain: NSAttributedString.DocumentType
Rich text format de document.
static let rtf: NSAttributedString.DocumentType
Format de texte enrichi avec des pièces jointes de documents.
static let rtfd: NSAttributedString.DocumentType
Dans ce cas, vous aurez besoin de passer le premier (html) NSAttributedString.DocumentType.html
Ainsi, l'extension mise à jour de Swift 4 devrait ressembler à ceci:
extension NSAttributedString {
convenience init(data: Data, documentType: DocumentType, encoding: String.Encoding = .utf8) throws {
try self.init(data: data,
options: [.documentType: documentType,
.characterEncoding: encoding.rawValue],
documentAttributes: nil)
}
convenience init(html data: Data) throws {
try self.init(data: data, documentType: .html)
}
convenience init(txt data: Data) throws {
try self.init(data: data, documentType: .plain)
}
convenience init(rtf data: Data) throws {
try self.init(data: data, documentType: .rtf)
}
convenience init(rtfd data: Data) throws {
try self.init(data: data, documentType: .rtfd)
}
}
extension StringProtocol {
var data: Data { return Data(utf8) }
var htmlToAttributedString: NSAttributedString? {
do {
return try .init(html: data)
} catch {
print("html error:", error)
return nil
}
}
var htmlDataToString: String? {
return htmlToAttributedString?.string
}
}
extension Data {
var htmlToAttributedString: NSAttributedString? {
do {
return try .init(html: self)
} catch {
print("html error:", error)
return nil
}
}
}
Aire De Jeux De Tests
let htmlString = "<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F; font-weight: Bold; font-size: 32}</style><span id=\"red\" >Red</span><span id=\"green\" > Green </span><span id=\"blue\">Blue</span>"
let htmlData = Data(htmlString.utf8)
htmlString.htmlToAttributedString
htmlData.htmlToAttributedString
Discussion Le code HTML de l'importateur ne devrait pas être appelée à partir d'un arrière-plan
thread (qui est, les options dictionnaire comprend documentType avec un
la valeur html). Il va essayer de se synchroniser avec le thread principal, échouer,
et le temps. L'appelant depuis le thread principal fonctionne (mais peut encore
le temps si le code HTML contient des références à des ressources externes, qui
devrait être évitée à tous les frais). L'importation HTML mécanisme est destiné
pour la mise en œuvre de quelque chose comme markdown (qui est, les styles de texte,
les couleurs, etc), et non pas général d'importation HTML