惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
罗磊的独立博客
F
Fortinet All Blogs
T
Threatpost
Y
Y Combinator Blog
博客园_首页
美团技术团队
Security Latest
Security Latest
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
V
V2EX - 技术
The Cloudflare Blog
L
LINUX DO - 热门话题
博客园 - 司徒正美
Jina AI
Jina AI
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Hacker News
The Hacker News
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Latest news
Latest news
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
雷峰网
雷峰网
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
W
WeLiveSecurity
D
DataBreaches.Net
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
S
Securelist
Help Net Security
Help Net Security

博客园 - DiryBoy

修复运行 tasklist 命令时提示 ERROR: Not found 删除坏掉的 Active Directory Domain 为 WSUS 服务器定期运行清理向导 为 Exchange 服务器编写自定义的反垃圾插件 Windows 10 下安装 npm 后全局 node_modules 和 npm-cache 文件夹的设置 在 Win10 命令行使用 Consolas + 微软雅黑 Setting up SSL for SCM-Manager with Microsoft CA and TortoiseHg Installing SCM-Manager Win 7 装 SQL Server 2008 后使用 Asp.Net 需要进行的一些配置 为 IE8 写一个转跳加速器 WPF 实现已绑定集合项目的移除时动画过渡 成功在 Win 7 下用 VirtualBox 装 Win 7,分享一些经验 如何写递归的 Lambda 表达式 使用动态生成的委托提高调用动态程序集的性能 在 Azure 中部署支持 MVC 的 Asp.Net 应用程序 DIY 自己的多点触摸系统 未来就在眼前 用 C# 实现的前缀树 - Trie 用C# 写的龙贝格(Romberg)积分法
自己改造 VSPaste 插件
DiryBoy · 2008-12-02 · via 博客园 - DiryBoy

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