]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/SyntaxHighlighter.php
Remove extra empty lines
[SourceForge/phpwiki.git] / lib / plugin / SyntaxHighlighter.php
1 <?php
2
3 /**
4  * Copyright 2004 $ThePhpWikiProgrammingTeam
5  *
6  * This file is part of PhpWiki.
7  *
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.
12  *
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.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22
23 /**
24  * The SyntaxHighlighter plugin passes all its arguments through a C++
25  * highlighter called "highlight" (available at http://www.andre-simon.de/).
26  *
27  * @author: alecthomas
28  *
29  * syntax: See http://www.andre-simon.de/doku/highlight/highlight.html
30  * style = ["ansi", "gnu", "kr", "java", "linux"]
31
32 <<SyntaxHighlighter syntax=c style=kr color=emacs
33 #include <stdio.h>
34
35 int main() {
36 printf("Lalala\n");
37 }
38 >>
39
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.
43
44 Fixes by Reini Urban:
45 support options: syntax, style, color.
46 php version switch
47 HIGHLIGHT_DATA_DIR, HIGHLIGHT_EXE
48  */
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');
53
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'))
58     if (isWindows())
59         define('HIGHLIGHT_DATA_DIR', 'f:\cygnus\usr\local\share\highlight');
60     else
61         define('HIGHLIGHT_DATA_DIR', '/usr/share/highlight');
62 //define('HIGHLIGHT_DATA_DIR','/home/groups/p/ph/phpwiki/share/highlight');
63
64 class WikiPlugin_SyntaxHighlighter
65     extends WikiPlugin
66 {
67     function getName()
68     {
69         return _("SyntaxHighlighter");
70     }
71
72     function getDescription()
73     {
74         return _("Source code syntax highlighter (via http://www.andre-simon.de)");
75     }
76
77     function managesValidators()
78     {
79         return true;
80     }
81
82     function getDefaultArguments()
83     {
84         return array(
85             'syntax' => null, // required argument
86             'style' => null, // optional argument ["ansi", "gnu", "kr", "java", "linux"]
87             'color' => null, // optional, see highlight/themes
88             'number' => 0,
89             'wrap' => 0,
90         );
91     }
92
93     function handle_plugin_args_cruft(&$argstr, &$args)
94     {
95         $this->source = $argstr;
96     }
97
98     function newFilterThroughCmd($input, $commandLine)
99     {
100         $descriptorspec = array(
101             0 => array("pipe", "r"), // stdin is a pipe that the child will read from
102             1 => array("pipe", "w"), // stdout is a pipe that the child will write to
103             2 => array("pipe", "w"), // stdout is a pipe that the child will write to
104         );
105
106         $process = proc_open("$commandLine", $descriptorspec, $pipes);
107         if (is_resource($process)) {
108             // $pipes now looks like this:
109             // 0 => writeable handle connected to child stdin
110             // 1 => readable  handle connected to child stdout
111             // 2 => readable  handle connected to child stderr
112             fwrite($pipes[0], $input);
113             fclose($pipes[0]);
114             $buf = "";
115             while (!feof($pipes[1])) {
116                 $buf .= fgets($pipes[1], 1024);
117             }
118             fclose($pipes[1]);
119             $stderr = '';
120             while (!feof($pipes[2])) {
121                 $stderr .= fgets($pipes[2], 1024);
122             }
123             fclose($pipes[2]);
124             // It is important that you close any pipes before calling
125             // proc_close in order to avoid a deadlock
126             $return_value = proc_close($process);
127             if (empty($buf)) printXML($this->error($stderr));
128             return $buf;
129         }
130     }
131
132     function run($dbi, $argstr, &$request, $basepage)
133     {
134         extract($this->getArgs($argstr, $request));
135         $source =& $this->source;
136         if (empty($syntax)) {
137             return $this->error(sprintf(_("A required argument '%s' is missing."), 'syntax'));
138         }
139         if (!empty($source)) {
140             $args = "";
141             if (defined('HIGHLIGHT_DATA_DIR'))
142                 $args .= " --data-dir " . HIGHLIGHT_DATA_DIR;
143             if ($number != 0) $args .= " -l";
144             if ($wrap != 0) $args .= " -V";
145             $html = HTML();
146             if (!empty($color) and !preg_match('/^[\w-]+$/', $color)) {
147                 $html->pushContent($this->error(fmt("invalid %s ignored", 'color')));
148                 $color = false;
149             }
150             if (!empty($color)) $args .= " --style $color --inline-css";
151             if (!empty($style)) $args .= " -F $style";
152             $commandLine = HIGHLIGHT_EXE . "$args -q -X -f -S $syntax";
153             $code = $this->newFilterThroughCmd($source, $commandLine);
154             if (empty($code))
155                 return $this->error(fmt("Couldn't start commandline '%s'", $commandLine));
156             $pre = HTML::pre(HTML::raw($code));
157             $html->pushContent($pre);
158             return HTML($html);
159         } else {
160             return $this->error(fmt("empty source"));
161         }
162     }
163 }
164
165 // Local Variables:
166 // mode: php
167 // tab-width: 8
168 // c-basic-offset: 4
169 // c-hanging-comment-ender-p: nil
170 // indent-tabs-mode: nil
171 // End: