终于解决了auto-syntaxhighlighter和simple-tag之间的冲突问题

时间:2010年09月23日作者:Winson查看次数:查阅:706评论次数:10

对于一个以编程技术为主的博客站,auto-syntaxhighlighter这类代码高亮插件是必不可少的,之前一直在用wp-code,感觉还可以,只是样式总觉得不太像样,于是想尝试一下整合自 syntaxhighlighter 的 auto-syntaxhighlighter,这款插件出来的样式效果比较好也比较接近 vs 里的配色(当然自己可以更改,只是如果相差太远改起来就麻烦了),而且 auto-syntaxhighlighter 还有个好处就是,已将按钮整合到 WP 的编辑器里了,这样就不用每次去记什么代码(wp-code就要手工输入,总是不记得格式 :unsure: ).

不过 auto-syntaxhighlighter  还是有其缺点,最重要的个问题就是与我现有的 simple-tag 的 auto link功能之间有冲突,只要在代码框里包含了当前日志的标签,那就会直接在里面代码里把超链的源码显示出来,弄得非常难看,代码里的格式也乱了。举个例子,我的日志里有一个名为 Provider 的标签,同时在我的代码框里也用到了此单词,于是就会将此单词的智能标签链接的源码也在代码框里显示出来了 :sideways:

曾去过  auto-syntaxhighlighter 作者网站问过,他觉得应该是 simple-tag 去处理这问题,应该过滤掉 <pre> 标签里的代码不加自动链接,但我又有另一个问题,就是之前我使用 wp-code 时也一样使用了 <pre> 标签来框住代码的,为什么 wp-code 以很正常呢?

呵,于是我只好自己想办法解决了,虽然不知道真正的原因是什么,但从原理上来讲,只需在代码输出时,将 simple-tag 生成的链接代码替换掉不就得了吗? 我对 PHP 并不熟悉,但为了解决这个问题,只好硬着头皮看看代码了,只要是代码有,一定能解决的  :wink:

首先了解了下 WP 的插件机制,找到在注册插件模块时,原来是有个先后次序的参数的(默认为10,而wp-code的为12),即 add_filter 函数,要替换掉 simple-tag 生成的代码,就必须保证 auto-syntaxhighlighter 运行于 simple-tag 之后,所以要先修改其 add_filter 函数:

1、修改 auto-syntaxhighlighter.php 文件,将以下代码

111
 add_filter('the_content', array(&amp;$this, 'getContentLang'));

改为

111
add_filter('the_content', array(&amp;$this, 'getContentLang'),99);

2、然后开始使用正则对相关的代码进行替换,由于对PHP不熟,这部分花了我好长时间  :unsure:

找到 function getContentLang($content) 这个函数进行修改,在最后返回  $content 之前添加以下代码以替换掉生成的链接代码:

123
124
125
126
127
128
129
130
131
132
133
134
//replace the simple-tag auto link tag by Winson(coderblog.in) ==== begin =====
preg_match_all('/&lt;pre[^&gt;]*&gt;([\s\S]*?)&lt;\/pre&gt;/i', $content, $result);

$match = array_unique($result[1]);
if(!empty($match)) {
foreach($match as $r) {
$tmp = $r;
$r = preg_replace("/&lt;a href=[\'\"]?.+[\'\"]?(\s.+)? class=\"st_tag internal_tag\" rel=[\'\"]?.+[\'\"]?(\s.+)?title=[\'\"]?.+[\'\"]?(\s.+)?&gt;(.+)&lt;\/a&gt;/i", '$4', $r);
$content = str_replace($tmp, $r, $content);
}
}
//replace the simple-tag auto link tag by Winson(coderblog.in) ==== end =====

只要完成以上2步,问题就解决了,就这么简单  :biggrin:

为了方便些,我还修改了一下其插入代码的窗口,添加了直接设置高亮行数和起始行数的功能,只需修改 tinymce\window.php 文件即可。

OK, 最后我想说说我个人感觉 auto-syntaxhighlighter 的一些优缺点:

让我放弃wp-code而想迟办法要使用 auto-syntaxhighlighter 的原因,除了其样式比较漂亮外,还有其整合的直接插入的按钮功能,而且使用auto-syntaxhighlighter还可以高亮指定某行代码进行高亮显示,并且也能指定起始行数等。

至于其缺点嘛,感觉就是加载特别慢,不知道是否与加载的CSS过多有关,因 syntaxhighlighter 本身对CSS的渲染效率就不太高  :sad: ,希望以后会有所改善吧(不过看syntaxhighlighter好像也很长时间没有更新过了……)

10条评论
  1. MoLice留言于:2011年03月15日13:30 回复

    你用的3D标签云插件叫什么来的?

    • Winson留言于:2011年03月15日13:52 回复

      那个叫 WP-Cumulus

  2. 代码疯子留言于:2010年12月27日21:40 回复

    我用的Google-syntax-highlighter也和simple-tags冲突了,对php很不懂。暂时把simpletags禁用了。我在考虑换成你的搭配,不过那样的话,以前的代码都不高亮了。

    • Winson留言于:2010年12月27日22:30 回复

      嗯,是的,不过我当时换后,也把所有文章的代码都修改了一次,感觉找到一个好用的,换一次也就算了,以后方便就行,呵

  3. eleven留言于:2010年09月25日20:07 回复

    主页图片看不到,

    • Winson留言于:2010年09月25日20:31 回复

      嗯?什么图片?

  4. ImeeGo留言于:2010年09月24日11:52 回复

    你到底用了几个插件?

    • Winson留言于:2010年09月24日13:20 回复

      呵,这个与我使用插件多少有关系吗?不过说真的,我现在使用的插件还不少,将近30个吧,我是比较喜欢研究这东西的 :tongue:

      • ImeeGo留言于:2010年09月24日13:23 回复

        就问问,我用不到15个就怕空间受不了了

        • Winson留言于:2010年09月24日13:27 回复

          呵,我用的是自己的服务器,所以就不用担心这问题啦 :biggrin:

发表评论

*

*

1 + 7 = ?

:alien: :angel: :angry: :blink: :blush: :cheerful: :cool: :cwy: :devil: :dizzy: :ermm: :face: :getlost: :biggrin: :happy: :heart: :kissing: :lol: :ninja: :pinch: :pouty: :sad: :shocked: :sick: :sideways: :silly: :sleeping: :smile: :tongue: :unsure: :w00t: :wink: :wassat: :wub: :whistle:

无觅相关文章插件,快速提升流量