web-dev-qa-db-ja.com

iOSNSAttributedStringからHTMLへ

NSAttributedに設定したUITextView文字列(HTMLから取得)があります。

- (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にさえ含まれておらず、おそらくもっと多くの問題があります。

NSAttributedStringからHTMLを取得するより良い方法はありますか?または、NSAttributedStringを解析して独自のHTMLを作成する方法はありますか?

23
Nic Hubbard

そのリポジトリを見ることができるかもしれません: https://github.com/IdeasOnCanvas/Ashton

2つの興味深いクラスがあります:

AshtonHTMLReader.h

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

そして作家:

AshtonHTMLWriter.h

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

生成されたhtmlはあまり良くありませんが、uiwebviewで表示しようとすると、かなり見栄えがします。

画像の簡単なアイデア:base64でエンコードし、適切なフレームの<img>タグに直接配置します。

それは醜いですが、それは機能します=>私は数ヶ月前にいくつかのhtmlファイルを作成して編集するためにこのプロセスを使用しました

12
Alban

これは複雑な問題であり、短い答えから始めます。コメント欄で質問していただければ、必要に応じて回答を拡大していきます。

また、属性付き文字列ルートを使用しようとしましたが、完全なHTML編集には適していないことがわかりました。コンバーターが完全に開発されていないか、これらの要素がAppleによって範囲外と見なされたため、多くの要素がサポートされていません。属性付き文字列は、再作成しようとするまでにHTMLの豊富さのほとんどをすでに失っているため、属性付き文字列の解析は十分ではありません。

代わりに、Webビューを使用し、ドキュメントを通常どおりにロードして、body要素でcontentEditableを有効にします。これにより、WebKitによってのみ制限され、ドキュメントを最大限に編集できるようになります。最後に、HTMLを取得するために、contentEditableを無効にし、document.outerHTMLを使用して、ユーザーが変更を加えた以前のHTML全体を取得します。

このメソッドを軽く実装するという決定を下さないでください。これはやや複雑な解決策ですが、確かに可能です。ウェブビューはテキストビューほど素敵ではありませんが、十分なマッサージをすれば可能です。

必要に応じて、この回答を拡張します。

9
Leo Natan

また、プロジェクトの1つで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);
3