让Paste as Visual Studio Code支持Visual Studio 2010粘贴的中文--自己动手丰衣足食

简介: Paste as Visual Studio Code 是Windows Live writer上很好的插件,我们许多人都用它写blog。代码就可以从Visual Studio直接粘贴到博文中,并以彩色显示。

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。下载

目录
相关文章
|
消息中间件 存储 负载均衡
深入了解Kafka中Topic的神奇之处
深入了解Kafka中Topic的神奇之处
788 0
|
机器学习/深度学习 传感器 算法
【光学】基于matlab模拟光纤布拉格光栅FBG反射谱和透射谱仿真
【光学】基于matlab模拟光纤布拉格光栅FBG反射谱和透射谱仿真
|
数据可视化 JavaScript 前端开发
Plotly 的主要特点
Plotly 的主要特点
329 1
|
9月前
|
数据采集 自然语言处理 监控
《一文破解!自然语言处理论文实验复现秘籍》
在自然语言处理(NLP)领域,复现学术论文实验是将理论转化为实践的关键。前期需深入研读论文、收集数据与代码资源;搭建环境时要配置开发工具和预处理数据;模型训练中注重架构实现、优化器选择及训练监控;最后通过评估指标、结果对比与可视化分析确保复现成功。这一过程不仅验证研究成果,还提升技术能力,推动NLP领域的发展。
284 16
|
9月前
|
API 数据安全/隐私保护 开发者
alibaba阿里巴巴国国际站商品详情数据示例参考
阿里巴巴国际站商品详情数据包含了丰富的商品信息,以下是一个示例参考,展示了通过调用阿里巴巴国际站的API接口(如item_get)可以获取到的商品详情数据:
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
以史为鉴,未雨绸缪:身处“大模型掀起的AI浪潮中”的感悟和思考
本文旨在帮助读者更深入地理解大模型和AI技术,重点介绍关键技术革新的背景与影响,特别是本次大模型时代和新一轮AI浪潮的推动因素与发展历程。
|
10月前
|
人工智能 搜索推荐 安全
《AI赋能鸿蒙Next视频内容分析与理解,开启智能新视界》
鸿蒙Next结合人工智能,特别是盘古大模型,为视频内容分析、理解与处理带来创新。系统可精准识别图像、语音和文本,实现智能分类、个性化推荐及内容审核,确保安全合规。同时,支持智能剪辑、创作及质量优化,提升用户体验。未来,AI将持续优化,推动视频领域创新发展。
341 3
|
11月前
|
安全 Java 开发者
final 到底有啥用,99% 的开发者可能只知道一半!
本场主题主要是了解final的各项功能,并且在面试中如何能够自信回答面试官询问final的用途。内容主要为以下五部分。 1.自我经历 2.final修饰变量 3.final修饰类 4.final的实际应用场景 5.面试问答汇总
|
Web App开发 编解码 iOS开发
iOS字体像素与磅的对应关系
iOS字体像素与磅的对应关系
1123 1
|
人工智能 分布式计算 安全
【现代密码学】笔记1.2 -- 对称密钥加密、现代密码学的基本原则《introduction to modern cryphtography》现代密码学原理与协议
【现代密码学】笔记1.2 -- 对称密钥加密、现代密码学的基本原则《introduction to modern cryphtography》现代密码学原理与协议
869 0