经常要往blog里贴代码,没个代码高亮实在有点落伍。找来找去,wordpress下也就WP-Syntax最好用了,支持的语言也比较多,像linux下的bash, vim都可以被高亮化。不过WP-Syntax也并非完美,有些地方和我的使用习惯相差甚远:
先来看下改造前和改造后的代码吧:
pre
标签被两层div
嵌套,代码冗余pre
标签内被硬植入字族的inline stylesheet
,覆盖了我的CSS设置- 插件自带的CSS文件重置了我的CSS设置
- 自动转义
<
,>
,&
这类代码,问题是稍有经验的coder都会事先自己主动转义过的,所以之前已经转义过了的代码反而会以<
,>
,&
这类形式输出
首先改造代码嵌套的问题
找到插件目录下的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的钩子就搞定了。
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 ???
Anywhere inside the <?php … ?> wrap
很深奥,改造以后效果有什么不同呢?
嗯,改造以后效果更好啊
正为这事发愁呢。这招非常好啊!