ENMLからHTMLへの変換
最近EvernoteAPIをいじっているので、コレに関するノウハウをとりあえず断片的に引っかかったところを掲載していきたいと思います。
余裕があれば最初から導入法を書きたいと思います。
EvernoteのiOS用APIには、Evernoteのノート記述用のマークアップ記法(ENML)で書かれたノートをHTMLに変換するメソッドとして
- (void)convertENMLToHTML:(NSString *)enmlContent withResources:(NSArray *)resources completionBlock: (void (^__strong)(NSString *__strong, NSError *__strong))block;
というメソッドがあります。HTMLに変換するとUIWebViewにそのまま流して表示できるので重宝します。
ところがどうも文字の色付け、アンダーライン等が反映されないので調べてみたところ、ENMLではスタイルとしてCSSの書式で指定されている要素が変換の過程でごっそり抜け落ちていることが判明しました。
どうやらENMLのタグを変換はするものの、タグ内のスタイルを拾うという処理が記述されてないようです。
今のところ、対策はENMLUtility.mに手を入れる(ソースコードのライセンス表記はMITライセンスのようです)か、ENMLUtility.mをベースに変換ロジックをフルスクラッチするしかないようです。
修正するメソッドはNSXMLParserDelegateのメソッド
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
で、メソッドの末尾部分に以下のようにコードを追加すれば、一応対応はできるようです(完璧かどうか厳密なテストはしていませんので、自己責任でお願いします)。
(略) [self setShouldIgnoreNextEndElement:YES]; [self writeResource:foundResource withAttributes:scrubbedAttributes]; } // --- ここから追加 else if([attributeDict valueForKey:@"style"]){ // --- style属性を持っている NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; [dic setObject:[attributeDict valueForKey:@"style"] forKey:@"style"]; [self.htmlWriter startElement:elementName attributes:dic]; } // --- ここまで追加 else { [self.htmlWriter startElement:elementName]; } }
関連記事
-
メソッドの呼び出し元を調べる
特定のメソッドに関して、そのメソッドをコールしているメソッド群を調べるための手順。 (1)調べたい
-
Xcode5.1のInterfaceBuilderにおける地味な変更点
iOS7.1に合わせてXcode5.1がリリースされました Xcode Release N
-
画面回転をしたあとに、UITextViewの先頭を表示する
回転によりサイズが可変するUITextViewで、縦向き(ポートレイト)から横向き(ランドスケープ)
-
UIButtonのappearanceで派生する色設定
以下のコードでUIButtonのappearanceでBackgroundColorの設定をすると、
-
バージョンアップ版があることを通知する
拍子抜けするほど簡単だったので、「アプリのバージョンアップの通知をどうするか」という話についてTip
-
UISplitViewControllerの仕切り線の色を設定
UISplitViewControllerで、iPadを横向き(Landscape)にしたときの2つ
-
ACEDrawingView導入の解説
【ACEDrawingViewとは】 ACEDrawingViewオープンソースのUIView拡張
-
コードでiPhone6 Plusを識別する簡単な方法
表題の通り、コードでiPhone6 Plusを識別する簡単な方法です。 iPhone6 Plu
-
アプリ内で自動スリープの設定を無効化する
「設定」アプリ内で設定したスリープ時間設定を無効にするためのコード。 アプリがバックグラウンドにな