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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
<?php // vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: /** * Code rule end renderer for Xhtml * * PHP versions 4 and 5 * * @category Text * @package Text_Wiki * @author Paul M. Jones <pmjones@php.net> * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 * @version CVS: $Id: Code.php 206940 2006-02-10 23:07:03Z toggg $ * @link http://pear.php.net/package/Text_Wiki */
/** * This class renders code blocks in XHTML. * * @category Text * @package Text_Wiki * @author Paul M. Jones <pmjones@php.net> * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 * @version Release: @package_version@ * @link http://pear.php.net/package/Text_Wiki */ class Text_Wiki_Render_Xhtml_Code extends Text_Wiki_Render {
var $conf = array( 'css' => null, // class for <pre> 'css_code' => null, // class for generic <code> 'css_php' => null, // class for PHP <code> 'css_html' => null, // class for HTML <code> 'css_filename' => null // class for optional filename <div> );
/** * * Renders a token into text matching the requested format. * * @access public * * @param array $options The "options" portion of the token (second * element). * * @return string The text rendered from the token options. * */
function token($options) { $text = $options['text']; $attr = $options['attr']; $type = strtolower($attr['type']);
$css = $this->formatConf(' class="%s"', 'css'); $css_code = $this->formatConf(' class="%s"', 'css_code'); $css_php = $this->formatConf(' class="%s"', 'css_php'); $css_html = $this->formatConf(' class="%s"', 'css_html'); $css_filename = $this->formatConf(' class="%s"', 'css_filename');
if ($type == 'php') { if (substr($options['text'], 0, 5) != '<?php') { // PHP code example: // add the PHP tags $text = "<?php\n" . $options['text'] . "\n?>"; // <?php }
// convert tabs to four spaces $text = str_replace("\t", " ", $text);
// colorize the code block (also converts HTML entities and adds // <code>...</code> tags) ob_start(); highlight_string($text); $text = ob_get_contents(); ob_end_clean();
// replace <br /> tags with simple newlines. // replace non-breaking space with simple spaces. // translate HTML <font> and color to XHTML <span> and style. // courtesy of research by A. Kalin :-). $map = array( '<br />' => "\n", ' ' => ' ', '<font' => '<span', '</font>' => '</span>', 'color="' => 'style="color:' ); $text = strtr($text, $map);
// get rid of the last newline inside the code block // (becuase higlight_string puts one there) if (substr($text, -8) == "\n</code>") { $text = substr($text, 0, -8) . "</code>"; }
// replace all <code> tags with classed tags if ($css_php) { $text = str_replace('<code>', "<code$css_php>", $text); }
// done $text = "<pre$css>$text</pre>";
} elseif ($type == 'html' || $type == 'xhtml') {
// HTML code example: // add <html> opening and closing tags, // convert tabs to four spaces, // convert entities. $text = str_replace("\t", " ", $text); $text = "<html>\n$text\n</html>"; $text = $this->textEncode($text); $text = "<pre$css><code$css_html>$text</code></pre>";
} else { // generic code example: // convert tabs to four spaces, // convert entities. $text = str_replace("\t", " ", $text); $text = $this->textEncode($text); $text = "<pre$css><code$css_code>$text</code></pre>"; }
if ($css_filename && isset($attr['filename'])) { $text = "<div$css_filename>" . $attr['filename'] . '</div>' . $text; }
return "\n$text\n\n"; } } ?>
|