JUL
30

WYSIWYG編集が可能で、Wordを扱うかのような感覚でBlogをサクサク書くことが出来るMS謹製投稿クライアントWindows Live Writer。本体だけでも相当強力なソフトですが、機能強化のための各種プラグインを開発することもできるようになっており、.NETをかじっている自分にはなかなか興味をそそられるソフトでもあります。その開発の仕方はJZ5さんこと、松江祐輔さんが書かれた使ってみよう! Windows Live SDK/API:第7回 Windows Live Writer … 技術評論社という記事がチュートリアルとしてとても分かり易いものとなっています。詳しいリファレンスとしてはWindows Live Writer SDKが現在の正式版に対応する公式で、Writer DevZone: Technical Preview: Now Available for Downloadにこの前出たTecnology Preview版のSDKが転がっています。どっちも英語ですけど。

で、このエントリでは、ここ数日オブジェクトブラウザを通じてWindows Live WriterのDLL群とにらめっこした結果わかった、SDKに載っていない本体の内部構造の話をしてみようかと。Windows Live Writerの中にどんなクラスがあるかや、どうやってそのインスタンスをプラグイン側から取得するかのお話。

Windows Live WriterのメインFormの取得方法

image 何はなくとも、記事編集画面が無ければ始まらない。Windows Live Writerの記事編集画面のFormのインスタンスをプラグインから取得する方法から説明を始めます。プラグインが呼び出された時に呼ばれるメソッドのうちいくつかは、dialogOwnerという、System.Windows.Forms.IWin32Window型の引数を持っています。このdialogOwnerという引数が今回のカギとなります。読んでの通り、dialogOwnerは親Formを示しており、SmartContentSource.CreateContentメソッドなら、記事編集画面のForm、PublishNotificationHook.OnPrePublishメソッドやOnPostPublishメソッドなら投稿中のプログレス表示を行うFormとなります。

        private PostEditorForm getPostEditorForm(IWin32Window postProgressForm) {
            return (PostEditorForm)((Form)Form.FromHandle(postProgressForm.Handle)).Owner;
        }

PublishNotificationHookの方から取得できるdialogOwnerからメインFormのインスタンスを取得したいならば、上記のようなメソッドを用意して取得すればOK。見ての通り、メインFormのクラス名はPostEditorFormで、WindowsLive.Writer.PostEditor名前空間に所属しているクラスです。今後は記事編集画面のFormのことはPostEditorFormと呼ぶことにします。

Blogクラスのインスタンスの取得

imageさて、前の項で取得できたPostEditorFormクラスには、CurrentBlogIdというプロパティがあります。このプロパティには、Windows Live Writerで管理しているBlogを識別するためのGUIDが入っており、これを基に現在編集対象としているBlogを表すBlogクラスのインスタンスを取得可能です。こんな感じに。↓

            Blog blog = new Blog(postEditorForm.CurrentBlogId);

BlogクラスはWindowsLive.Writer.BlogClient名前空間に所属しているクラスで、メンバには記事の取得や投稿に関するメソッドなど、Blogに関する様々な操作を実現するメソッドやプロパティが含まれています。Blogクラスをオブジェクトブラウザで表示したもののSSを示しましたが、サイズの関係でSSに写っていないものもたくさんあるので、是非自分で確かめてみてください。

BlogClientクラスのインスタンスの取得

ところでBlogクラスには、パブリックではないプロパティとしてBlogClientというプロパティがあります。このプロパティには、IBlogClient(WindowsLive.Writer.Extensibility.BlogClient名前空間に所属)というインターフェイスを実装したクラスのインスタンスが含まれています。一例を挙げると、WordPressClientクラスや、MovableTypeClientクラス、WindowsLiveSpacesClientクラス(全てWindowsLive.Writer.BlogClient.Clients名前空間に所属)などです。これらにはUsernameや、Passwordというプロパティが含まれており、自前でXML-RPCを使ってサーバーとやり取りしたい場合などに活用できます。(WordPressはMetaWeblobAPIの拡張に熱心であるので、Windows Live Writerが対応していない機能もあり、意外と使いたくなる場面があるものです)

publishingContext.PostInfoの実体

PublishNotificationHook.OnPrePublishメソッドやOnPostPublishメソッドのpublishingContextという引数には、PostInfoというIPostInfo型のプロパティがあるのは御存知だと思います。以前自分はこのプロパティに格納されているインスタンスの、IPostInfoインターフェイスでは読み取り専用になっているプロパティに対してリフレクションで値をセットするコードがなぜ動くのかが分からないとかぼやいていました

調べてみたところ、リフレクションでアクセスするのは、参照するのに使われたインターフェイスのメンバではなく、インスタンスのメンバだから、ということのようです。用語法をあまり理解できていないので、おかしな説明になっているかもしれません。要するに、PostInfoに対してリフレクションでアクセスできるのは、IPostInfoインターフェイスのメンバだけではなく、BlogPostクラスのメンバなのだ、ということです。これなら前のエントリのpi.CanWriteの部分がtrueを返すのも納得できます。

まぁとりあえずpublishingContext.PostInfoにはBlogPostクラスのインスタンスが入っているということです。そこで、こんな感じにキャストしてやると、

            BlogPost blogPost = (BlogPost)publishingContext.PostInfo;

よりエントリの情報を詳細に得ることができるようになります。投稿スラッグや概要(Excerpt)、投稿日時を表すっぽいプロパティもあるので、チェックしてみてはいかがでしょうか。

次のエントリでは、これらを利用して、Publish Notification Hook プラグインで、投稿前に記事内容を書き換える方法を紹介したいと思います。プラグインからの書き換え後、エディタ中の表示が変化しない問題を解決するために、エントリを管理しているクラスの説明も少しだけします。

Trackbacks : 4

Trackback URL for this entry
http://blog.sharplab.net/blog/2008/07/30/386/trackback/

Listed below are links to weblogs that reference this entry

ピンバック from SharpLab. - publish notification hooksでpost内容を安全に書き換えるには 08-07-31 14:37:57 UTC

[…] Older […]

ピンバック from SharpLab. - WPCustomFieldsEditor 08-08-10 01:44:52 UTC

[…] 漕ぎ着けた。ちなみにXML-RPCでWordPressを操作する際に必要となるID、PasswordはSharpLab. – 中まで見よう!Windows Live Writerというエントリで紹介した方法を使用してます。エンドポイントURLも確か […]

ピンバック from SharpLab. - WPCustomFieldsEditorよもやま噺 08-08-13 19:30:59 UTC

[…] WPCustomFieldsEditorではXML-RPCを使ってWordPressを操作しています。WordPressをXML-RPCで操作するには、WordPressのエンドポイントURLとログインするためのユーザー名とパスワードが必要となります。これらは、リフレクションなどを使って、Windows Live Writer(以下WLW)が内部に保持している情報を取得しています。エンドポイントURLはBlogクラスのPostApiUrlプロパティから、ユーザー名とパスワードはXmlRpcBlogClientクラスのUsernameプロパティ、Passwordプロパティからそれぞれ取得できます。これらのクラスのインスタンスの取得方法については、SharpLab. – 中まで見よう!Windows Live Writerというエントリに書きましたのでそちらを参照してください。 […]

ピンバック from Windows Live Writerのプラグインから編集中のエントリのメタ情報を書き換える方法 - SharpLab. 08-09-11 22:56:36 UTC

[…] 3行目、6行目については、中まで見よう!Windows Live Writer – Sharplab.のエントリを参照してください。 […]