Windows Live Writer插件开发经验
Windows Live Writer插件开发经验
2011年04月02日
经常写博客的朋友也许经常使用Windows Live Writer,尤其对于有些程序员来说,时常辗转于CSDN、Windows Live、cnBlogs等众多社区,使用WLW对博客进行管理和更新会方便很多。我最近在写一些技术类博客文章的时候,时常需要插入代码,目前也有许多第三方的代码格式化插件,如"Insert Code"、"Code Snippet"等,这些插件能让代码插入后输出的HTML中产生语法高亮、行号、隔行阴影等特效,但是与CSDN本身的"插入代码"功能相比,这些插件输出的内容中会包含大量的样式,当代码量较大时,会造成文章大小急剧地膨胀。
如果要解决内联样式造成的HTML膨胀问题,可以采用CSS+JavaScript的解决方案,如著名的的"Syntax Highlighter"项目,但是这需要博客系统和平台的支持,Wordpress与CSDN都是采用Syntax Hightlighter。因此,我在研究了几个WLW的插件和Syntax Hightlighter的接口后,决定自己开发一个利用CSDN本身的"插入代码"功能的插件。 微软已经在其MSDN上发布了Windows Live Writer的SDK,其中关于插件编写的部分可以参看:Windows Live Writer Plugin API和这篇博客http://www.cnblogs.com/yaoshiyou/archive/2009/11/2 8/1612746.html。
WLW的插件可以分为三类: 发布通知插件:这类插件主要用于在博客文章发布前后调用,可以用来对内容的XHTML进行检查或者在某些条件下取消发布。
内容插件:这类插件用于让用户插入某种形式的内容,并对内容进行格式化处理,例如某些插件可以让用户选择插入本地的一张图片,然后生成缩略图上传并最终返回链接地址。
页眉页脚插件:这类插件主要用于自动在发布文章首尾添加一些内容,如签名、链接等等。
本次需求就是开发第二类插件,让用户输入源程序代码,生成符合CSDN样式的HTML文本。 WLW的插件开发的大致步骤如下: 创建一个新的.Net类库项目(framework 1.1以上)。
在解决方案资源管理器中右键单击该项目,选择"添加引用",然后选择"浏览"的选项,导入对WindowsLive.Writer.Api.dll的引用,此文件位于Window Live Writer执行文件所在文件夹下,如:C:\Program Files\Windows Live\Writer\。
创建一个类,继承自WindowsLive.Writer.Api.ContentSource(如果创建其他类型插件,可能继承自其他类,可以参看文档)。
对这个类应用WindowsLive.Writer.Api.WriterPluginAttribute属性,以指明插件的名称、图标及唯一ID等信息。
ContentSource有3个虚方法:CreateContent()、CreateContentFromLiveClipboard()、CreateContentFromUrl(),根据源内容的输入方式的不同,后续的步骤有一定的不同:
对话框输入:如果希望点击插件后,弹出一个对话框来让用户输入内容;这时需要为这个类应用WindowsLive.Writer.Api.InsertableContentSourceAttr ibute属性,然后重载
剪切板输入:这种模式是先将内容复制到剪切板中(准确的说应该是Live Clipboard,微软为Web开发一种数据交换技术,采用XML描述),然后点击插件,插件则直接读取剪切板中的内容作为自己的源;这时需要为这个类应用WindowsLive.Writer.Api.LiveClipboardContentSourceAttribute属性,然后重载CreateContentFromLiveClipboard()方法。
URL输入:根据WindowsLiveWriterApplication.BlogThisLink中的URL或者粘贴或拖入到编辑器中的URL作为数据源输入;这时需要为这个类应用WindowsLive.Writer.UrlContentSourceAttribute属性,然后重载CreateContentFromUrl()方法。
当然,有时候插件可能不需要任何输入源,只需当点击插件按钮后输出信息即可(如个人签名、当前日期等),则可以以上任选一种方法,在重载函数中忽略输入的内容即可。
重载方法后,编译成dll,然后将其放置到Window Live Writer安装目录下的Plugins目录下,重启WLW,即可以看见新的插件了,也可以在项目的生成后事件添加如下语句,自动复制到插件目录下进行调试: XCOPY /D /Y /R "$(TargetPath)" "C:\Program Files\Windows Live\Writer\Plugins\",调试时只能先启动WLW,然后手动附加到进程。 为了详解以上步骤中的几个难点,下面我列出一个最简单的插件示例。 1:Imports WindowsLive.Writer.Api 2:Imports System.Windows.Forms 3:Imports System.Text 4: 5: Windows Live Writer Plugin for CSDN", _ 8: ImagePath:="blog.bmp", _ 9: PublisherUrl:="http://blog.csdn.net/icefireelf")> _ 10: _ 11:PublicClass PluginAdapter 12:Inherits ContentSource 13:PublicOverridesFunction CreateContent(ByVal dialogOwner As IWin32Window, ByRef content AsString) As System.Windows.Forms.DialogResult 14:Dim ret = MessageBox.Show("是否插入一条问候?", "问候语插件", MessageBoxButtons.OKCancel) 15:If (ret = DialogResult.OK) Then 16: content = "hello" 17:EndIf 18:Return ret 19:EndFunction 20:End Class
WriterPlugin有2个必填属性: Id:即上面代码中的构造的第一个参数,此参数用于唯一标识一个插件,必须用GUID,使用项目属性中程序集的GUID即可。
Name:即上面代码中的构造的第二个参数,此参数即WLW的插件栏中显示的名称,建议不要太长。
此外还有几个可选属性: Description:字符串属性,此参数即WLW的插件详细信息中显示的内容,简单描述插件功能。
ImagePath: 图标路径,此参数决定WLW参见栏名称前的图标,如果不填则没有图标。图标须采用16*16的位图或PNG图,且必须作为嵌入的资源(将图标添加到工程中,在解决方案资源管理器中右键点击图标,选择"属性",然后将属性框中的"生成操作"设为"嵌入的资源"即可)。注意:如果图标放置在工程目录下,则直接填图标名称即可;如果放置在工程目录的子级目录下时,使用"."作为目录分隔符,例如:将图标放置在工程目录下的image\目录中,图标路径应写为"image.blog.bmp",而非"image\blog.bmp"。
PublisherUrl:发表者的URL,如果设置了此属性,在WLW的插件信息中点击详细信息的文字链接时,会打开此URL。
HasEditableOptions: 详细信息里面是否有"选项"按钮(如下图所示),此参数默认为False,即不带"选项"按钮,当其设置为True时,则必须为本类重载EditOptions()方法,在该方法中,可以启动一个用于配置插件的窗体,获取参数,然后保存在配置文件或本类对象的成员中,共后续访问使用。
此属性本用于定义插件在WLW的"Insert"菜单和"Insert"快捷面板的名称,但新版的WLW已经去除了插入菜单与侧边栏,因此应用此属性只是为了保持向前兼容。 由上面的代码可以看出,每个内容插件都对应一个ContentSource派生类的对象。那么这个对象是如何维护的呢?对于每个Writer的进程而言,所有ContentSource实例都是单例的,即当插件对象创建