SmartContentSourceプラグイン
SmartContentSourceプラグインは基本的なContentSourceプラグインよりも複雑です。最も大きな違いは、ContentSourceプラグインはブログエントリにHTMLコードを挿入するだけで、後からプラグインを変更または編集することはできないという点です。それに対し、SmartContentSourceプラグインは、挿入されるコードに関連する詳細情報を格納できるため、ユーザーはWriter内の作成済みブログエントリを開き、プラグインを使っていつでも編集できます。
必要なものを計画する
SmartContentSourceプラグインを作成するときは、まずプラグインで内部的に必要になるもの、つまりプラグインの設定や、エンドユーザーによる編集を可能にしたいコンテンツ部分などについての計画を立てることをお勧めします。ユーザーによる再編集を可能にする部分をあらかじめ決めておけば、プラグインでどんな設定が必要になるか判断しやすくなります。これらの設定はISmartContentオブジェクトのIPropertiesプロパティ内に保持され、そのISmartContentオブジェクトがLive Writerからプラグインに渡されます。
さらに、エンドユーザーにコンテンツの編集をどこで行わせるか、編集時にもコンテンツ作成時と同様のフォームを使用させるか、Writerサイドバーから編集させるかという点についても決める必要があります。
リスト2は、この例のプラグインのPluginSettingsクラスの中で使われているコードを示しています。
SmartContentSourceプラグインを書くには、ContentSourceではなく、SmartContentSourceから継承する必要があります。
public class HiddenText : SmartContentSource
using System; using System.Collections.Generic; using System.Text; using WindowsLive.Writer.Api; namespace EditPublish { public class PluginSettings { IProperties m_properties; private const string PLACEHOLDER = "PLACEHOLDER"; private const string ACTUALCODE = "ACTUALCODE"; public PluginSettings(IProperties properties) { m_properties = properties; } public string PlaceHolder { get { return m_properties.GetString(PLACEHOLDER, ""); } set { m_properties.SetString(PLACEHOLDER, value); } } public string FinalText { get { return m_properties.GetString(ACTUALCODE, ""); } set { m_properties.SetString(ACTUALCODE, value); } } } }
CreateContentメソッドをオーバーライドする
ContentSourceプラグインと同様、CreateContent
メソッドをオーバーライドする必要がありますが、この場合のコードは少し異なります。
public override DialogResult CreateContent (IWin32Window dialogOwner, ISmartContent newContent) { PluginSettings settings = new PluginSettings(newContent.Properties); using (frmMain main = new frmMain(settings)) { DialogResult result = main.ShowDialog(); return result; } }
この場合、Writerから文字列参照が渡されることはありません。つまり、エディタ内で何が選択されていようと無視されるということです。その代わり、ISmartContentオブジェクトが与えられます。ISmartContentオブジェクトには、プラグインを使用したときのインスタンスに関するあらゆるものが含まれます。たとえば設定を含めるときに使用するIPropertiesプロパティ値などもその1つです。しかし、このプロパティは、そのISmartContentオブジェクトのみに関するものであり、前の例のようにグローバルなものではありません。
このコードでは、ISmartContentオブジェクトのIPropertiesプロパティを受け取るPluginSettingsオブジェクトを作成し、このオブジェクトをフォームに渡しています。これにより、必要な設定をフォームからPluginSettingsクラスに書き込むのが容易になります。
GeneratePublishHTMLメソッド
メインプラグインクラスには、オーバーライドできる3つの新しいメソッドがあります(うちの2つは必須で、残り1つはオプション)。最初のメソッドはGeneratePublishHTML
で、ここで実際のブログに発行されるHTMLを生成します。このメソッドは必須です。GeneratePublishHTML
メソッドのごく簡単な例を次に示します。
public override string GeneratePublishHtml (ISmartContent content, IPublishingContext publishingContext) { PluginSettings settings = new PluginSettings(content.Properties); return settings.FinalText; }
このコードでは、CreateContentメソッドを使って書き込んだ設定に基づくテキストを実際に発行します。
IPublishingContextオブジェクト引数には、書き込み先のブログのタイプに関する情報が格納されます。これには各ブログのGUID(Live Writer自身が提供)と、現在の発行サービスの名前(Windows Live Spaces、LiveJournal、WordPress.comなど)が含まれます。
CreateEditorメソッド
これは2番目の必須メソッドで、オーバーライドする必要があります。このメソッドは、Live Writerエディタ内でSmartContentSourceオブジェクトが選択されたときにLive Writerに表示されるサイドバーを作成します。
public override SmartContentEditor CreateEditor (ISmartContentEditorSite editorSite) { return new ContextEditor(); }
通常、このメソッドはご覧のとおりの単純なものです。このコードで呼び出しているContextEditorクラスについては、後ほど説明します。
GenerateEditorHTML
プラグインによっては、ブログエントリ内に表示するものと、Live Writerのエディタ内に表示するものとが必ずしも一致しないことがあります(たとえばJavaScript関数を扱うプラグインの場合など)。このような場合、実際のLive Writer編集領域には何か別のものを表示しなければなりません。そのためには、GenerateEditorHTML
メソッドをオーバーライドする必要があります。
public override string GenerateEditorHtml (ISmartContent content, IPublishingContext publishingContext) { PluginSettings settings = new PluginSettings(content.Properties); return settings.PlaceHolder; }
ご覧のように、GeneratePublishHTML
メソッドと同じオブジェクトが渡されるので、同じ情報を使用してHTMLコードをエディタに入れることができます。
このメソッドはオプションのメソッドであり、プラグインに必須のものではありません。これをオーバーライドしなければ、Live WriterはGeneratePublishHTML
メソッド内にあるものを単純に使用します。
リスト3は、この例のプラグインのメインクラスのフルコードを示しています。
using System.Windows.Forms; using WindowsLive.Writer.Api; namespace EditPublish { [WriterPlugin("18d43e01-4549-4fde-8ca6-c7b4b7385fac", "Insert Placeholder", PublisherUrl = "http://scottisafooldev.spaces.live.com", Description = "Lets you put in a placeholder for the editor, "+ "to be replaced with other text when published.", ImagePath = "writer.png", HasEditableOptions = false)] [InsertableContentSource("Placeholder")] public class HiddenText : SmartContentSource { public override DialogResult CreateContent (IWin32Window dialogOwner, ISmartContent newContent) { PluginSettings settings = new PluginSettings(newContent.Properties); using (frmMain main = new frmMain(settings)) { DialogResult result = main.ShowDialog(); return result; } } public override SmartContentEditor CreateEditor (ISmartContentEditorSite editorSite) { return new ContextEditor(); } public override string GeneratePublishHtml (ISmartContent content, IPublishingContext publishingContext) { PluginSettings settings = new PluginSettings(content.Properties); return settings.FinalText; } public override string GenerateEditorHtml (ISmartContent content, IPublishingContext publishingContext) { PluginSettings settings = new PluginSettings(content.Properties); return settings.PlaceHolder; } } }