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.設計插件的界面,界面如下:

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的插件管理器中看到。
第三個參數PublisherUrl為發布者的網站地址。
第四個參數ImagePath為插件的圖標文件路徑,下載或自己制作一個好看的png圖片(png格式透明,比較好看),添加到項目中,修改圖片的”生成操作”為“嵌入的資源”即可。

第五個參數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插件可以下載
實例:
