Paste as Visual Studio Code 是Windows Live writer上很好的插件,我们许多人都用它写blog。代码就可以从Visual Studio直接粘贴到博文中,并以彩色显示。我们很需要它。可是官方的版本不支持中文。如果代码里有中文字符,从Visual Studio2010粘贴中文到Live writer,发现代码的中文都变成了乱码,或者有些字丢失了。开始不明白是什么原因,就琢磨了一下。下面把步骤写一下,供需要的同仁参考。
1. 解出其源代码
找到该插件的DLL, C:\Program Files (x86)\Windows Live\Writer\Plugins\LavernockEnterprises.PasteAsVSCode.dll,用Reflector打开。右键点最上面一层的“LavernockEnterprises.PasteAsVSCode”节点,选“Export”,然后再选定一个路径,就可以将其所有类都找出其源代码。其间会要求定位“WindowsLive.Writer.Api.dll”,找到就是了,在C:\Program Files (x86)\Windows Live\Writer。即Live writer安装的目录。WindowsLive.Writer.Api.dll也会被Reflector打开。不需要解出WindowsLive.Writer.Api.dll的源码。如此这样就可以将其全部源码都解出。
2. 整理其代码
找到源代码输出的目录,发现有一个LavernockEnterprises.PasteAsVSCode.csproj,还有一个LavernockEnterprises目录。双击LavernockEnterprises.PasteAsVSCode.csproj,打开了Visual Studio 2010. 因为目前Reflector输出的csproj文件的版本是Visual Studio 2008支持的,需要转换成Visual Studio 2010支持的格式。Visual Studio 2010会先转换它。一路点Next(呵呵,机械性的),最后转换结束。先保存,.sln文件就保存了。点一下Build->Rebuild solution。发现不能编译。后来发现是对WindowsLive.Writer.Api.dll的引用损坏。就将该引用删除,然后重新从C:\Program Files (x86)\Windows Live\Writer下加了一下对WindowsLive.Writer.Api.dll的引用。再编译,就可以通过了。
3. 分析其代码
看了一下该工程,里面就四个cs文件是主要的:PasteAsVSCodeProperties.cs,PasteAsVSCodeGenerator.cs,PasteAsVSCodeEditor.cs,PasteAsVSCode.cs。大概浏览了一下,
发现其内的一个叫”PasteAsVSCodeGenerator“的类中有一个方法是叫这样的名字:
private string GenerateHtmlFromRtf(string rtf)
就是用于产生HTML的核心代码。该方法很长,也挺复杂,一时间不容易懂。于是就调试该方法。该工程是一个Class library类型的工程,不可能作为主程序启动。那么就打开工程“LavernockEnterprises.PasteAsVSCode”的Properties窗口。
走到Debug页,在Start Action节选定”Start external program, 然后再点击右边的查找文件按钮(三个点的按钮)。找到WindowsLiveWriter.exe并选定它。如图。另外,到LiveWriter插件的目录,即此处C:\Program Files (x86)\Windows Live\Writer\Plugins,将官方版本的DLL改名成LavernockEnterprises.PasteAsVSCode.dll1,然后再到Properties窗口的Build页,将Output path设定成C:\Program Files (x86)\Windows Live\Writer\Plugins。这是要做什么?其实就是将你编译的DLL替换官方的DLL。一切准备停当,可以开始调试了。
4. 调试其代码
在GenerateHtmlFromRtf方法内部设断点,按F5键运行程序,只见Windows Live Writer在启动。等启动完成了。在Visual Studio 2010里面打开一个有中文字的cs文件。选取一段有中文字的代码,Ctrl + C复制,再切换到Live Writer,点插件里面的“Paste As Visual Studio Code“,很快就会在断点处断下来。然后一步步跟着走程序。这个Visual Studio贴出来的内容是Rtf格式的。GenerateHtmlFromRtf方法负责将Rtf格式全部转化成HTML代码。现在就是对中文支持不好。就是要找到其根源。这么一行代码复制到剪贴板上之后,
- this.Text = "VS2010复制内容乱码修正";
其Rtf是:
{\rtf\ansi{\fonttbl{\f0 NSimSun;}}{\colortbl;\red0\green0\blue255;\red163\green21\blue21;}\f0 \fs19 \cf1 this\cf0 .Text = \cf2 "VS2010\uinput2\u22797 ?′\uinput2\u21046 ??\uinput2\u20869 ?ú\uinput2\u23481 èY\uinput2\u20081 ?ò\uinput2\u30721 ??\uinput2\u20462 DT\uinput2\u27491 ?y"\cf0 ;\par }
经过多轮的调试发现,其如下一行代码有问题:
Regex regex = new Regex(@"(?<![\\])((\\u(?<dec>-?\d+) \?)|(\\'(?<hex>[0-9a-f]{2}))|(\\[a-z*]+-?(?<dec>\d*) )|(\\[a-z*]+-?(?<dec>\d*))(?=[\W])|\{|\})|\t|\\\\|\\{|\\}|\\~");
准确地说是这段正则有问题(\\u(?<dec>-?\d+) \?)。Rtf里面有诸如\u20081 ?ò这样的字符。\u20081是中文的Unicode. ?ò可能是乱码。正是造成前述的正则不工作的原因。
于是将(\\u(?<dec>-?\d+) \?)改成(\\u(?-?\d+)\s..),这样可以处理每一个汉字的Unicode了,但是中文字还是没有出来,原来在另外一处也有类似的正则,也改成:
if (Regex.IsMatch(str5, @"\\u-?\d+\s.."))
于是,中文字就可以顺利地贴到Live Writer里面了。
下面只是一个展示,表示已经可以贴中文字。
有中文字的示例代码
- this.button1.Location = new System.Drawing.Point(2, 1);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(205, 40);
- this.button1.TabIndex = 0;
- this.button1.Text = "修正剪贴板内容";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.button1_Click);
- //
- // linkLabel1
- //
- this.linkLabel1.AutoSize = true;
- this.linkLabel1.Location = new System.Drawing.Point(70, 44);
- this.linkLabel1.Name = "linkLabel1";
- this.linkLabel1.Size = new System.Drawing.Size(120, 13);
- this.linkLabel1.TabIndex = 1;
- this.linkLabel1.TabStop = true;
- this.linkLabel1.Text = "三角猫 http://zu14.cn/";
- this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
最后提供下载修改过的DLL。下载