91 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * Decorator/extender XSLT processor specifically for HTML documents.
 | 
						|
 */
 | 
						|
class ConfigDoc_HTMLXSLTProcessor
 | 
						|
{
 | 
						|
 | 
						|
    /**
 | 
						|
     * Instance of XSLTProcessor
 | 
						|
     */
 | 
						|
    protected $xsltProcessor;
 | 
						|
 | 
						|
    public function __construct($proc = false)
 | 
						|
    {
 | 
						|
        if ($proc === false) $proc = new XSLTProcessor();
 | 
						|
        $this->xsltProcessor = $proc;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @note Allows a string $xsl filename to be passed
 | 
						|
     */
 | 
						|
    public function importStylesheet($xsl)
 | 
						|
    {
 | 
						|
        if (is_string($xsl)) {
 | 
						|
            $xsl_file = $xsl;
 | 
						|
            $xsl = new DOMDocument();
 | 
						|
            $xsl->load($xsl_file);
 | 
						|
        }
 | 
						|
        return $this->xsltProcessor->importStylesheet($xsl);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Transforms an XML file into compatible XHTML based on the stylesheet
 | 
						|
     * @param $xml XML DOM tree, or string filename
 | 
						|
     * @return string HTML output
 | 
						|
     * @todo Rename to transformToXHTML, as transformToHTML is misleading
 | 
						|
     */
 | 
						|
    public function transformToHTML($xml)
 | 
						|
    {
 | 
						|
        if (is_string($xml)) {
 | 
						|
            $dom = new DOMDocument();
 | 
						|
            $dom->load($xml);
 | 
						|
        } else {
 | 
						|
            $dom = $xml;
 | 
						|
        }
 | 
						|
        $out = $this->xsltProcessor->transformToXML($dom);
 | 
						|
 | 
						|
        // fudges for HTML backwards compatibility
 | 
						|
        // assumes that document is XHTML
 | 
						|
        $out = str_replace('/>', ' />', $out); // <br /> not <br/>
 | 
						|
        $out = str_replace(' xmlns=""', '', $out); // rm unnecessary xmlns
 | 
						|
 | 
						|
        if (class_exists('Tidy')) {
 | 
						|
            // cleanup output
 | 
						|
            $config = array(
 | 
						|
                'indent'        => true,
 | 
						|
                'output-xhtml'  => true,
 | 
						|
                'wrap'          => 80
 | 
						|
            );
 | 
						|
            $tidy = new Tidy;
 | 
						|
            $tidy->parseString($out, $config, 'utf8');
 | 
						|
            $tidy->cleanRepair();
 | 
						|
            $out = (string) $tidy;
 | 
						|
        }
 | 
						|
 | 
						|
        return $out;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Bulk sets parameters for the XSL stylesheet
 | 
						|
     * @param array $options Associative array of options to set
 | 
						|
     */
 | 
						|
    public function setParameters($options)
 | 
						|
    {
 | 
						|
        foreach ($options as $name => $value) {
 | 
						|
            $this->xsltProcessor->setParameter('', $name, $value);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Forward any other calls to the XSLT processor
 | 
						|
     */
 | 
						|
    public function __call($name, $arguments)
 | 
						|
    {
 | 
						|
        call_user_func_array(array($this->xsltProcessor, $name), $arguments);
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
// vim: et sw=4 sts=4
 |