2 rcs_id('$Id: SyntaxHighlighter.php,v 1.7 2004-07-08 20:30:07 rurban Exp $');
4 Copyright 2004 $ThePhpWikiProgrammingTeam
6 This file is part of PhpWiki.
8 PhpWiki is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 PhpWiki is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with PhpWiki; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 * The SyntaxHighlighter plugin passes all its arguments through a C++
25 * highlighter called "highlight" (available at http://www.andre-simon.de/).
29 * syntax: See http://www.andre-simon.de/doku/highlight/highlight.html
30 * style = ["ansi", "gnu", "kr", "java", "linux"]
32 <?plugin SyntaxHighlighter syntax=c style=kr color=emacs
40 I did not use beautifier, because it used up more than 8M of memory on
41 my system and PHP killed it. I'm not sure whether this is a problem
42 with my integration, or with beautifier itself.
45 support options: syntax, style, color.
47 HIGHLIGHT_DATA_DIR, HIGHLIGHT_EXE
49 if (!defined('HIGHLIGHT_EXE'))
50 define('HIGHLIGHT_EXE','highlight');
51 //define('HIGHLIGHT_EXE','/usr/local/bin/highlight');
52 //define('HIGHLIGHT_EXE','/home/groups/p/ph/phpwiki/bin/highlight');
54 // highlight requires two subdirs themes and langDefs somewhere.
55 // Best by highlight.conf in $HOME, but the webserver user usually
56 // doesn't have a $HOME
57 if (!defined('HIGHLIGHT_DATA_DIR'))
59 define('HIGHLIGHT_DATA_DIR','f:\cygnus\usr\local\share\highlight');
61 define('HIGHLIGHT_DATA_DIR','/usr/share/highlight');
62 //define('HIGHLIGHT_DATA_DIR','/home/groups/p/ph/phpwiki/share/highlight');
64 class WikiPlugin_SyntaxHighlighter
68 return _("SyntaxHighlighter");
70 function getDescription () {
71 return _("Source code syntax highlighter (via http://www.andre-simon.de)");
73 function managesValidators() {
76 function getVersion() {
77 return preg_replace("/[Revision: $]/", '',
80 function getDefaultArguments() {
82 'syntax' => null, // required argument
83 'style' => null, // optional argument ["ansi", "gnu", "kr", "java", "linux"]
84 'color' => null, // optional, see highlight/themes
89 function handle_plugin_args_cruft(&$argstr, &$args) {
90 $this->source = $argstr;
93 function newFilterThroughCmd($input, $commandLine) {
94 $descriptorspec = array(
95 0 => array("pipe", "r"), // stdin is a pipe that the child will read from
96 1 => array("pipe", "w"), // stdout is a pipe that the child will write to
97 2 => array("pipe", "w"), // stdout is a pipe that the child will write to
100 $process = proc_open("$commandLine", $descriptorspec, $pipes);
101 if (is_resource($process)) {
102 // $pipes now looks like this:
103 // 0 => writeable handle connected to child stdin
104 // 1 => readable handle connected to child stdout
105 // 2 => readable handle connected to child stderr
106 fwrite($pipes[0], $input);
109 while(!feof($pipes[1])) {
110 $buf .= fgets($pipes[1], 1024);
114 while(!feof($pipes[2])) {
115 $stderr .= fgets($pipes[2], 1024);
118 // It is important that you close any pipes before calling
119 // proc_close in order to avoid a deadlock
120 $return_value = proc_close($process);
121 if (empty($buf)) printXML($this->error($stderr));
126 /* PHP versions < 4.3
127 * TODO: via temp file looks more promising
129 function OldFilterThroughCmd($input, $commandLine) {
130 $input = str_replace ("\\", "\\\\", $input);
131 $input = str_replace ("\"", "\\\"", $input);
132 $input = str_replace ("\$", "\\\$", $input);
133 $input = str_replace ("`", "\`", $input);
134 $input = str_replace ("'", "\'", $input);
135 //$input = str_replace (";", "\;", $input);
137 $pipe = popen("echo \"$input\"|$commandLine", 'r');
139 print "pipe failed.";
143 while (!feof($pipe)) {
144 $output .= fread($pipe, 1024);
150 function run($dbi, $argstr, &$request, $basepage) {
151 extract($this->getArgs($argstr, $request));
152 $source =& $this->source;
153 if (empty($syntax)) return $this->error(_("Syntax language not specified."));
154 if (!empty($source)) {
156 if (defined('HIGHLIGHT_DATA_DIR'))
157 $args .= " --data-dir " . HIGHLIGHT_DATA_DIR;
158 if ($number != 0) $args .= " -l";
159 if ($wrap != 0) $args .= " -V";
161 if (!empty($color) and !preg_match('/^[\w-]+$/',$color)) {
162 $html->pushContent($this->error(fmt("invalid %s ignored",'color')));
165 if (!empty($color)) $args .= " --style $color -c ".FindFile("uploads")."/highlight-$color.css";
166 if (!empty($style)) $args .= " -F $style";
167 $commandLine = HIGHLIGHT_EXE . "$args -q -X -f -S $syntax";
168 if (check_php_version(4,3,0))
169 $code = $this->newFilterThroughCmd($source, $commandLine);
171 $code = $this->oldFilterThroughCmd($source, $commandLine);
173 return $this->error(fmt("Couldn't start commandline '%s'",$commandLine));
174 $pre = HTML::pre(HTML::raw($code));
175 $pre->setAttr('class','tightenable top bottom');
176 $html->pushContent($pre);
177 $css = $GLOBALS['WikiTheme']->_CSSlink('',empty($color) ? 'highlight.css' : "uploads/highlight-$color.css",'');
178 return HTML($css,$html);
180 return $this->error(fmt("empty source"));
185 // $Log: not supported by cvs2svn $
186 // Revision 1.6 2004/06/29 18:47:40 rurban
187 // use predefined constants, and added sf.net defaults
189 // Revision 1.5 2004/06/14 11:31:39 rurban
190 // renamed global $Theme to $WikiTheme (gforge nameclash)
191 // inherit PageList default options from PageList
192 // default sortby=pagename
193 // use options in PageList_Selectable (limit, sortby, ...)
194 // added action revert, with button at action=diff
195 // added option regex to WikiAdminSearchReplace
197 // Revision 1.4 2004/05/18 14:49:52 rurban
198 // Simplified strings for easier translation
200 // Revision 1.3 2004/05/14 17:33:12 rurban
201 // new plugin RecentChanges
203 // Revision 1.2 2004/05/14 15:56:16 rurban
204 // protect color argument, more error handling, added default css
206 // Revision 1.1 2004/05/14 14:55:52 rurban
207 // Alec Thomas original plugin, which comes with highlight http://www.andre-simon.de/,
208 // plus some extensions by Reini Urban
217 // c-hanging-comment-ender-p: nil
218 // indent-tabs-mode: nil