自定义WP-Syntax的代码样式

在Wordpress下,WP-Syntax是一款非常优秀的代码高亮显示插件,它将开源的代码高亮工具GeSHi应用到了Wordpress中。

但WP-Syntax提供的默认样式并不是对于所有WordPress主题都适用的,就像这里现在使用的Unborn主题,那么如何根据自己使用的主题来打造适合自己的代码样式以及配色方案呢?本文将进行一下简要的介绍。

基本样式

WP-Syntax默认使用插件内的wp-syntax.css作为其基本布局样式表。在需要根据主题风格进行改造的时候,只需将默认的wp-content/plugins/wp-syntax/wp-syntax.css文件复制到主题目录再进行改造。当然,你也可以自己在主题目录下新建一个wp-syntax.css文件用于覆盖默认样式。

.wp_syntax元素的background-color定义了整个代码区域的背景色,可以使用在线取色器获取颜色代码。有需要的话也可以将其替换成背景图片。

.wp_syntax .line_numbers元素内可以定义左侧可选的行号区域的样式。

高级自定义样式

因为高亮显示采取的是inline CSS的方式,而且也不会对高亮显示的部分添加class,所以我们不能使用外部样式表来覆盖代码文字的样式。这时,我们需要在function.php中添加如下的代码来自定义代码样式的输出:

PHP
1
2
3
4
5
6
add_action('wp_syntax_init_geshi', 'my_custom_geshi_styles');
 
function my_custom_geshi_styles(&$geshi)
{
    // We need some customizations here
}

也就是在WP-Syntax在初始化GeSHi的时候,加入我们的代码,修改GeSHi预定义的样式。

在GeSHi的帮助文档中可以看到,可以设置的项有:

  • Overall Styles - 总体样式
  • Line Number Styles - 行号样式
  • Keyword Styles - 关键字样式
  • Comment Styles - 注释样式
  • Other Styles - 其他

Overall styles将影响所有代码,但会被后面那些样式覆盖。设置方法都差不多,都是调用$geshi->set_[token_type]_style这样的函数来完成。具体函数的用法还是要去看帮助文档,其中参数可能会有$group, $styles, $preserve_defaults等。

$group代表某种类型token的组号或者组标示。看一下wp-content/plugins/wp-syntax/geshi/geshi目录下某种语言相应的PHP文件就可以知道每个$group对应哪些token。拿php.php为例,关键字中$group=1对应'as', 'break', 'case'等;而$group=2对应'namespace', 'new', 'private', 'public'等;$group=3则对应PHP的内部函数。

$styles是需要设置的CSS样式,常用的只要设置一下颜色就行了。

$preserve_defaults是一个boolean值,表明现在设置的样式是不是要在继承默认样式的基础上进行改动。默认值为false,即重新设置。

下面附上一段我在Unborn主题中使用的配色方案设置代码:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function my_custom_geshi_styles(&$geshi)
{
    $geshi->set_overall_style('color: #FFF; font-family:"Consolas",monospace,"Courier New"');
    $geshi->set_brackets_style('color: #CCC;', true); //括号颜色
    $geshi->set_keyword_group_style(1, 'color: #70B9EF;'); //第一组关键字
    $geshi->set_keyword_group_style(2, 'color: #996699;'); //第二组关键字
    $geshi->set_keyword_group_style(3, 'color: #FFF;'); //第三组关键字
    $geshi->set_methods_style(1, 'color: #FFF;'); //第一组方法名称
    $geshi->set_comments_style(1, 'color: #999;'); //第一组注释
    $geshi->set_comments_style(2, 'color: #33CC66;'); //第二组注释
    $geshi->set_comments_style('MULTI', 'color: #999;'); //多行注释
    $geshi->set_strings_style('color: #7ACC00;'); //字符串直接量
    $geshi->set_strings_style('color: #7ACC00;', false, 'HARD'); //字符串直接量(*)
    $geshi->set_regexps_style(0, 'color: #7AB9BE;'); //正则表达式
    $geshi->set_numbers_style('color: #FFCC00;'); //数字
    $geshi->set_symbols_style('color: #CCC;'); //符号
    $geshi->set_escape_characters_style('color: #99FF00;'); //转义字符
}

上面给出的代码中打(*)号的地方需要注意,最新版本的WP-Syntax采用的GeSHi版本号为1.0.8.3。这个版本中,设置字符串直接量的函数为set_strings_style($style[, $preserve_defaults]),也就是没有对字符串直接量的类别进行指定,事实上在语言文件如php.php中,含有标示为"HARDQUOTE"的一组字符串直接量,对应于用单引号包围的字符串直接量,这些代码就无法使用set_strings_style来设置其样式。我本来想能够在不改动WP-Syntax代码的情况下对代码样式进行完美配置,现在看来是无法达成了。最终GeSHi的BenBE给我的回复和我想象的一样,需要修改geshi.php文件中的set_strings_style函数。在该文件中搜索这个函数名并将下面这段代码覆盖原来的函数,即可像我上面给出的配置那样修改这类代码的样式。

PHP
1
2
3
4
5
6
7
function set_strings_style($style, $preserve_defaults = false, $group = 0) {
    if (!$preserve_defaults) {
        $this->language_data['STYLES']['STRINGS'][$group] = $style;
    } else {
        $this->language_data['STYLES']['STRINGS'][$group] .= $style;
    }
}

BenBe说GeSHi近期将会有一个新的release,将解决上面这类问题。如果WP-Syntax届时跟进的话我们就可以不用改动插件代码来进行完美设置了。

Comments (9)

  1. 15:03, 2009-09-03Rivaldo  / Reply

    GeShi格式-,- 是中国人做的吗?
    为啥WP Login之后不回到原来的页面

  2. 15:10, 2009-09-03Justice  / Reply

    @Rivaldo
    其实是GeSHi - Generic Syntax Highlighter,注意下大小写~恰巧和“格式”拼法相同 =.=
    原作者Nigel McNie是个新西兰人。

  3. 20:55, 2010-01-16北街  / Reply

    好复杂哦,有没有直接的css~

  4. 21:00, 2010-01-16Justice  / Reply

    @北街
    最后生成的代码是 inline CSS 的,会覆盖指定的外部 CSS

  5. 22:10, 2010-04-28dora  / Reply

    博主好,我想问问代码块上的代码语言种类是怎么显示出来的呢?能教教我么?

  6. 22:17, 2010-04-28Justice  / Reply

    @dora
    我在主题里面对日志内容加了个 filter,你可以 下载 下来看一下,在 plugin-support 目录下的 wp-syntax.php,把 39 行到 42 行拷贝到你主题目录中的 functions.php 里就行了。不过前提是你要用了 WP-Syntax 这个插件啊~

  7. 22:23, 2010-04-28dora  / Reply

    @dora
    了解了,谢谢啦

  8. 10:16, 2010-07-31kk  / Reply

    請問如何修改, 讓 wp_syntax lang (就是 PHP, C++) 這個前台顯示 可以掛在 上面, 因為有時候code 太長, 會有可能被 lang給擋住了

    thanks

  9. 17:21, 2010-07-31Justice  / Reply

    @kk
    这个要自己改可能比较麻烦,我看看能不能后台加个选项放在下个版本里吧。

Leave a Reply

Allowed Tags - You may use these HTML tags and attributes in your comment.

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">