File indexing completed on 2024-12-22 05:36:22
0001 <?php 0002 0003 // OUT OF DATE, NEEDS UPDATING! 0004 // USE XMLWRITER! 0005 0006 class HTMLPurifier_Printer 0007 { 0008 0009 /** 0010 * For HTML generation convenience funcs. 0011 * @type HTMLPurifier_Generator 0012 */ 0013 protected $generator; 0014 0015 /** 0016 * For easy access. 0017 * @type HTMLPurifier_Config 0018 */ 0019 protected $config; 0020 0021 /** 0022 * Initialize $generator. 0023 */ 0024 public function __construct() 0025 { 0026 } 0027 0028 /** 0029 * Give generator necessary configuration if possible 0030 * @param HTMLPurifier_Config $config 0031 */ 0032 public function prepareGenerator($config) 0033 { 0034 $all = $config->getAll(); 0035 $context = new HTMLPurifier_Context(); 0036 $this->generator = new HTMLPurifier_Generator($config, $context); 0037 } 0038 0039 /** 0040 * Main function that renders object or aspect of that object 0041 * @note Parameters vary depending on printer 0042 */ 0043 // function render() {} 0044 0045 /** 0046 * Returns a start tag 0047 * @param string $tag Tag name 0048 * @param array $attr Attribute array 0049 * @return string 0050 */ 0051 protected function start($tag, $attr = array()) 0052 { 0053 return $this->generator->generateFromToken( 0054 new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) 0055 ); 0056 } 0057 0058 /** 0059 * Returns an end tag 0060 * @param string $tag Tag name 0061 * @return string 0062 */ 0063 protected function end($tag) 0064 { 0065 return $this->generator->generateFromToken( 0066 new HTMLPurifier_Token_End($tag) 0067 ); 0068 } 0069 0070 /** 0071 * Prints a complete element with content inside 0072 * @param string $tag Tag name 0073 * @param string $contents Element contents 0074 * @param array $attr Tag attributes 0075 * @param bool $escape whether or not to escape contents 0076 * @return string 0077 */ 0078 protected function element($tag, $contents, $attr = array(), $escape = true) 0079 { 0080 return $this->start($tag, $attr) . 0081 ($escape ? $this->escape($contents) : $contents) . 0082 $this->end($tag); 0083 } 0084 0085 /** 0086 * @param string $tag 0087 * @param array $attr 0088 * @return string 0089 */ 0090 protected function elementEmpty($tag, $attr = array()) 0091 { 0092 return $this->generator->generateFromToken( 0093 new HTMLPurifier_Token_Empty($tag, $attr) 0094 ); 0095 } 0096 0097 /** 0098 * @param string $text 0099 * @return string 0100 */ 0101 protected function text($text) 0102 { 0103 return $this->generator->generateFromToken( 0104 new HTMLPurifier_Token_Text($text) 0105 ); 0106 } 0107 0108 /** 0109 * Prints a simple key/value row in a table. 0110 * @param string $name Key 0111 * @param mixed $value Value 0112 * @return string 0113 */ 0114 protected function row($name, $value) 0115 { 0116 if (is_bool($value)) { 0117 $value = $value ? 'On' : 'Off'; 0118 } 0119 return 0120 $this->start('tr') . "\n" . 0121 $this->element('th', $name) . "\n" . 0122 $this->element('td', $value) . "\n" . 0123 $this->end('tr'); 0124 } 0125 0126 /** 0127 * Escapes a string for HTML output. 0128 * @param string $string String to escape 0129 * @return string 0130 */ 0131 protected function escape($string) 0132 { 0133 $string = HTMLPurifier_Encoder::cleanUTF8($string); 0134 $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); 0135 return $string; 0136 } 0137 0138 /** 0139 * Takes a list of strings and turns them into a single list 0140 * @param string[] $array List of strings 0141 * @param bool $polite Bool whether or not to add an end before the last 0142 * @return string 0143 */ 0144 protected function listify($array, $polite = false) 0145 { 0146 if (empty($array)) { 0147 return 'None'; 0148 } 0149 $ret = ''; 0150 $i = count($array); 0151 foreach ($array as $value) { 0152 $i--; 0153 $ret .= $value; 0154 if ($i > 0 && !($polite && $i == 1)) { 0155 $ret .= ', '; 0156 } 0157 if ($polite && $i == 1) { 0158 $ret .= 'and '; 0159 } 0160 } 0161 return $ret; 0162 } 0163 0164 /** 0165 * Retrieves the class of an object without prefixes, as well as metadata 0166 * @param object $obj Object to determine class of 0167 * @param string $sec_prefix Further prefix to remove 0168 * @return string 0169 */ 0170 protected function getClass($obj, $sec_prefix = '') 0171 { 0172 static $five = null; 0173 if ($five === null) { 0174 $five = version_compare(PHP_VERSION, '5', '>='); 0175 } 0176 $prefix = 'HTMLPurifier_' . $sec_prefix; 0177 if (!$five) { 0178 $prefix = strtolower($prefix); 0179 } 0180 $class = str_replace($prefix, '', get_class($obj)); 0181 $lclass = strtolower($class); 0182 $class .= '('; 0183 switch ($lclass) { 0184 case 'enum': 0185 $values = array(); 0186 foreach ($obj->valid_values as $value => $bool) { 0187 $values[] = $value; 0188 } 0189 $class .= implode(', ', $values); 0190 break; 0191 case 'css_composite': 0192 $values = array(); 0193 foreach ($obj->defs as $def) { 0194 $values[] = $this->getClass($def, $sec_prefix); 0195 } 0196 $class .= implode(', ', $values); 0197 break; 0198 case 'css_multiple': 0199 $class .= $this->getClass($obj->single, $sec_prefix) . ', '; 0200 $class .= $obj->max; 0201 break; 0202 case 'css_denyelementdecorator': 0203 $class .= $this->getClass($obj->def, $sec_prefix) . ', '; 0204 $class .= $obj->element; 0205 break; 0206 case 'css_importantdecorator': 0207 $class .= $this->getClass($obj->def, $sec_prefix); 0208 if ($obj->allow) { 0209 $class .= ', !important'; 0210 } 0211 break; 0212 } 0213 $class .= ')'; 0214 return $class; 0215 } 0216 } 0217 0218 // vim: et sw=4 sts=4