之前看了李永京老师讲解的排版技巧,觉得受益匪浅,于是我也决定用 Live Writer 来发表 blog,并且看了里面提到的 VSPaste 插件,浏览一下,发现使用起来有两处不怎么如意的地方:

  1. 我的 VS 编辑器设置了背景颜色,而插件作者在后来的版本中加入了背景颜色的支持,但是输出效果很不好看,而且输出的 HTML 有一大堆 background:#.... ,我觉得我不需要不同背景颜色的代码块,在 .code{ } 里面定义更好……
  2. Undent 问题,多数时候我并不想将全部代码贴出来,但是选择中间一部分代码复制进文章编辑区以后缩进问题就难搞了,可能是 <pre> 标记的问题吧,Shift+Tab 不能用……
  3. 最后的那一个空链接,这个影响不大,不过既然决定要改,顺便去掉也未尝不可……

不怎么如意的地方:

我是首先从研究 Live Writer 的插件怎么写开始。查看安装目录,发现了一大堆形如 WindowsLive.Client.dll、WindowsLive.Writer.Controls.dll 的 dll 文件,暗喜,会不会是用 .Net 写的呢?赶快 Reflector 一下,Cool! 是 .Net 写的,有希望了!

然而看了一大堆反编译的代码也看不出什么东西来,记得下载 Live Writer 的时候网站上好像有 SDK,于是又打开那个网页找,只有CTP的,于是就看他们的 Team Blog,哈哈,给我找到了一段视频,介绍怎么做一个 Hello World 插件,根本不用什么 SDK,开个VS library project,引用安装目录的 WindowsLive.Writer.Api.dll 就可以开始了!

弄明白原理,也知道自己可以修改那个下载回来的插件(反编译->修改->重新编译),那就动手!

第一个想到的反编译工具是当然是 Reflector:

导出后没有修改过,直接编译通过,我以为胜利了,谁知这插件不运行还好,一运行 Live Writer 就死掉了……我很奇怪,但是没找到原因~~

这个不行,ildasm 呢?启动 VS2008 Command Prompt,选个好目录,

> ildasm vspaste.dll /out=vspaste.il

cool,成功了

> ilasm vspaste.il /dll

cool,也成功了

复制进安装目录,运行,COOL!这种做法没问题!

但问题随之而来,我不懂 IL 啊…… 不过我能做的第一步就是将最后的空链接去掉,嘿嘿!

还是需要 Reflector(当时我头脑还没有反应过来,思想还在手动改IL中,由于凭空写我当时该怎么做可能有错,就如实将我的笨方法拿出来了:))

在反编译的工程里查找 "background:",发现 HTMLRootProcessor 里面有个 SyncColors 方法,其中一段代码如下:

if (this.background.HasValue)
{if (this.color.HasValue){this.writer.Write(';');}this.writer.Write("background:");this.writer.Write(this.colors.CssColor(this.background.Value));
}

正是这段代码实现了背景色的加入,我就在这里头脑发昏了,想将这段 IL 去掉或者改成 if(false) 或者 if(1>2)……

去掉是最好的了,但是居然报错了,仔细看IL代码,发现在 System.IO.TextWriter::Write(char) 上面有两句是 brtrue.s  label,估计是 if 转跳了,查了一下,还真没猜错,嘿嘿,在前面的 brtrue.s 加上一句 ldc.i4.1,if(true) goto ... 哈哈,编译。Yeah!! 复制进去的代码没有背景颜色啦!

长时间泡在IL里很头痛,而且还有一个缩进功能还没有实现!总不能自己写IL啊~~该想想办法了!

猛然醒起 Reflector 还可以看IL的!

办法马上就出来了!先在 Visual Studio 中改写原来残缺的 Undent 方法:

public static string Undent( string s )
{var beginSpaces = new System.Text.RegularExpressions.Regex("^(?:<span[^>]*>|)( +)");var depth = beginSpaces.Match(s).Groups[1].Value.Length;if ( depth == 0 ) return s;var space2trim = new System.Text.RegularExpressions.Regex("^(<span[^>]*>|) {" + depth + "}", System.Text.RegularExpressions.RegexOptions.Multiline);var tmp = space2trim.Replace(s, "$1");var garbageSpan = new System.Text.RegularExpressions.Regex("^<span[^>]*></span>", System.Text.RegularExpressions.RegexOptions.Multiline);return garbageSpan.Replace(tmp, String.Empty);
}

编译,将 dll 放到 Reflector,复制该方法的 IL 代码:

那么长……晕死我了……

合并进 VsPaste.il 编译后,我们的改造工程就完成了!改好的 dll 文件等一下发上来,需要的朋友可以直接下载,这个 dll 文件放到 Live Writer 安装目录的 Plugins 文件夹里面即可。

最后,本人第一次在首页发表随笔,虽然很菜,但是觉得我做的这个修改对大家都有好处,也是原创内容,望各位管理员手下留情,如果还有其他我应该改进的地方,请各位多多指教!

========修改过的插件的下载地址: http://files.cnblogs.com/Diryboy/vspaste.rar

转载于:https://www.cnblogs.com/Diryboy/archive/2008/12/02/1345407.html

自己改造 VSPaste 插件相关推荐

  1. Android 热修复使用Gradle Plugin1.5改造Nuwa插件

    随着谷歌的Gradle插件版本的不断升级,Gradle插件现在最新的已经到了2.1.0-beta1,对应的依赖为com.android.tools.build:gradle:2.0.0-beta6,而 ...

  2. 对微软Web Deploy的一次艰难调试

    2011年初开始做一个项目,开始体验使用微软网站发布工具来发布网站.在服务器端安装发布服务后,可以在Visual Studio界面中右键点击Web项目,再点发布,第一次填好发布设置,以后就可以实现一键 ...

  3. 【深入浅出MyBatis系列八】SQL自动生成插件

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 深入浅出MyBatis系列 [深入浅出MyBatis系列一]MyBatis入门 [深入浅出MyBatis系列二]配置 ...

  4. 《Android插件化技术——原理篇》

    | 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头.从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结 ...

  5. 如何改造现有文件为 CMD 模块

    经过一段考察,我们终于要在项目中引入模块机制和 Sea.js 了,那么如何将现有的文件改造成 CMD 模块就成了重要的问题.下面针对一些典型场景来说明包装的方式. 首先还是请大家详细了解下 CMD 模 ...

  6. 2020-Android-大厂面试(五)插件化

    } } catch (Exception e) { e.printStackTrace(); } 替换了主工程context中LoadedApk的mResource对象 将新的Resource添加到主 ...

  7. 2020 Android 大厂面试-插件化、模块化、组件化,移动开发工程师的岗位职责

    替换了主工程context中LoadedApk的mResource对象 将新的Resource添加到主工程ActivityThread的mResourceManager中,并且根据Android版本做 ...

  8. 2020 Android 大厂面试-插件化、模块化、组件化,android开发环境的搭建视频

    if (Constants.COMBINE_RESOURCES) { //插件和主工程资源合并时需要hook住主工程的资源 Resources resources = ResourcesManager ...

  9. 2020-Android-大厂面试(五)插件化、模块化,不同层级的Android开发者的不同行为

    1. startActivity 的时候最终会走到 AMS 的 startActivity 方法 2. 系统会检查一堆的信息验证这个 Activity 是否合法. 3. 然后会回调 ActivityT ...

最新文章

  1. 用C#创建Windows服务(Windows Services)
  2. Spring系列之一 Spring MVC
  3. 一不小心就掉大啦《数组使用注意》
  4. python pca主成分_超越“经典” PCA:功能主成分分析(FPCA)应用于使用Python的时间序列...
  5. cassss服务未启动_电梯启动死机故障处理方法
  6. 国内几大最让游戏建模师羡慕的企业,你想进去吗?
  7. python字典类型写入文件_python 字典写入文件
  8. 在有空字符串的有序字符串数组中查找(二分)
  9. Scrapyd发布爬虫的工具
  10. 2.高性能MySQL --- MySQL 基准测试
  11. java智能社下载_08 深入javascript
  12. Nexus下载、安装与使用
  13. 计算机上图片打不开,为什么电脑图片打不开_解决电脑图片打不开的四种方法...
  14. 使用阿里云ESC服务器的时候域名解析成功为何打不开网站?
  15. Y430P 重装Ubuntu16.04双系统以及装完系统要做的事
  16. 【Error】 the public key is not available: NO_PUBKEY 4F4EA0AAE5267A6C
  17. Android模拟器知识以及改造
  18. curaengine linux编译,CuraEngine_vs-master 在vs编译的curaengine - 下载 - 搜珍网
  19. 周易六十四卦——比卦
  20. 大数据之Hadoop学习——动手实战学习MapReduce编程实例

热门文章

  1. linux如何停用xdmcp服务,如何禁用XDMCP服务
  2. python合并两个文本文件内容_用Python 将两个文件的内容合并成一个新的文件.
  3. uva 11997——K Smallest Sums
  4. 343. 整数拆分 golang 动态规划
  5. 计算机网络【4】传输层
  6. C++转换构造函数和类型转换函数
  7. 生产者-消费者模型的两种实现方式
  8. Epoll 的tcp通信代码(服务器+客户端)
  9. 数据结构(五)层次遍历
  10. 【数据库】数据库基本概念:数据库管理系统 / 数据库 / 表 / 数据