Beispiel #1
0
 /**
  * Generate an XSL stylesheet based on given rendering configuration
  *
  * @param  Rendering $rendering
  * @return string
  */
 public function getXSL(Rendering $rendering)
 {
     $groupedTemplates = [];
     $prefixes = [];
     $templates = $rendering->getTemplates();
     // Replace simple templates if there are at least 3 of them
     TemplateHelper::replaceHomogeneousTemplates($templates, 3);
     // Group tags with identical templates together
     foreach ($templates as $tagName => $template) {
         $template = $this->optimizer->optimizeTemplate($template);
         $groupedTemplates[$template][] = $tagName;
         // Record the tag's prefix if applicable
         $pos = strpos($tagName, ':');
         if ($pos !== false) {
             $prefixes[substr($tagName, 0, $pos)] = 1;
         }
     }
     // Declare all the namespaces in use at the top
     $xsl = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"';
     // Append the namespace declarations to the stylesheet
     $prefixes = array_keys($prefixes);
     sort($prefixes);
     foreach ($prefixes as $prefix) {
         $xsl .= ' xmlns:' . $prefix . '="urn:s9e:TextFormatter:' . $prefix . '"';
     }
     /**
      * Exclude those prefixes to keep the HTML neat
      *
      * @link http://lenzconsulting.com/namespaces-in-xslt/#exclude-result-prefixes
      */
     if (!empty($prefixes)) {
         $xsl .= ' exclude-result-prefixes="' . implode(' ', $prefixes) . '"';
     }
     // Start the stylesheet with the boilerplate stuff
     $xsl .= '><xsl:output method="html" encoding="utf-8" indent="no"';
     $xsl .= '/>';
     // Add stylesheet parameters
     foreach ($rendering->getAllParameters() as $paramName => $paramValue) {
         $xsl .= '<xsl:param name="' . htmlspecialchars($paramName) . '"';
         if ($paramValue === '') {
             $xsl .= '/>';
         } else {
             $xsl .= '>' . htmlspecialchars($paramValue) . '</xsl:param>';
         }
     }
     // Add templates
     foreach ($groupedTemplates as $template => $tagNames) {
         // Open the template element
         $xsl .= '<xsl:template match="' . implode('|', $tagNames) . '"';
         // Make it a self-closing element if the template is empty
         if ($template === '') {
             $xsl .= '/>';
         } else {
             $xsl .= '>' . $template . '</xsl:template>';
         }
     }
     $xsl .= '</xsl:stylesheet>';
     return $xsl;
 }
 /**
  * @dataProvider getOptimizeTemplateTests
  * @testdox optimizeTemplate() tests
  */
 public function testOptimizations($original, $expected)
 {
     $optimizer = new Optimizer();
     $this->assertSame($expected, $optimizer->optimizeTemplate($original));
 }