一个简单的Windows Live Writer插件

我们在使用Windows Live Writer写技术博客时,粘贴代码最好的方法就是使用VSPaste插件。它的使用方法非常简单,只需要在Visual Studio中复制代码,然后在Windows Live Writer中点击“插入”,再点击“Paste from Visual Studio”就可以了。由于复制的代码为富文本格式(Rich Text Format,RTF),插件会根据文本内容生成相应的HTML,最终粘贴在Writer中的代码配色和你的Visual Studio种的配色是一样的,这样的体验非常不错。而这些代码会放置在一个class为code的pre标记中,我们可以在CSS中进行设置,得到想要的代码块样式。比如:

class SomeClass
{
    public SomeClass()
    {
        SomeMethod();
    }

    public string SomeMethod()
    {
        return "Some String";
    }
}

由于是对富文本进行处理,因此VSPaste可以粘贴的内容不局限于从Visual Studio中拷贝。Eclipse(或其他IDE)、Word中的内容同样可以通过VSPaste粘贴到Writer中。以下代码来自Eclipse。

public class SomeClass {
    public SomeClass() {
        someMethod();
    }
    
    public String someMethod() {
        return "Some String";
    }
}

我们在写博客时有时还希望将一些其他内容也显示在这样的块中,如命令行指令、代码的生成结果等等。但这些复制过来很可能不是RTF,这样就不能使用VSPaste来进行粘贴了。因为VSPaste的核心方法是这样的:

public override DialogResult CreateContent(IWin32Window dialogOwner, ref string newContent)
{
    try
    {
        if (Clipboard.ContainsData(DataFormats.Rtf))
        {
            newContent = "<pre class=\"code\">" + 
                Undent(HTMLRootProcessor.FromRTF((string) Clipboard.GetData(DataFormats.Rtf))) + 
                "</pre><a href=\"http://11011.net/software/vspaste\"></a>";
            return DialogResult.OK;
        }
    }
    catch
    {
        MessageBox.Show("VS Paste could not convert that content.", "VS Paste Problem", 
            MessageBoxButtons.OK, MessageBoxIcon.Hand);
    }
    return DialogResult.Cancel;
}

可见如果不是DataFormats.Rft,VSPaste是不会进行任何处理的。

我之前遇到这样的情况,都是手动在源代码里添加<pre class=”code”></pre>。但加得多了,就厌烦了。也可以将其粘贴到Visual Studio中,然后再复制,但这同样很麻烦。那么何不自己来写一个类似的插件,对所有格式的文本都能将它们放到到一个<pre class=”code”></pre>中。这样的代码写起来简直太容易了。

在Windows Live Writer安装目录下有一个名为WindowsLive.Writer.Api.dll的程序集,我们只要在类库项目中引用这个程序集,就可以进行插件开发了。即使你不知道这些也无所谓,因为反编译VSPaste之后的代码已经明明白白了,我们完全可以在此基础之上进行修改。

namespace KirinStudio.WriterPlugins.PasteAsCode
{
    [WriterPlugin("6864d51f-abc8-4fe7-9c64-440210c871f2", "PasteAsCode")]
    [InsertableContentSource("PasteAsCode", SidebarText = "PasteAsCode")]
    public class Paster : ContentSource
    {
        public override DialogResult CreateContent(
            IWin32Window dialogOwner, 
            ref string content)
        {
            try
            {
                if (Clipboard.ContainsData(DataFormats.Text))
                {
                    content = "<pre class=\"code\">" + 
                        (string)Clipboard.GetData(DataFormats.Text) + "</pre>";
                    return DialogResult.OK;
                }
            }
            catch
            {
                MessageBox.Show(
                    "Cuould not paste the content.", 
                    "PasteAsCode Problem", 
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Hand);
            }
            return DialogResult.Cancel;
        }
    }
}

到这里我们的插件PasteAsCode就写完了。将其编译成dll,放到

C:\Program Files\Windows Live\Writer\Plugins

就可以了(上面这段就是用PasteAsCode粘贴的,怎么样,方便吧?)。

重启Windows Live Writer,在“插入”菜单下可以看到我们的PasteAsCode。

需要注意的是:

  • 如果你是使用Visual Studio 2010进行开发的,注意要在项目属性中把Target framework该为.NET Framework 3.5或以下版本。
  • WriterPluginAttribute的第一个参数必须为GUID,否则在启动Windows Live Writer时会报错。
  • 要想在“插入”菜单下显示插件,则必须使用InsertableContentSourceAttribute。
  • 通过继承ContentSource并重载其中的方法,就可以进行插件开发了。
  • 更多的类库介绍和示例在Windows Live Writer SDK中。

此外,如果你不希望VSPaste每次都在你的页面上加上广告的话,还可以对VSPaste进行扩展,去除广告链接,如:

namespace KirinStudio.WriterPlugins.VSPasteWithoutAd
{
    [WriterPlugin("fe534664-64ea-4048-9d3a-74ae3f51279e", "VSPasteWithoutAd")]
    [InsertableContentSource("VSPasteWithoutAd", SidebarText = "VSPasteWithoutAd")]
    public class Paster : VSPaste.VSPaste
    {
        public override DialogResult CreateContent(
            IWin32Window dialogOwner, 
            ref string newContent)
        {
            DialogResult dr = base.CreateContent(dialogOwner, ref newContent);
            newContent = newContent.Remove(
                newContent.IndexOf("<a href=\"http://11011.net/software/vspaste\"></a>"));
            return dr;
        }
    }
}

参考资料:

posted @ 2010-05-14 14:37 麒麟.NET 阅读(...) 评论(...) 编辑 收藏