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];
}
}
関連記事
-
-
iPad用storyboard⇔iPhone用Storyboardへの変換
iPad用アプリとしてiPad用前提のstoryboardから、iPhone対応にするにあたり、si
-
-
UIButtonのタイトル変更時のチラつき抑制
久しぶりにXcode+Objective-Cでアプリを作っていたら、UIButtonのタイトルを動的
-
-
ACEDrawingView導入の解説(2)
前回の続きで、ACEDrawingViewの紹介になります。 今回はACEDrawingViewと
-
-
UITableViewのセルセパレータが画像の下部分だけ切れる場合の対応
iOS7のUItableViewCellだと、UITableView.imageViewに画
-
-
preferredContentSizeをUINavigationContorllerのPop時に再設定する
popoverで表示しているViewControllerのサイズを、他のViewController
-
-
Xcode8で余計なログを抑制する
Xcode8に更新してから、妙にログが増えたので、NSLogで明示したのと実行時エラー以外のログを吐
-
-
UITableViewのヘッダに小文字を入れる
UITableViewのセクションヘッダをStoryboardでカスタマイズするという話題を以前掲載
-
-
bitbucketをXcode5で使用する
bitbucketは無償で5人までの少人数チーム用のクローズド(非公開)リポジトリを作成できるため、
-
-
NSAttributedStringをローカライズする方法
NSAttributedStringをLocalizeするうまい方法はないものかと探したら、これが手
