はじめに
Windows Live WriterはMicrosoftが無償で提供しているデスクトップブログオーサリングツールです。Live Writerを使用すると、オフライン状態でもデスクトップからブログエントリを書くことができます。Live WriterはMicrosoftの専用ブログサイト(Windows Live Spaces)をサポートするだけでなく、MetaWeblog APIまたはAtom Publishing Protocolに対応する任意のブログエンジンをサポートしており、たとえばWordpress、Community Server、LiveJournal、Bloggerなどのブログエンジンで使用できます。Live Writerではユーザーのブログスタイルをダウンロードし、それをテンプレートとして使用できるので、自分のブログのスタイルでブログエントリを書くことができます。
ブログを始めたばかりの初心者でも、ブログ歴が長い人でも、Live Writerを使用すればブログの使い勝手は格段に向上します。しかも、Live Writerに含まれていない機能をプラグインとして追加することができます。
必要な開発環境
Live Writerのプラグインは.NETで開発します。.NET 1.1を使用することもできますが、Microsoftでは.NET 2.0以上を使用するように推奨しています。Visual Studio 2005以上をインストールしておく必要があります。Visual Studio 2005または2008のバージョンは問いません(Express Editionsも可)。また、Windows Live Writerをダウンロードすることも必要です。Windows Live Writerには、プラグインの基礎となる必須のAPI DLLが含まれています。
プラグインを書く
Visual Studioを開き、新しいクラスライブラリプロジェクトを作成して、プラグインとして意味のある名前を付けます。既定名の「class1.cs」を「plugin.cs」に変えましょう(これは必須ではありませんが、こうするとメインのプラグインクラスが一目でわかります)。
次にWindows Live Writer APIの参照を追加する必要があります。[Add Reference]ウィンドウを開き、Windows Live Writerのインストールフォルダ(通常はC:\Program Files\Windows Live\Writer\)にあるWindowsLive.Writer.API.dllを選択します。この参照については、Copy Localプロパティをfalseに設定することをお勧めします(これにより、以前のバージョンのAPI DLLがLive WriterのPluginsフォルダにコピーされなくなります)。plugin.csを開き、次のusingステートメントを含めます。
using WindowsLive.Writer.Api;
Windows Forms名前空間への参照も追加する必要があるので、System.Windows.Formsを参照として追加し、次のステートメントも含めます。
using System.Windows.Forms;
次は、プラグインの属性を追加します。これらの属性は、プラグインの作成者、開発者のWebサイトへのリンク、説明、プラグインのオプションの有無、およびLive Writer UI内でプラグインのアイコンとして使用するイメージの場所をLive Writerに知らせるためのものです。この属性は名前空間の直後(メインクラスの前)に記述します。
具体的なコードを次に示します。
[WriterPlugin ("d39bba2b-9522-49b1-8731-61030ccd6c95", "My First Plugin", Description = "This is my first plugin", HasEditableOptions = false, Name = "My First Plugin", PublisherUrl = "http://www.liveside.net")] [InsertableContentSource ("Bold Text")]
なお、GUIDはプラグインごとに一意のものであり、これを他のプラグインで再使用してはなりません。そのようなことをすると、Writerで問題が起こり、目的のプラグインをロードできない可能性があります。
プラグインのアイコンを追加するには、次のコードを含めます。
ImagePath = "icon.gif",
この属性の値に、使用したいアイコンのファイル名を指定します。ファイルの場所はプロジェクト内での相対パスで指定します。イメージ自体のサイズは20×18ピクセルでなければなりません。
この後、プラグインクラスを作成する必要があります。このプラグインクラスはLive Writer APIから継承する必要があります。継承元として、ContentSourceとSmartContentSourceという2つの選択肢があります。ContentSource系プラグインは非常に基本的なものであり、テキストをブログエントリに挿入するだけで、そのテキストを再度変更することはできません。一方、SmartContentSource系プラグインでは、これよりもずっと多くのことができます。この最初のサンプルではContentSourceインタフェースを継承します。
public class LiveWriterExamplePlugin : ContentSource
プラグインでテキストをどのように挿入するかを指定する必要があります。次の3つの方法があります。
- CreateContent ― [Insert]メニューから挿入
- CreateContentFromUrl ― URLをブログエントリ領域に貼り付けたとき、または[Blog This]アクションから挿入
- CreateContentFromLiveClipboard ― LiveClipboardを使用(ただし、ドキュメントの問題からLiveClipboardのコンテンツがあまりないので、このメソッドは一部でしか使用されていない)
最もよく使われている方法はCreateContent
です。プラグインコードでは、これらのメソッドをすべてオーバーライドします。また、これらは相互排他的な関係ではなく、1つのプラグインで2種類以上を使用できます。
CreateContentメソッドをオーバーライドする
下記のコードの、コンテンツが含まれる文字列参照(content
)に注目してください。この参照については、次の2点に注意する必要があります。
- 編集ウィンドウ内で選択されているものがある場合は、それがこのコンテンツの初期値となります。選択されているテキストがない場合、
content
は空になります。テキストが選択されている場合、content
は選択されているテキストのフルHTMLコードになります。 - プラグインは、このメソッドが終了する時点で
content
に入っているものをブログエントリに戻します。つまり、content
にはプラグインの機能に必要なHTMLフォーマットが含まれていなければなりません。
挿入された基本コードは単なるプレースホルダなので削除します。この最初のサンプルでは、単にDialogResult.OK
を返します。このサンプルは、選択されているテキストをボールドにする単純なプラグインとなります。したがって、CreateContent
メソッドのコードもごくシンプルです。
public override DialogResult CreateContent (IWin32Window dialogOwner, ref string content) { if (!string.IsNullOrEmpty(content)) content = string.Format( "<b>{0}</b>", content); return DialogResult.OK; }
このコードを使用すると、プラグインは選択されているテキストを受け取り、そのコンテンツをHTMLボールドタグで囲みます。リスト1を見ると、このLive Writerプラグインのコードがどれだけ簡単かがわかります。
using System; using System.Collections.Generic; using System.Text; using WindowsLive.Writer.Api; using System.Windows.Forms; namespace LiveWriterExample { [WriterPlugin("d2c99304-8648-4696-9ef1-6a82a2d070c9", "LiveWriterExamplePlugin", Description = "Makes highlighted text bold.", HasEditableOptions = true, ImagePath = "icon.gif", Name = "Bold Text Plugin", PublisherUrl = "http://www.liveside.net")] [InsertableContentSource("Bold Text")] public class LiveWriterExamplePlugin : ContentSource { public override DialogResult CreateContent (IWin32Window dialogOwner, ref string content) { // If nothing is highlighted, content will be empty. // If this is the case, the plugin does nothing. if (!string.IsNullOrEmpty(content)) content = string.Format("<b>{0}</b>", content); return DialogResult.OK; } } }