zoukankan      html  css  js  c++  java
  • 让Paste as Visual Studio Code支持Visual Studio 2010粘贴的中文自己动手丰衣足食

    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的源码。如此这样就可以将其全部源码都解出。

    Export Source Code of assembly

    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窗口。

    Project 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代码。现在就是对中文支持不好。就是要找到其根源。这么一行代码复制到剪贴板上之后,

    1. 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里面了。

    下面只是一个展示,表示已经可以贴中文字。

    有中文字的示例代码
    1. this.button1.Location = new System.Drawing.Point(2, 1);
    2. this.button1.Name = "button1";
    3. this.button1.Size = new System.Drawing.Size(205, 40);
    4. this.button1.TabIndex = 0;
    5. this.button1.Text = "修正剪贴板内容";
    6. this.button1.UseVisualStyleBackColor = true;
    7. this.button1.Click += new System.EventHandler(this.button1_Click);
    8. //
    9. // linkLabel1
    10. //
    11. this.linkLabel1.AutoSize = true;
    12. this.linkLabel1.Location = new System.Drawing.Point(70, 44);
    13. this.linkLabel1.Name = "linkLabel1";
    14. this.linkLabel1.Size = new System.Drawing.Size(120, 13);
    15. this.linkLabel1.TabIndex = 1;
    16. this.linkLabel1.TabStop = true;
    17. this.linkLabel1.Text = "三角猫 http://zu14.cn/";
    18. this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);

    最后提供下载修改过的DLL。下载

  • 相关阅读:
    市场规模的估算
    C#中的线程(一)入门 转载
    2.设计模式-Abstract Factory 抽象工厂模式
    1.设计模式
    Microsoft.Jet.OLEDB.4.0读取EXCEL数据
    转载--加盐密码哈希:如何正确使用
    ragel学习资源整合
    开源库xlslib跨平台编译
    WPF开源框架以及经典博客
    (转载)值得推荐的C/C++框架和库 (真的很强大)
  • 原文地址:https://www.cnblogs.com/mikelij/p/1876199.html
Copyright © 2011-2022 走看看