Windows Live Writer
Windows Live Writer (WLW)とは、ブログの記事の編集・投稿・管理ができるデスクトップアプリケーションです。MetaweblogやAtomPubと呼ばれるAPIに対応しているブログサービスであれば、Windows Liveスペース以外のブログでも利用可能です。複数のブログの一元管理、オフラインでの編集、Webブラウザ上ではできない高度な編集など便利なアプリケーションです。WLW用のSDK も提供されており、今回はその中のひとつであるContent Source Plugin APIを利用してプラグインを作成します。
プラグインの種類
SDKにより作成できるプラグインは、記事へソースコードを挿入したりWebページのサムネイルを挿入したりといった、編集を手助けするものになり、プラグイン内部の処理としてはHTMLを出力することになります。これらのプラグインはContent Sourceプラグインと呼ばれ、2種類用意されています。プラグインは用意されているクラスを継承して作成します。そのクラスには次のふたつがあります。
ContentSource:
記事にHTMLを挿入するだけの単純なクラスです。
SmartContentSource:
ContentSourceクラスに比べ、SmartContentSourceは記事にHTMLを挿入後にサイドバーを使用した編集が可能になっています(図1 ) 。また、画像の大きさ変更などのためドラッグ&ドロップによるHTML部分のリサイズも可能です。
図1 サイドバーによる編集
さらに次の3種類にプラグインを分類することができます。
挿入:
メニューやサイドバー(図2 )から項目を選択して、記事へ画像やソースコードなどを挿入するプラグインです。作成されているプラグインの種類も多く、もっとも一般的なプラグインといえるでしょう。
図2 サイドバーの挿入項目
URL:
URLを記事へ貼り付けたときや、「 このコンテンツの引用」( 図3 )により引用したときに機能するプラグインの作成も可能です。特定のURLを貼り付け・引用したときに記事へ挿入される内容を、プラグインにより改変ができます。今回はこのタイプのプラグインを作ります。
図3 このコンテンツの引用(Blog This)
Live Clipboard:
Live Clipboardとは、Webサイト間でコピー&ペーストなどを実現するためのXMLベースの仕組みです。2006年にRay Ozzie氏が発表しましたが、まったく流行っていないのが現状です。Live Clipboard形式のコンテンツを記事に貼り付けたときに機能するプラグインを作成できますが、本連載では扱いません。
以上の3種類の分類はクラスに属性を付けることで行います。
プラグイン プロジェクトの作成
URLを記事に貼り付けたとき、通常はそのままURLがハイパーリンクとして挿入されますが、URLの示すページのタイトルを取得しハイパーリンクとして表示するURLプラグインを作成してみましょう。
Visual Basic 2008 Express Editionを使用してプラグインを作成します。最初にクラスライブラリのプロジェクトを作成します(図4 ) 。ここではTitlePluginというプロジェクト名にしました。
図4 プロジェクトの作成
次に参照の追加を行います。ソリューションエクスプローラのプロジェクト名を右クリックし、「 参照の追加」よりWindows Live Writerがインストールされている場所(通常はC:\Program Files\Windows Live\Writer[1] )にあるWindowsLive.Writer.Api.dllを参照してください(図5 ) 。
図5 WindowsLive.Writer.Api.dllの参照
作成したプラグインをWLWから使用する単純な方法は、WLWのインストールフォルダにあるPluginsフォルダへ作成してできたDLLファイルをコピーすることです。Visual Studio 2008を使用している場合は、ビルドイベントの設定ができます[2] 。毎回コピーするのはめんどうですので、ビルド後に自動でコピーするよう設定しておきましょう。Visual Basicの場合はプロジェクトのプロパティ画面のコンパイルタブ内にある「ビルド イベント」ボタンから設定できます。「 ビルド後に実行するコマンド ライン」に次のように指定します[3] 。
XCOPY /Y "$(TargetPath)" "C:\Program Files\Windows Live\Writer\Plugins\"
クラスの作成
最初にWindowsLive.Writer.API名前空間をインポートします。デフォルトのクラスClass1(ファイル名はClass1.vb) は、TitlePluginなど適当な名前に変更しておくとよいでしょう。今回はContentSourceクラスを継承したクラスを作成します。併せて継承の記述も行います。
Imports WindowsLive . Writer . Api
Public Class TitlePlugin
Inherits ContentSource
End Class
WriterPlugin属性
次にクラスに対してWLWプラグインに共通して必要になるWriterPlugin属性を付けます。この属性を使用してプラグイン名などを指定します。指定できるパラメータは次のものがあります。
Id
プラグイン一意のID(GUID)
Name
プラグイン名
Description
プラグインの説明
PublisherUrl
プラグイン版元のURL
HasEditableOptions
オプション設定ウィンドウの有無を示すブール値
ImagePath
プラグインを示すアイコンのパス
IdとNameは必須になります。Idはプロジェクトのプロパティのアプリケーションタブ アセンブリ情報からGUIDをコピーして指定するとよいでしょう。属性を指定すると次のようになります。
< WriterPlugin ( "83092227-2af8-4b4d-94dc-ee85f3a1a186" , _
"タイトル取得" , _
Description := "Webページのタイトルを取得して挿入します" , _
HasEditableOptions := False )> _
Public Class TitlePlugin
Inherits ContentSource
End Class
HasEditableOptionsがTrueのプラグインは、WLWのオプションウィンドウでプラグインを選択したとき、[ オプション]ボタンが表示されます。当然ながらオプションウィンドウを作成しておく必要があります。今回は使用しませんのでFalseを指定します。
プラグインのアイコンを指定する場合は、アイコンファイルをプロジェクトに追加し、プロパティウィンドウの「ビルド アクション」から「埋め込まれたリソース」を選択します。ImagePathにアイコンファイル名を指定すると、WLWのオプションウィンドウなどでそのアイコンファイルが表示に使用されます。
UrlContentSource属性
以上はプラグイン共通の設定でした。URLプラグインのための属性も指定しましょう。URLプラグインの場合は、UrlContentSource属性になります。指定できるパラメータは次のものがあります。
UrlPattern
対象URLを示す正規表現
RequiresProgress
プログレスウィンドウの使用を示すブール値
ProgressCaption
プログレスキャプション
ProgressMessage
プログレスメッセージ
UrlPatternは必須になります。プラグインが機能するURLの正規表現を指定します。「 http://」を含める必要はありません。また、今回のようにWebページにアクセスする場合は処理に時間がかかる可能性があります。そのようなときのために処理中を示すプログレスウィンドウがWLWには用意されています。ただ、執筆時点のWLWのバージョンではProgressCaptionとProgressMessageの表示に不具合があります。
先ほどのコードに追記すると次のようになります。作成するプラグインはすべてのURLに対して処理するので、正規表現を「.+」と指定しました。
< WriterPlugin ( "83092227-2af8-4b4d-94dc-ee85f3a1a186" , _
"タイトル取得" , _
Description := "Webページのタイトルを取得して挿入します" , _
HasEditableOptions := False ), _
UrlContentSource ( ".+" )> _
Public Class TitlePlugin
Inherits ContentSource
End Class
メソッドの記述
貼り付けたURLを元にWebページのタイトルを取得する処理を記述します。URLプラグインではURLが貼り付けられたときCreateContentFromUrlメソッドが呼ばれます。このメソッドをオーバーライドし処理を追加します。
Public Overrides Sub CreateContentFromUrl ( ByVal url As String , ByRef title As String , ByRef newContent As String )
End Sub
メソッドの引数は次のものがあります。
url
貼り付けられた・引用されたURL
title
「このコンテンツの引用」により引用された場合、そのWebページのタイトル
newContent
記事に挿入されるHTML文字列
titleとnewContentは参照渡しになっていますので、メソッドの内で変更した内容が記事へ挿入時に反映されます。
SDKにはプラグインの作成時に役立つヘルパークラスがいくつか用意されています。その中にWebへアクセスするためのPluginHttpRequest クラスがありますので、このクラスを利用して処理を書いてみます。PluginHttpRequestクラスは、コンストラクタ引数にアクセスするURLを渡し、GetResponseメソッドによりそのStreamの取得ができます。メソッドにタイムアウト値(ミリ秒)の指定も可能です。
まず、PluginHttpRequestクラスとStreamReaderクラスの変数宣言とWebページのタイトルを格納する変数を宣言します。タイトルには初期値としてurlを指定しておきます。
Dim request As PluginHttpRequest
Dim reader As IO . StreamReader = Nothing
Dim webTitle = url
次にStreamReaderのオブジェクトを作成します。ここではエンコード形式をUTF-8に固定にしています。Streamから順次 文字列を読み取り、<title></title>で括られた部分がないか正規表現を用いて探します。見つかった場合は読み取り処理を終了し、webTitleにタイトル部分を格納します。
Try
request = New PluginHttpRequest ( url )
Dim html = New Text . StringBuilder
reader = New IO . StreamReader ( request . GetResponse ( 3000 ), Text . Encoding . UTF8 )
Do While reader . Peek <> - 1
html . Append ( reader . ReadLine )
Dim match = Text . RegularExpressions . Regex . Match ( html . ToString , "<title>(.*?)</title>" , Text . RegularExpressions . RegexOptions . IgnoreCase )
If match . Success Then
webTitle = match . Groups ( 1 ). Value
Exit Do
End If
Loop
Catch ex As Exception
Finally
If reader IsNot Nothing Then
reader . Close ()
End If
End Try
最後にnewContentにハイパーリンクのHTMLを指定します。
newContent = String . Format ( "<a href=""{0}"">{1}</a>" , url , webTitle )
以上でメソッドの記述は完了です。より実用的なものにするにはWebページのエンコード形式の判別や、URLが画像や圧縮ファイルなどの場合を考慮した処理が必要でしょう。
プラグインの実行
ビルドしてできたDLLファイルをWLWのPluginsフォルダにコピーした後、WLWを起動しましょう。プラグインが有効になっているかどうかはWLWのオプションウィンドウのプラグインで確認ができます(図6 ) 。
図6 オプションウィンドウ
適当なURLを貼り付けてWebページのタイトルのハイパーリンクが挿入されれば成功です(図7 ) 。図は「http://gihyo.jp/ 」を貼り付けたときの結果です。いかがでしたでしょうか。
図7 作成したプラグインの実行結果
今回はここまでです。次回もまたプラグインを作ります。