为WLW开发Latex公式插件

WLW是写博客的利器,支持离线、格式排版等,而且拥有众多的插件。博客园推荐了代码插入插件,但是没有提供WLW的公式编译插件。目前我的一般做法是:先在Word下使用MathType编辑好公式,然后将公式复制到WLW的本文中,总感觉有点麻烦。

简单学习了WLW插件的开发,决定自己开发一个WLW代码插入插件。比较简单,按照以下步骤,大家可以开发属于自己的公式插入插件。

首先,开发公式插入插件涉及两方面内容。一方面是公式的编辑,一般采用Latex数学排版,为了解析LaTex函数,我们需要Latex解析链接库,而Google Chart API提供了Latex的在线接口如下:http://chart.apis.google.com/chart?cht=tx&chl={latex},其中{latex}就是要生成的代码,这里使用Google API(这样开发的插件使用中就需要联网了)。另一方面是WLW中插件的开发,介绍如下:

目前为止,Windows Live Writer的扩展功能还不是很强,它提供给我们如下两个方面对其扩展的可能:

a.应用程序级别的API:这部分API让我们能够在外部程序中启动并调用到Windows Live Writer的功能,以COM组件的形式提供。如果你要编写一个Firefox工具条上的小按钮,例如 “Blog It!” 之类,那么显然应该使用这类API。
b.文章内容插件:这部分API允许开发者对正在书写的文章内容进行修饰,实现与Windows Live Writer中自带的“Insert Link...”、“Insert Picture...”等类似的功能。若要编写文章内容插件,则需要从ContentSource或SmartContentSource两个基类中选择其一并继承自它。这两个基类提供了编写文章内容插件所需要的基础设施。ContentSource和SmartContentSource的区别如下:

ContentSource:如果你需要编写的插件将要在内容中插入一段简单的,插入之后不再修改(所谓“单向插入”)的内容片断,例如一个超链接,或是自定义的一段版权信息等,那么应该选择该类型的基类。Windows Live Writer中自带的“Insert Link...”就属于这类插件。
SmartContentSource:如果你需要编写的插件将在内容中插入一段较为复杂的,插入之后还可能要修改(所谓“双向交互”)的内容片杜阿,例如一张图片、一幅地图等,那么则应该选择这个类型的基类。Windows Live Writer中自带的“Insert Picture...”就属于这类插件。

可见,开发公式插件时选择ContentSource就可以了。

然后,编程实现插件的基本功能。

1.使用Visual Studio 2010新建C# Windows窗体应用程序。

2.设计插件的界面,界面如下:

image

3.实现各按键的功能,包括粘贴、预览、插入、取消,如下:

public partial class MainForm : Form
{
    private static readonly string PicUrlPattern = @"http://chart.apis.google.com/chart?cht=tx&chl={0}";
    private static readonly string ImgTag = "<img src=\"{0}\" alt=\"{1}\" />";
    public MainForm()
    {
        InitializeComponent();
    }

    private void 粘贴_Click(object sender, EventArgs e)
    {
        string content = Clipboard.GetText();
        textBox_tex.Text = content;
    }

    private void 预览_Click(object sender, EventArgs e)
    {
        if (check())
        {
            pictureBox_Preview.ImageLocation = ImgUrl;
        }
    }

    private void 插入_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.OK;
    }

    private void 取消_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
    }

    public string ImgUrl
    {
        get { return String.Format(PicUrlPattern, HttpUtility.UrlEncode(textBox_tex.Text)); }
    }

    public string ImgInTag
    {
        get { return String.Format(ImgTag, ImgUrl, textBox_tex.Text); }
    }

    private bool check()
    {
        if (textBox_tex.Text.Trim() == "")
        {
            MessageBox.Show(this, "请填写latex");
            return false;
        }
        return true;
    }
}

注意:HttpUtility在System.Web库中,需要添加引用System.Web.dll,并在文件头部添加using System.Web。如果没有找到System.Web.dll,把项目属性中的目标框架修改为.NET Framework 2.0即可,推荐使用2.0,发现.net 4.0开发的插件和我的WLW版本不兼容幽灵

调试程序,直至窗口可以正常运行。

创建接口类,将上述窗口转化为WLW插件。

a.添加对WindowsLive.Writer.Api的引用(WLW的安装目录下WindowsLive.Writer.Api.dll),并添加using WindowsLive.Writer.Api;。

b.将项目属性中输出类型修改为类库,删除Program.cs文件。

c.新建一个类,继承自ContentSource,并覆盖相应方法。

[WriterPlugin("adf1e416-b2e9-44e1-8612-c405bbcf1359",
    "插入Latex",
    PublisherUrl = "http://www.cnblogs.com/houkai/",
    ImagePath = "tex.png",
    Description = "插入公式")
]
[InsertableContentSource("插入公式")]
public class LiveWriterLatexPlugin : ContentSource
{
    public override DialogResult CreateContent(IWin32Window dialogOwner, ref string content)
    {
        using (MainForm form = new MainForm())
        {
            DialogResult result = form.ShowDialog();
            content = form.ImgInTag;
            return result;
        }
    }
}

注意我们为该类添加了WriterPlugin属性:

第一个参数为一个Guid,可以通过Guid生成器得到即可,如http://www.guidgenerator.com/online-guid-generator.aspx,起标识的作用。

第二个参数为该插件的名称,将在Windows Live Writer的插件管理器中看到。image

第三个参数PublisherUrl为发布者的网站地址。

第四个参数ImagePath为插件的图标文件路径,下载或自己制作一个好看的png图片(png格式透明,比较好看),添加到项目中,修改图片的”生成操作”为“嵌入的资源”即可。

image

第五个参数Description为插件的一小段描述介绍,表示插入选项中该插件的详细信息。

该类还应用了InsertableContentSource属性,此属性本用于定义插件在WLW的“Insert”菜单和“Insert”快捷面板的名称,但新版的WLW已经去除了插入菜单与侧边栏,因此应用此属性只是为了保持向前兼容。

注意CreateContent()方法的第二个参数为ref string newContent,这个ref string就表示由该插件生成的HTML代码。

最后编译Release生成DLL文件,将DLL文件放到WLW安装目录的Plugins下,重启WLW即可。

我的Latex公式插件可下载。有很多博客中介绍了WLW插件的开发,大家有兴趣可以学习插件开发的详细内容。剩下的内容就是Latex下如何进行数学公式的编辑了,下节再介绍吧。

维护版本(由于google chart api地址修改,原插件已失效)

最新的Latex插件可以下载

实例:

posted @ 2013-10-31 11:07  侯凯  阅读(...)  评论(...编辑  收藏