Ухудшение цвета NSAttributedString в HTML в NSAttributedString

У меня есть редактор форматированного текста, в котором пользователь может редактировать шрифт, цвет и т. Д. Модель хранит эту информацию в памяти как экземпляр NSAttributedString. Когда я хочу сохранить эту информацию и записать на диск, я конвертирую атрибутивную строку в html с помощью следующей функции:

func attributedStringToHtml(attributedString: NSAttributedString) -> String {
    var ret = ""
    do {
        let htmlData = try attributedString.data(from: NSRange( location: 0, length: attributedString.length), documentAttributes: [.documentType: NSAttributedString.DocumentType.html])
        ret =  String.init(data: htmlData, encoding: String.Encoding.utf8)!
    } catch { print("error:", error) }
    return ret
}

и чтобы вытащить данные с диска обратно в экземпляр NSAttributedString, я использую:

func htmlToAttributedString(htmlString: String) -> NSAttributedString {
    return  NSAttributedString.init(html: htmlString.data(using: String.Encoding.utf8)!, documentAttributes: nil)!
}

Проблема возникает при многократном циклическом переключении этих функций, а именно:

сохранение -> загрузка -> сохранение -> загрузка -> сохранение -> загрузка.

После каждого цикла загрузки сохраненный цвет становится темнее и темнее. Я считаю, что это связано с преобразованием цветовых пространств?

Этого не происходит в macOS 10.13. Скопируйте и вставьте это на игровую площадку в качестве примера того, что происходит:

import AppKit
import PlaygroundSupport

func htmlToAttributedString(htmlString: String) -> NSAttributedString {
    return  NSAttributedString.init(html: htmlString.data(using: String.Encoding.utf8)!, documentAttributes: nil)!
    }

func attributedStringToHtml(attributedString: NSAttributedString) -> String {
    var ret = ""
    do {
        let htmlData = try attributedString.data(from: NSRange( location: 0, length: attributedString.length), documentAttributes: [.documentType: NSAttributedString.DocumentType.html])
        ret =  String.init(data: htmlData, encoding: String.Encoding.utf8)!
    } catch { 
        print("error:", error) 
    }
    return ret
}

let initialHtmlString = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\n<title></title>\n<meta name=\"Generator\" content=\"Cocoa HTML Writer\">\n<meta name=\"CocoaVersion\" content=\"1671.5\">\n<style type=\"text/css\">\np.p1 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; line-height: 16.0px; font: 14.0px Helvetica; color: #FF0000; -webkit-text-stroke: #000000}\nspan.s1 {font-kerning: none}\n</style>\n</head>\n<body>\n<p class=\"p1\"><span class=\"s1\">Double-click to edit this text</span></p>\n</body>\n</html>\n"

var attributedString = htmlToAttributedString(htmlString: initialHtmlString)
var backToHtml = attributedStringToHtml(attributedString: attributedString)
var backToAttributedString = htmlToAttributedString(htmlString: backToHtml)
var backToHtmlAgain = attributedStringToHtml(attributedString: backToAttributedString)

print(backToHtmlAgain) // notice the html color value is now f6000b

person NSCaleb    schedule 18.07.2019    source источник
comment
Для этого существует известная ошибка на странице openradar.me/46115233.   -  person Stickley    schedule 19.07.2019


Ответы (1)


мне удалось обойти это, используя NSAttributedString.DocumentType.rtf вместо html

person NSCaleb    schedule 19.07.2019
comment
Можете уточнить подробнее? Например, как выглядела полезная нагрузка, которую вы интерпретировали как RTF? AKA какое значение initialHtmlString? - person Isaaс Weisberg; 14.07.2020