zoukankan      html  css  js  c++  java
  • 自己改造 VSPaste 插件

    之前看了李永京老师讲解的排版技巧,觉得受益匪浅,于是我也决定用 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:

    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!! 复制进去的代码没有背景颜色啦!

    去掉了背景颜色后的清爽 look

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

    猛然醒起 Reflector 还可以看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 代码:

    长长的 IL 代码,晕…… 那么长……晕死我了……

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

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

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

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/Diryboy/p/1345407.html
Copyright © 2011-2022 走看看