[Swift]Conversion NSAttributedString <=> NSData

2»

Réponses

  • AliGatorAliGator Membre, Modérateur
    février 2016 modifié #32

    Oui, un petit entête est négligeable sur un texte de 500 mots, mais sur un texte de 50 ou même de 20 mots ? Imagine qu'il s'agisse d'un quiz style Trivial Pursuit avec des milliers de questions courtes.
     
    "En quelle année s'est déroulée la bataille de Marignan ?" (11 mots)
    "1286" (1 mot)
    "1515" (1 mot)
    "1674" (1 mot)
     
    "Où s'est déroulée la bataille de Marignan ?" (9 mots)
    "Du coté de Milan" (4 mots)
    "A Chartres" (2 mots)
    "Sur la frontière espagnole" (4 mots)
     
    "Qui a gagné la bataille de Marignan ?" (8 mots)
    "Les Prussiens" (2 mots)
    "Les Français" (2 mots)
    "Les Mercenaires Suisses" (3 mots)
     
    Si le petit entête négligeable se retrouve avec chaque question/réponse, il vas prendre une place colossale par rapport aux données utiles.

    Heu si tu stockes tes questions de Trivial Poursuit ainsi, c'est que ton archi et découpage MVC n'est pas idéal en même temps. Tu ferais mieux de stocker ça (1) dans un PLIST avec un tableau de questions représentées chacune avec un dictionnaire (question, tableau de réponses, bonne réponse, ...) (2) en t'abstrayant des problématiques de styling et de présentation (quitte à  utiliser du Markdown ou CommonMark ou autre pour mettre en exergue certaines parties des réponses)



    [EDIT] Bon j'avais pas vu ton dernier message, OK ;-)


  • Alors je te pose la question: qu'est-ce que tu veux réellement faire ?




    Ce que je veux faire c'est stocker des fiches de données sur disque et pouvoir accéder à  une fiche précise sans charger l'intégralité du fichier en mémoire. J'en ai parlé dans un autre topic. Chaque fiche pouvant contenir des informations, dont des textes enrichis, de taille diverses, allant de quelques mots à  plusieurs centaines de mots.


     


    Pour me faire la main, j'ai voulu commencer simple : stocker une suite de textes enrichis dans un fichier binaire, et lire un texte donné, sans tout charger en mémoire. Cela passe par la transformation des textes en NSData pour les lire/écrire sous forme binaire. C'est là  que j'ai été surpris par la taille des NSData contenant des textes enrichis. Ce que je recherche c'est un moyen de stocker les textes sur disque sous la forme la plus compacte possible, en gardant certaines informations d'enrichissement, de manière à  reconstruire les NSAttributedString dont j'ai besoin pour l'affichage.

  • Sqlite (ou coredata ou realm) et markdown. Il te reste à  trouver comment transformer du rtf en markdown, mais ce ne doit pas être compliqué.


  • Sqlite (ou coredata ou realm) et markdown. Il te reste à  trouver comment transformer du rtf en markdown, mais ce ne doit pas être compliqué.




    C'est du texte statique, autant tout stocker en HTML et utiliser les possibilités d'NSAttributedString alors... (même si je suis un fervent défenseur du Markdown)

  • J'ai essayé de convertir un NSAttributedString en une string HTML. Le résultat est pour le moins onéreux en mémoire :



    let str = "Sushi miam miam"
    let optionDocument = [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType]
    let sushi = NSMutableAttributedString(string: str)
    let dataSushi = try? sushi.dataFromRange(NSRange(location: 0, length: sushi.length), documentAttributes:optionDocument )
    let stringHTML = String(data: dataSushi!, encoding: NSUTF8StringEncoding)
    print (stringHTML)



     


    Optional("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n<head>\n<metahttp-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<style type=\"text/css\">\np.p1 {margin: 0.0px 0.0px 0.0px 0.0px}\nspan.s1 {font-family: \'Helvetica\'; font-weight: normal; font-style: normal; font-size: 12.00pt}\n</style>\n</head>\n<body>\n<p class=\"p1\"><span class=\"s1\">Sushi miam miam</span></p>\n</body>\n</html>\n")


     


     


    C'est clair que le format Markdow serait bien plus compact.



    let str = "*Sushi* miam miam"
  • CéroceCéroce Membre, Modérateur
    février 2016 modifié #37
    En HTML:
    "<strong>Sushi</strong> miam miam"
    C'est sûr, si pour chaque ligne, tu stockes le document et ses styles, ça prend de la place.
  • Et c'est justement ce que je ne veux pas faire !

Connectez-vous ou Inscrivez-vous pour répondre.