使ってみよう! Windows Live SDK/API

第7回Windows Live Writer ―― プラグインの作成 Part I

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 サイドバーによる編集
図1 サイドバーによる編集。点線で囲まれている部分がサイドバー

さらに次の3種類にプラグインを分類することができます。

挿入:

メニューやサイドバー図2から項目を選択して、記事へ画像やソースコードなどを挿入するプラグインです。作成されているプラグインの種類も多く、もっとも一般的なプラグインといえるでしょう。

図2 サイドバーの挿入項目
図2 サイドバーの挿入項目
URL:

URLを記事へ貼り付けたときや、⁠このコンテンツの引用」図3により引用したときに機能するプラグインの作成も可能です。特定のURLを貼り付け・引用したときに記事へ挿入される内容を、プラグインにより改変ができます。今回はこのタイプのプラグインを作ります。

図3 このコンテンツの引用(Blog This)
図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 プロジェクトの作成
図4 プロジェクトの作成

次に参照の追加を行います。ソリューションエクスプローラのプロジェクト名を右クリックし、⁠参照の追加」よりWindows Live Writerがインストールされている場所(通常はC:\Program Files\Windows Live\Writer[1]⁠)にあるWindowsLive.Writer.Api.dllを参照してください図5⁠。

図5 WindowsLive.Writer.Api.dllの参照
図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
        ' WebページのHTMLを1行読み取り
        html.Append(reader.ReadLine)

        ' <title></title>で括られた部分があるか探す
        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
    ' Ignore
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 オプションウィンドウ
図6 オプションウィンドウ

適当なURLを貼り付けてWebページのタイトルのハイパーリンクが挿入されれば成功です図7⁠。図はhttp://gihyo.jp/を貼り付けたときの結果です。いかがでしたでしょうか。

図7 作成したプラグインの実行結果
図7 作成したプラグインの実行結果

今回はここまでです。次回もまたプラグインを作ります。

おすすめ記事

記事・ニュース一覧