Подтвердить что ты не робот

IOS NSAttributedString для 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-код?

4b9b3361

Ответ 1

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

существует 2 интересных класса:

AshtonHTMLReader.h

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

И писатель:

AshtonHTMLWriter.h

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

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

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

Это уродливо, но он работает = > Я использовал этот процесс для создания и редактирования некоторого html файла несколько месяцев назад.

Ответ 2

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

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

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

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

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

Ответ 3

Мне также пришлось преобразовать 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);

Ответ 4

У меня есть хороший способ конвертировать NSAttributedString в строку HTML.

1) Возьмите UIWebView и UITextView.

2) Установите строку Attributed в WebView.

[webView loadHTMLString:[yourAttributedString stringByReplacingOccurrencesOfString:@"\n" withString:@"<br/>"] baseURL:nil];

3) Получить строку HTML из UIWebView.

NSString *strExclusion = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];