经常要往blog里贴代码,没个代码高亮实在有点落伍。找来找去,wordpress下也就WP-Syntax最好用了,支持的语言也比较多,像linux下的bash, vim都可以被高亮化。不过WP-Syntax也并非完美,有些地方和我的使用习惯相差甚远:

先来看下改造前和改造后的代码吧:

wp-syntax

  1. pre标签被两层div嵌套,代码冗余
  2. pre标签内被硬植入字族的inline stylesheet,覆盖了我的CSS设置
  3. 插件自带的CSS文件重置了我的CSS设置
  4. 自动转义<, >, &这类代码,问题是稍有经验的coder都会事先自己主动转义过的,所以之前已经转义过了的代码反而会以&lt;, &gt;, &amp;这类形式输出

首先改造代码嵌套的问题

找到插件目录下的wp-syntax.php文件,搜索wp_syntax_highlight函数,将以下几行注释掉(注释行前加了//符号):

function wp_syntax_highlight($match)
{
    global $wp_syntax_matches;
    ......
    if ($escaped != "false") $code = htmlspecialchars_decode($code);

    $geshi = new GeSHi($code, $language);
    $geshi->enable_keyword_links(false);
    do_action_ref_array('wp_syntax_init_geshi', array(&$geshi));

    //$output = "\n<div class=\"wp_syntax\">";

    if ($line)
    {
    ......
    }
    else
    {
	//$output .= "<div class=\"code\">";
        $output .= $geshi->parse_code();
	//$output .= "</div>";
    }
	//return

	//$output .= "</div>\n";

    return $output;
}

转义问题

还是wp_syntax_highlight函数,将这句:

if ($escaped == "true") $code = htmlspecialchars_decode($code);

替换成

if ($escaped != "false") $code = htmlspecialchars_decode($code);

就是了,也就是说除非手动在<pre>里加入escaped="false"参数,输出的代码是不会自动转义的。

硬植入CSS问题

由于WP-Syntax可以方便的调用wp_syntax_init_geshi来修改geshi的初始设置,解决CSS问题可以不需要修改WP-Syntax本身的插件代码,全部在主题文件夹下的functions.php里就可以搞定了。

首先解决往pre里插入字族设置的问题,在functions.php里加入一函数:

function my_custom_geshi_styles(&$geshi) {
    $geshi->set_overall_style('');
    $geshi->set_code_style('');
};

它会把geshi预设的inline stylesheet全部清除为空,然后再利用Wordpress的add_action hook重新初始化geshi的设置,在functions.php里加入这句:

add_action('wp_syntax_init_geshi', 'my_custom_geshi_styles');

至于去掉WP-Syntax自带的CSS文件就更简单了,还是往functions.php里添加一句remove_action的hook就是了:

remove_action('wp_head', 'wp_syntax_head');

其实WP-PageNavi带的那两三行代码的CSS文件也可以这么干掉:

remove_action('wp_head', 'pagenavi_css');

小结

其实Wordpress主题文件夹下的functions.php文件是相当有用的,利用Wordpress本身提供的Plugin API, 很多东西都可以直接在functions.php下直接用一个函数挂上action或者filter的钩子就搞定了。

5 Reponses So Far ↓

  1. wcchen:

    add_action(‘wp_syntax_init_geshi’, ‘my_custom_geshi_styles’);
    remove_action(‘wp_head’, ‘wp_syntax_head’);
    remove_action(‘wp_head’, ‘pagenavi_css’);
    ??? Where to add in functions.php ???

  2. Anywhere inside the <?php … ?> wrap

  3. bolo:

    很深奥,改造以后效果有什么不同呢?

  4. bolo:

    嗯,改造以后效果更好啊

  5. 正为这事发愁呢。这招非常好啊!

Leave a Reply ↓