Convertir HTML a texto sin formato en Swift

Resuelto Zaid Syed asked hace 54 años • 9 respuestas

Estoy trabajando en una aplicación simple de lectura de RSS como proyecto para principiantes en Xcode. Actualmente lo tengo configurado para que analice el feed, coloque el título, la fecha de publicación, la descripción y el contenido y lo muestre en un WebView.

Recientemente decidí mostrar la descripción (o una versión truncada del contenido) en el TableView utilizado para seleccionar una publicación. Sin embargo, al hacerlo:

cell.textLabel?.text = item.title?.uppercaseString
cell.detailTextLabel?.text = item.itemDescription //.itemDescription is a String

Muestra el HTML sin formato de la publicación.

Me gustaría saber cómo convertir el HTML en texto sin formato solo para la UILabel detallada de TableView.

¡Gracias!

Zaid Syed avatar Jan 01 '70 08:01 Zaid Syed
Aceptado

Puede agregar esta extensión para convertir su código html en una cadena normal:

editar/actualizar:

Discusión No se debe llamar al importador de HTML desde un hilo en segundo plano (es decir, el diccionario de opciones incluye documentType con un valor de html). Intentará sincronizarse con el hilo principal, fallará y se agotará el tiempo de espera. Llamarlo desde el hilo principal funciona (pero aún puede expirar si el HTML contiene referencias a recursos externos, lo que debe evitarse a toda costa). El mecanismo de importación de HTML está pensado para implementar algo como Markdown (es decir, estilos de texto, colores, etc.), no para la importación de HTML general.

Xcode 11.4 • Rápido 5.2

extension Data {
    var html2AttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("error:", error)
            return  nil
        }
    }
    var html2String: String { html2AttributedString?.string ?? "" }
}

extension StringProtocol {
    var html2AttributedString: NSAttributedString? {
        Data(utf8).html2AttributedString
    }
    var html2String: String {
        html2AttributedString?.string ?? ""
    }
}

cell.detailTextLabel?.text = item.itemDescription.html2String
Leo Dabus avatar Jan 25 '2015 02:01 Leo Dabus

Rápido 4, Xcode 9

extension String {
    
    var utfData: Data {
        return Data(utf8)
    }
    
    var attributedHtmlString: NSAttributedString? {
        
        do {
            return try NSAttributedString(data: utfData, options: [
              .documentType: NSAttributedString.DocumentType.html,
              .characterEncoding: String.Encoding.utf8.rawValue
            ], 
            documentAttributes: nil)
        } catch {
            print("Error:", error)
            return nil
        }
    }
}

extension UILabel {
   func setAttributedHtmlText(_ html: String) {
      if let attributedText = html.attributedHtmlString {
         self.attributedText = attributedText
      } 
   }
}
Suhit Patil avatar Sep 12 '2017 12:09 Suhit Patil