為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插件可以下載

實例:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM