ios - nshtmltextdocumenttype - html in textview swift
iOS NSAttributedString a HTML (3)
Este es un tema complejo, y comenzaré con una respuesta más breve. Puede hacerme preguntas en los comentarios y ampliaré la respuesta según sea necesario.
También intentamos seguir la ruta de cadena atribuida, pero no fue adecuada para la edición completa de HTML. Muchos elementos simplemente no son compatibles, ya sea porque el convertidor no está completamente desarrollado, o estos elementos fueron considerados fuera del alcance de Apple. El análisis de la cadena atribuida no es lo suficientemente bueno, porque la cadena atribuida ya ha perdido la mayor parte de la riqueza del HTML cuando intenta recrearla.
En su lugar, usamos una vista web, cargamos el documento normalmente y habilitamos contentEditable
en el elemento del cuerpo. Lo que esto hace es permitir la edición del documento en su totalidad, limitado solo por WebKit. Al final, para recuperar el código HTML, deshabilitamos contentEditable
y tomamos document.outerHTML
para obtener un HTML completo como estaba antes, con los cambios realizados por el usuario.
No tome la decisión de implementar este método a la ligera. Es una solución algo compleja, pero ciertamente posible. Una vista web no es tan agradable como una vista de texto, pero puede ser, dado el masaje suficiente.
Ampliaré esta respuesta según sea necesario.
Tengo una cadena NSAttributed
(proveniente de HTML) que configuré para un 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;
}
Luego dejo que el usuario edite lo que quiere, y me gustaría convertirlo a HTML nuevamente, así que uso:
- (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];
}
Devuelve HTML, pero no es como lo quiero. A todo se le asigna un atributo de clase, y el CSS se coloca en la parte superior del documento. Cosas como las imágenes y los enlaces ni siquiera están incluidos en el HTML devuelto y probablemente hay muchos más problemas.
¿Hay una mejor manera de obtener HTML de una NSAttributedString
? O, ¿hay alguna manera de analizar la NSAttributedString
y escribir mi propio HTML?
Puede ser que puedas mirar ese repositorio: https://github.com/IdeasOnCanvas/Ashton
hay 2 clases interesantes:
AshtonHTMLReader.h
- (NSAttributedString *)attributedStringFromHTMLString:(NSString *)htmlString;
Y el escritor:
AshtonHTMLWriter.h
- (NSString *)HTMLStringFromAttributedString:(NSAttributedString *)input;
El html generado no es muy bueno, pero si intentas mostrarlo en una vista de uiweb, se ve bastante bien.
Idea simple para la imagen: codifíquela con base64 y colóquela directamente en una etiqueta <img> con el marco derecho.
Es feo pero funciona => He utilizado este proceso para crear y editar un archivo html hace unos meses.
También tuve que convertir una NSAtttributedString a HTML en uno de mis proyectos. El código para hacer esto es el siguiente
//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);