iOS NSAttributedString to HTML

У меня есть NSAttributed строка (из HTML), которую я установил для UITextView,

- (void)setHtml:(NSString *)html {

    NSData *htmlData = [html dataUsingEncoding:NSUTF8StringEncoding];

    // Create the HTML string
    NSDictionary *importParams = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
    NSError *error = nil;
    self.htmlString = [[NSAttributedString alloc] initWithData:htmlData options:importParams documentAttributes:NULL error:&error];

    self.editorView.attributedText = self.htmlString;

}

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

- (NSString *)getHTML {
    NSDictionary *exportParams = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
    NSData *htmlData = [self.editorView.attributedText dataFromRange:NSMakeRange(0, self.editorView.attributedText.length) documentAttributes:exportParams error:nil];
    return [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
}

Он возвращает HTML, но это не так, как я хочу. Все дается атрибут класса, и CSS он помещен в верхней части документа. Такие вещи, как изображения и ссылки, даже не включены в возвращаемый HTML и, вероятно, вызывают больше проблем.

Есть ли лучший способ получить HTML от NSAttributedString ? Или есть способ, которым я мог бы разобрать NSAttributedString и написать свой собственный HTML?

3 ответа

Может быть, вы можете посмотреть на этот репозиторий: https://github.com/IdeasOnCanvas/Ashton

Есть 2 интересных класса:

AshtonHTMLReader.h

 - (NSAttributedString *)attributedStringFromHTMLString:(NSString *)htmlString;

И писатель

AshtonHTMLWriter.h

- (NSString *)HTMLStringFromAttributedString:(NSAttributedString *)input;

Сгенерированный html не очень хорош, но если вы попытаетесь отобразить его в uiwebview, он выглядит довольно хорошо.

Простая идея для изображения: закодируйте его с помощью base64 и поместите его непосредственно в тег с нужным кадром.

Это некрасиво, но работает => Я использовал этот процесс для создания и редактирования некоторых HTML-файлов несколько месяцев назад

Это сложный вопрос, и я начну с более короткого ответа. Вы можете задавать мне вопросы в комментариях, и я буду расширять ответ по мере необходимости.

Мы также попытались пойти по пути атрибуции строк, но обнаружили, что он не подходит для полного редактирования HTML. Многие элементы просто не поддерживаются, либо потому, что конвертер не полностью разработан, либо эти элементы были сочтены Apple вне сферы применения. Разбор атрибутивной строки не достаточно хорош, потому что атрибутивная строка уже потеряла большую часть богатства HTML к тому времени, когда вы пытаетесь воссоздать ее.

Вместо этого мы используем веб-просмотр, загружаем документ как обычно и включаем contentEditable на элементе тела. Это позволяет редактировать документ в полном объеме, ограниченный только WebKit. В конце, чтобы восстановить HTML, мы отключаем contentEditable и взять document.outerHTML чтобы получить весь HTML, как это было раньше, с изменениями, внесенными пользователем.

Не принимайте решение легко реализовать этот метод. Это несколько сложное решение, но, безусловно, возможно. Веб-просмотр не так хорош, как просмотр текста, но может быть и при достаточном массаже.

Я буду расширять этот ответ по мере необходимости.

Мне также пришлось преобразовать NSAtttributedString в HTML в одном из моих проектов. Код для этого выглядит следующим образом

//self.attributed String is the attributedString 
NSDictionary *documentAttributes = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSData *htmlData = [self.attributedString dataFromRange:NSMakeRange(0, self.attributedString.length) documentAttributes:documentAttributes error:NULL];
NSString *htmlString = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
NSLog(@"%@", htmlString);
Другие вопросы по тегам