Update 06 June 2011: I’ve contacted the current developer and he’s accepted the patch. It should be appearing in a WP-Syntax near you shortly!
Update 16 July 2011: I’ve merged Chimo’s excellent patch which adds page range support. See the updated tutorial below for usage instructions. Thanks Chimo!
Update 27 July 2011: We have liftoff! This patch is finally part of the official plugin!
I’ve used a few different WordPress syntax highlighters in my day but WP-Syntax is easily the best of them. One issue that’s bothered me with WP-Syntax for a while now, however, is lack of line highlighting support so I decided to look into adding it myself. At the time of writing I’m using WP-Syntax 0.9.9.
To add highlighting support, open up /wp-content/plugins/wp-syntax/wp-syntax.php. You’ll need to modify two functions –Β wp_syntax_highlight andΒ wp_syntax_before_filter. Here’sΒ wp_syntax_highlight:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | function wp_syntax_highlight($match) { global $wp_syntax_matches; $i = intval($match[1]); $match = $wp_syntax_matches[$i]; $language = strtolower(trim($match[1])); $line = trim($match[2]); $escaped = trim($match[3]); $code = wp_syntax_code_trim($match[5]); if ($escaped == "true") $code = htmlspecialchars_decode($code); $geshi = new GeSHi($code, $language); $geshi->enable_keyword_links(false); do_action_ref_array('wp_syntax_init_geshi', array(&$geshi)); //START LINE HIGHLIGHT SUPPORT $highlight = array(); if ( !empty($match[4]) ) { $highlight = strpos($match[4],',') == false ? array($match[4]) : explode(',', $match[4]); $h_lines = array(); for( $i=0; $i<sizeof($highlight); $i++ ) { $h_range = explode('-', $highlight[$i]); if( sizeof($h_range) == 2 ) $h_lines = array_merge( $h_lines, range($h_range[0], $h_range[1]) ); else array_push($h_lines, $highlight[$i]); } $geshi->highlight_lines_extra( $h_lines ); } //END LINE HIGHLIGHT SUPPORT $output = "\n<div class=\"wp_syntax\">"; if ($line) { $output .= "<table><tr><td class=\"line_numbers\">"; $output .= wp_syntax_line_numbers($code, $line); $output .= "</td><td class=\"code\">"; $output .= $geshi->parse_code(); $output .= "</td></tr></table>"; } else { $output .= "<div class=\"code\">"; $output .= $geshi->parse_code(); $output .= "</div>"; } return $output .= "</div>\n"; return $output; } |
and here’s wp_syntax_before_filter:
1 2 3 4 5 6 7 8 | function wp_syntax_before_filter($content) { return preg_replace_callback( "/\s*<pre(?:lang=[\"']([\w-]+)[\"']|line=[\"'](\d*)[\"']|escaped=[\"'](true|false)?[\"']|highlight=[\"']((?:\d+[,-])*\d+)[\"']|\s)+>(.*)<\/pre>\s*/siU", "wp_syntax_substitute", $content ); } |
Updated/added lines are, of course, highlighted π
Below is an example of the new functionality:
<pre lang=”php” highlight=”2″>
$foo = ‘foo’;
$bar = ‘bar’;
$foobar = ‘foobar’;
</pre>
$foo = 'foo'; $bar = 'bar'; $foobar = 'foobar'; |
<pre lang=”php” highlight=”1,2,5-7″>
$foo = ‘foo’;
$bar = ‘bar’;
$foobar = ‘foobar’;
$foo = ‘foo’;
$bar = ‘bar’;
$foobar = ‘foobar’;
$foo = ‘foo’;
$bar = ‘bar’;
$foobar = ‘foobar’;
</pre>
$foo = 'foo'; $bar = 'bar'; $foobar = 'foobar'; $foo = 'foo'; $bar = 'bar'; $foobar = 'foobar'; $foo = 'foo'; $bar = 'bar'; $foobar = 'foobar'; |
Remember to add highlight to the list of allowed <PRE> tag arguments in your themes functions.php file. Details on doing so can be found here.