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];
}
}
関連記事
-
-
”No Scheme”になってしまった場合の対応
知人がXcodeで突然「No Scheme」表示になってRunするターゲットとデバイスが選択できない
-
-
UITableViewのセクションヘッダをStoryboardで作る時の参考
UITableViewのセクションヘッダをカスタムして作る際に、セルと同様にプロトタイピングするため
-
-
Realmで==ができなかった
最近Realm Swiftを使ってて、引っかかったところがあるのでメモ。 Realmのオブジェクト
-
-
UITableViewのヘッダに小文字を入れる
UITableViewのセクションヘッダをStoryboardでカスタマイズするという話題を以前掲載
-
-
plistファイルに色を入れる
plistファイル中にUIColorを入れたい!という場合。普通RGBAの値を数値で入れるとかするけ
-
-
アプリ内で自動スリープの設定を無効化する
「設定」アプリ内で設定したスリープ時間設定を無効にするためのコード。 アプリがバックグラウンドにな
-
-
UISplitViewControllerの仕切り線の色を設定
UISplitViewControllerで、iPadを横向き(Landscape)にしたときの2つ
-
-
UICollectionViewのヘッダとフッタの設定
UICollectionViewで慣れないのがヘッダフッタで、毎度「どうやって設定するんだっけ…」と
-
-
iOSシミュレータの帯域制限をテストする
iOSシミュレータで通信帯域制限をテストしたいと思ったんですが、Xcode8からXcode7.xとは
