web-dev-qa-db-fra.com

Transformez une chaîne NSAttributedString en texte brut

J'ai une instance de NSData contenant du texte attribué (NSAttributedString) provenant d'un NSTextView. Je veux convertir la chaîne attribuée en une chaîne simple (NSString) sans aucune mise en forme pour faire une analyse de texte (au moment de la conversion, je n'ai pas accès au NSTextView d'origine ni à son instance NSTextStorage).

Quelle serait la meilleure façon de faire cela?

MODIFIER:

Par curiosité, j'ai examiné le résultat de:

[[[self textView] textStorage] words]

qui semblait être une chose pratique pour faire une analyse de texte. Le tableau résultant contient des instances de NSSubTextStorage (exemple ci-dessous du mot "Eastern"):

Eastern {NSFont = "\" LucidaGrande 11.00 pt. P [] (0x7ffcaae08330) fobj = 0x10a8472d0, spc = 3,48\""; NSParagraphStyle = "Alignment 0, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Onglets (\ n 28L,\n 56L,\n 84L,\n 112L,\n
140L,\n 168L,\n 196L,\n 224L,\n 252L,\n 280L,\n
308L,\n 336L\n), DefaultTabInterval 0, Blocs (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0 ";}

NSSubTextStorage est probablement une classe privée car je n'ai pu trouver aucune documentation pour cela. Il conserve également toute la mise en forme.

35
Roger

Si je vous comprends bien, vous avez un NSData, disons data, contenant un NSAttributedString encodé. Pour inverser le processus:

NSAttributedString *nas = [[NSAttributedString alloc] initWithData:data
                                                           options:nil
                                                documentAttributes:NULL
                                                             error:NULL];

et pour obtenir le texte brut sans attributs, vous faites alors:

NSString *str = [nas string];
62
CRD

Mise à jour pour Swift 5:

attributedText.string
14
Justin Vallely

Avec Swift 5 et macOS 10.0+, NSAttributedString a une propriété appelée string . string a ce qui suit déclaration:

var string: String { get }

Le contenu des caractères du récepteur en tant qu'objet NSString.

Apple déclare également à propos de string:

Les caractères de pièce jointe ne sont pas supprimés de la valeur de cette propriété. [...]


Le code Playground suivant montre comment utiliser la propriété NSAttributedString de string afin de récupérer le contenu de la chaîne d'une instance NSAttributedString:

import Cocoa

let string = "Some text"
let attributes = [NSAttributedString.Key.underlineStyle : NSUnderlineStyle.single]
let attributedString = NSAttributedString(string: string, attributes: attributes)

/* later */

let newString = attributedString.string
print(newString) // prints: "Some text"
print(type(of: newString)) // prints: String
3
Imanou Petit