d.hetima RSSフィード

2007-10-30

Quick Look プラグインを作る

Leopard 導入前は Cover Flow と Quick Look はほとんど使わないだろうと思っていたが、いざ使ってみるとかなり楽しい。対応していないファイル形式はプラグインを作れば良いのだけれど、これがまた楽しい。基本的に画像データを返すだけで良いので作るのが簡単なのだ。Quick Look プラグインは、Cover Flow のサムネイルと Quick Look のプレビュー両方を提供する。

とりあえず日本で最初の Quick Look プラグイン HetimaZip.qlgenerator を作った。次は、Safari のブックマークと履歴用のプラグインを作成中。こんな感じ↓。

in development 2007-10-30

URL から画像を生成するためにはキャプチャしなければならないが、毎回 web から取ってくるのは現実的ではないのでキャッシュしておく必要がある。SafariStand で表示したページのサムネイルを jpg でキャッシュしておいて、それを使うという仕様にした。

Safari ブックマークや履歴を Quick Look するとページタイトルと URL が表示されるのだが、(Quick Look 用の処理は何も行わない)自作プラグインで処理を横取りすると、URL が表示されなくなる。プレビューだけをデフォルトのプラグインに渡す方法があるのか、そもそも可能なのか分からないので同じように実装する方法を模索した。

qlmanage

qlgenerator のデバッグには qlmanage というコマンドラインが役に立つ。

% qlmanage -h
Usage: qlmanage [OPTIONS] path...
	-h	Display this help
	-r	Force reloading Generators list
	-p	Show a preview of the documents
	-t	Show thumbnails of the documents
	-s size	Size for the thumbnail
	-f factor	Scale factor for the thumbnail
	-c contentTypeUTI	Force the content type used for the documents
	-g generator	Force the generator to use

ロードされているプラグインを確認したり、特定のプラグインで処理させたりできる。

qlmanage (-p|-t) -c 書類のタイプ -g qlgeneratorのパス 対象ファイルのパス

とすれば、インストールしていないプラグインをテストできる。

簡易プレビューに文字列を追加する

Safari ブックマークや履歴のように、サムネイルをそのまま表示し、タイトルの下に URL を付け加えるプレビューを作るには、QLPreviewRequestSetDataRepresentation() の第4引数の properties で指定する。定数「kQLPreviewPropertyDisplayNameKey」でタイトルを指定、キー "SubTitle" でその下の文字列を指定する。こちらのキーはおそらく「kQLPreviewPropertySubTitleKey」なのだが、公に定義されておらず使えないので決め打ちする。

データは何を渡せば良いか。データが何も渡されなかった場合の表示をさせたいので何も渡さなければ良いのだが、その場合 contentTypeUTI をどうすれば良いのか。QuickLook.framework に入っている Bookmark.qlgenerator を調べてみたら、データは NULL でタイプは "public.item" だった。これは「kUTTypeItem」として「LaunchServices/UTCoreTypes.h」にある。

というわけで、下記のようなコードで上手く行く。キー文字列が決め打ちだが、純正の qlgenerator と同じことをやっているのだから問題ないだろう。

20071030qlsample

Safari ブックマークと履歴からタイトル+ URL 表示のプレビューを作るサンプル(kUTTypeItem は "public.item" で決め打ちしてます)

OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview,
CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    OSStatus result=-1;
    
    NSDictionary* prop=[NSDictionary dictionaryWithContentsOfURL:(NSURL*)url];
    NSMutableDictionary* pdict=[NSMutableDictionary dictionary];
    
    NSString* nameStr=[prop objectForKey:@"Name"];
    NSString* urlStr=[prop objectForKey:@"URL"];
    if(nameStr)[pdict setObject:nameStr forKey:(NSString*)kQLPreviewPropertyDisplayNameKey];
    if(urlStr)[pdict setObject:urlStr forKey:@"SubTitle"];
    if(pdict){
        QLPreviewRequestSetDataRepresentation(preview, nil, CFSTR("public.item"), (CFDictionaryRef)pdict);
        result=noErr;
    }

    [pool release];
    return result;
}

追記

Open Mail Environment(OME) 同梱の Quick Look プラグインが(おそらく)日本で最初でしたm(_ _)m。thanks Gururi さん