Determines whether or not to run Tidy on the final output for pretty '. 'formatting reasons, such as indentation and wrap.
This can greatly '. 'improve readability for editors who are hand-editing the HTML, but is '. 'by no means necessary as HTML Purifier has already fixed all major '. 'errors the HTML may have had. Tidy is a non-default extension, and this directive '. 'will silently fail if Tidy is not available.
If you are looking to make '. 'the overall look of your page\'s source better, I recommend running Tidy '. 'on the entire page rather than just user-content (after all, the '. 'indentation relative to the containing blocks will be incorrect).
This '. 'directive was available since 1.1.1.
' ); /** * Generates HTML from tokens. */ class HTMLPurifier_Generator { /** * Bool cache of %Core.CleanUTF8DuringGeneration * @private */ var $_clean_utf8 = false; /** * Bool cache of %Core.XHTML * @private */ var $_xhtml = true; /** * Bool cache of %Core.CommentScriptContents * @private */ var $_scriptFix = false; /** * Generates HTML from an array of tokens. * @param $tokens Array of HTMLPurifier_Token * @param $config HTMLPurifier_Config object * @return Generated HTML */ function generateFromTokens($tokens, $config, &$context) { $html = ''; if (!$config) $config = HTMLPurifier_Config::createDefault(); $this->_clean_utf8 = $config->get('Core', 'CleanUTF8DuringGeneration'); $this->_xhtml = $config->get('Core', 'XHTML'); $this->_scriptFix = $config->get('Core', 'CommentScriptContents'); if (!$tokens) return ''; for ($i = 0, $size = count($tokens); $i < $size; $i++) { if ($this->_scriptFix && $tokens[$i]->name === 'script') { // script special case $html .= $this->generateFromToken($tokens[$i++]); $html .= $this->generateScriptFromToken($tokens[$i++]); while ($tokens[$i]->name != 'script') { $html .= $this->generateScriptFromToken($tokens[$i++]); } } $html .= $this->generateFromToken($tokens[$i]); } if ($config->get('Core', 'TidyFormat') && extension_loaded('tidy')) { $tidy_options = array( 'indent'=> true, 'output-xhtml' => $this->_xhtml, 'show-body-only' => true, 'indent-spaces' => 2, 'wrap' => 68, ); if (version_compare(PHP_VERSION, '5', '<')) { tidy_set_encoding('utf8'); foreach ($tidy_options as $key => $value) { tidy_setopt($key, $value); } tidy_parse_string($html); tidy_clean_repair(); $html = tidy_get_output(); } else { $tidy = new Tidy; $tidy->parseString($html, $tidy_options, 'utf8'); $tidy->cleanRepair(); $html = (string) $tidy; } } return $html; } /** * Generates HTML from a single token. * @param $token HTMLPurifier_Token object. * @return Generated HTML */ function generateFromToken($token) { if (!isset($token->type)) return ''; if ($token->type == 'start') { $attr = $this->generateAttributes($token->attr); return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; } elseif ($token->type == 'end') { return '' . $token->name . '>'; } elseif ($token->type == 'empty') { $attr = $this->generateAttributes($token->attr); return '<' . $token->name . ($attr ? ' ' : '') . $attr . ( $this->_xhtml ? ' /': '' ) . '>'; } elseif ($token->type == 'text') { return $this->escape($token->data); } else { return ''; } } /** * Special case processor for the contents of script tags * @warning This runs into problems if there's already a literal * --> somewhere inside the script contents. */ function generateScriptFromToken($token) { if (!$token->type == 'text') return $this->generateFromToken($token); return ''; // more advanced version: // return ''; } /** * Generates attribute declarations from attribute array. * @param $assoc_array_of_attributes Attribute array * @return Generate HTML fragment for insertion. */ function generateAttributes($assoc_array_of_attributes) { $html = ''; foreach ($assoc_array_of_attributes as $key => $value) { if (!$this->_xhtml) { // remove namespaced attributes if (strpos($key, ':') !== false) continue; // also needed: check for attribute minimization } $html .= $key.'="'.$this->escape($value).'" '; } return rtrim($html); } /** * Escapes raw text data. * @param $string String data to escape for HTML. * @return String escaped data. */ function escape($string) { if ($this->_clean_utf8) $string = HTMLPurifier_Lexer::cleanUTF8($string); return htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); } } ?>