*

ENMLからHTMLへの変換

公開日: : 最終更新日:2014/04/02 Tips, ライブラリ解説 , ,

最近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];
    }

}

[iOS開発者へおすすめの本]

関連記事

Xcode8で余計なログを抑制する

Xcode8に更新してから、妙にログが増えたので、NSLogで明示したのと実行時エラー以外のログを吐

記事を読む

HTMLParserを修正する

HTMLスクレイピングしてる時に役立つライブラリであるObjective-C-HMTL-Parser

記事を読む

画面回転をしたあとに、UITextViewの先頭を表示する

回転によりサイズが可変するUITextViewで、縦向き(ポートレイト)から横向き(ランドスケープ)

記事を読む

ソースコードからStoryboardにアクセスする

複数のStoryboardを利用して、自分以外のStoryboardに遷移させるような展開をしたい場

記事を読む

UISegmentedControlに見栄え良く背景色を設定する

UISegmentedControlをiOS7で使おうとすると、基本の背景色が「透明」になりますが、

記事を読む

UIActionSheetの文字がブレて多重表示される

UIActionsheetを使っていて、iOS7/iPadの組み合わせで起こる不具合らしき挙動が起こ

記事を読む

Realmで==ができなかった

最近Realm Swiftを使ってて、引っかかったところがあるのでメモ。 Realmのオブジェクト

記事を読む

メソッドの呼び出し元を調べる

特定のメソッドに関して、そのメソッドをコールしているメソッド群を調べるための手順。 (1)調べたい

記事を読む

preferredContentSizeをUINavigationContorllerのPop時に再設定する

popoverで表示しているViewControllerのサイズを、他のViewController

記事を読む

UICollectionViewが画面回転した時にレイアウトが崩れた時の対応

UICollectionViewCellのサイズを、内容に合わせて動的に変えた時に起こる問題に関して

記事を読む

Xcode10からのimage literal / color literalの指定方法

アセットにあるUIImageの直接指定が可能なImage litera

Xcode11でのバージョン番号の取得方法

Xcode11になってバージョン番号をスクリプトから得て自動で更新する

GoogleスプレッドシートからCSVにエクスポートしたデータを得る方法

情報がない中さんざ苦労しましたが、Googleスプレッドシート(の最初

画面回転をしたあとに、UITextViewの先頭を表示する

回転によりサイズが可変するUITextViewで、縦向き(ポートレイト

NXDrawKitを導入してみる

ACEDrawingViewがObj-Cで書かれていて、いまいちメンテ

→もっと見る

    PAGE TOP ↑