Archive : 2008-06
Windows Live WriterプラグインからエントリのHTMLDocumentを取得する方法
publish notification hooksではpost内容を書き換えられないという前回のエントリに対して、JZ5さんからFeedBackを送りましょう、という指摘があったので実際にWindows Live Writer: Development – MSDN Forumsに送りに行ってみると、Solution: How to get an HTMLDocument object for the main post body from your plugin – MSDN Forumsという素敵なスレッドが。エントリのIHTMLDocument2オブジェクトを返してくれる_FindTridentFromControlメソッドと、それを呼び出すための_FindTridentFromLWParentというメソッドのコードスニペットが公開されている。_FindTridentFromLWParentメソッドは、SmartContentSource.CreateContentメソッドなどで渡される、System.Windows.Forms.IWin32Window型のdialogOwnerという引数を渡して呼び出せば良い。実際にSmartContentSourceプラグインの中で試用してみると、確かにIHTMLDocument2オブジェクトが取得できた。これは便利。
一方、publish notification hooksプラグインの中で、OnPrePublishメソッドに渡されるdialogOwnerを使ってFindTridentFromLWParentメソッドを呼び出す場合は工夫が必要。OnPrePublishメソッドで渡されるdialogOwnerは、Live Writerのメインウィンドウではなく、投稿中に表示されるプログレスウィンドウなので、_FindTridentFromLWParentメソッドの代わりに、
private IHTMLDocument2 _FindTridentFromProgressForm(IWin32Window progressForm) {
Form writerMainForm = ((Form)Form.FromHandle(progressForm.Handle)).Owner;
return _FindTridentFromControl(writerMainForm);
}
以上のようなメソッドを作って、FindTridentFromControlメソッドを呼び出す必要がある。
これまでWindowsLive.Writer.Api.IPostInfo.Contentsプロパティに収められている投稿内容を正規表現で書き換えようとしてきたのだが、IHTMLDocument2オブジェクトが扱えるならば、ずっとスマートに色々なことが出来るようになりそうだ。
自分の間抜けさに笑える。
publish notification hooksを使ったプラグインを作ってみようということで、LiveWriterの出力するソースを投稿時に書き換えるプラグイン(InvalidSourceModifier)をつくることにした。
とか言って実際に作っていたのだけれども、いざ形になってきてコンパイルしてみると、
エラー 1 プロパティまたはインデクサ ‘WindowsLive.Writer.Api.IPostInfo.Contents’ は読み取り専用なので、割り当てることはできません。
というオチ。OnPrePublishメソッドをオーバーライドすれば投稿前にコンテンツの中身を書き換えられるという訳じゃなかったんかい!勘違いでした…。
どーするかなー。後はhookする対象をOnPostPublishメソッドに変更したうえで、投稿後直ぐXML-RPCで直接WordPress上のコンテンツを書きかえる位しかやりようがないかな・・・。つうかそれならWordPressのプラグインをPHPで書いた方が早いか(笑)
前のバイト先の飲み会に呼ばれ、wktkしながら大船に行ったら実は今日じゃなくて明日だった…。凹むわ…。
この前注文した20.1inch LCD、気がつけば今日が配送日。帰宅して程なくして佐川急便で届いた。実はこれ、店頭での下見もせずに買ったため、実物の商品を見るのは初めて。おそるおそる梱包を開けてみると…、
うん、スッキリしたデザインで良い感じ。ロゴや大していじらないボタン類はモニタ下部に纏めてありうるさくない。しかし…
デカ過ぎ。セカンダリとして買ったのに、面積にして主役のラップトップの液晶の倍以上。どう考えてもプライマリモニタです、本当にありがとうございました。
さてマルチディスプレイとして接続してみたのだが…、ん?中央部分にしか映らんぞ?何だこの黒枠。
しかしなぜかマウスは黒枠部分にも行ける。謎。
あれ、ウィンドウも行けるじゃん。
なんだ、良く考えてみたら、壁紙がセカンダリでは引き伸ばされないというだけの話でした。
さて、新LCD上でスクリーンショット撮ってみた。
流石はwidth:1680px。このBlogを表示したら、横の余り具合がハンパない。@ITに至っては、左半分にしかならなかった。しかしながら、Google AnalysisでこのBlogのビジターのPC環境をみていると、なんとiPod(要するにiPod touchのsafari)で接続してくる人も稀だが存在する。LCDの低価格化でPCの画面解像度は向上する一方、携帯デバイスの高性能化によってWebサイトが対応を迫られる画面サイズは多様化する一方という訳だ。このことを考えると、多少画像の扱い等に難があっても、リキッドレイアウトにするべきか、と思い始めた今日この頃。
publish notification hooksを使ったプラグインを作ってみようということで、LiveWriterの出力するソースを投稿時に書き換えるプラグイン(InvalidSourceModifier)をつくることにした。
using System;
using System.Collections.Generic;
using System.Text;
using WindowsLive.Writer.Api;
namespace InvalidSourceModifier {
//TODO:ImagePathの設定!
[WriterPlugin("9388e56b-c684-4e04-b7f6-b8cc224d70b2", "InvalidSourceModifier", PublisherUrl = "http://www.sharplab.net/")]
public class InvalidSourceModifier : PublishNotificationHook {
public override bool OnPrePublish(System.Windows.Forms.IWin32Window dialogOwner, IProperties properties, IPublishingContext publishingContext, bool publish) {
//publishingContext.PostInfo.Contents
System.Windows.Forms.MessageBox.Show("test");
return true;
}
}
}
…まだこれだけだけど。
さて、実際にコンパイルしてLiveWriterに登録してみると、SDKに付属していたNew SDK Features.docの以下の記述通り、
Unlike content source plugins, publish notification hooks can be enabled or disabled by the user on a per-blog basis. The first time a publish operation occurs for a particular blog since a publish notification hook was installed, the user will be asked if the hook should be enabled or disabled for that blog.
New SDK Features.doc
Blog別にプラグインの有効/無効が管理されているのが確認できた。上手く出来てるなー。ちょっとしたことだけど、これは便利だ。
押井守監督が『攻殻機動隊2.0』を始動!限定公開へ ニュース-ORICON STYLE-
へぇ。でも自分はSAC好き。3rd出ないかな…。

Windows Live Writer Technical Preview をインストールしてみた。UIなどをちょくちょく改良されている。でも生成されるソースは相変わらず綺麗じゃないなー。様々なBlogサービスに対応するためとはいえ、もう少しなんとかならないのか。トリミングは便利そうだ。でも英語ではTrimではなくcropという語を使うんだね…。Trimは文字列を切り詰める場合などに限られるのかな?
さぁて、publish notification hooksを使ったプラグインを作ってみるか。
マルチモニタ環境を実現するために、BenQのG2000Wを注文。今週金曜到着予定。
行きたい…。でも商学部のゼミ説明会と被っている…。どうする自分。
