Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: /** Chris@0: * Generates an HTML report from an PHP_CodeCoverage object. Chris@0: * Chris@0: * @since Class available since Release 1.0.0 Chris@0: */ Chris@0: class PHP_CodeCoverage_Report_HTML Chris@0: { Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: private $templatePath; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: private $generator; Chris@0: Chris@0: /** Chris@0: * @var int Chris@0: */ Chris@0: private $lowUpperBound; Chris@0: Chris@0: /** Chris@0: * @var int Chris@0: */ Chris@0: private $highLowerBound; Chris@0: Chris@0: /** Chris@0: * Constructor. Chris@0: * Chris@0: * @param int $lowUpperBound Chris@0: * @param int $highLowerBound Chris@0: * @param string $generator Chris@0: */ Chris@0: public function __construct($lowUpperBound = 50, $highLowerBound = 90, $generator = '') Chris@0: { Chris@0: $this->generator = $generator; Chris@0: $this->highLowerBound = $highLowerBound; Chris@0: $this->lowUpperBound = $lowUpperBound; Chris@0: Chris@0: $this->templatePath = sprintf( Chris@0: '%s%sHTML%sRenderer%sTemplate%s', Chris@0: dirname(__FILE__), Chris@0: DIRECTORY_SEPARATOR, Chris@0: DIRECTORY_SEPARATOR, Chris@0: DIRECTORY_SEPARATOR, Chris@0: DIRECTORY_SEPARATOR Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param PHP_CodeCoverage $coverage Chris@0: * @param string $target Chris@0: */ Chris@0: public function process(PHP_CodeCoverage $coverage, $target) Chris@0: { Chris@0: $target = $this->getDirectory($target); Chris@0: $report = $coverage->getReport(); Chris@0: unset($coverage); Chris@0: Chris@0: if (!isset($_SERVER['REQUEST_TIME'])) { Chris@0: $_SERVER['REQUEST_TIME'] = time(); Chris@0: } Chris@0: Chris@0: $date = date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']); Chris@0: Chris@0: $dashboard = new PHP_CodeCoverage_Report_HTML_Renderer_Dashboard( Chris@0: $this->templatePath, Chris@0: $this->generator, Chris@0: $date, Chris@0: $this->lowUpperBound, Chris@0: $this->highLowerBound Chris@0: ); Chris@0: Chris@0: $directory = new PHP_CodeCoverage_Report_HTML_Renderer_Directory( Chris@0: $this->templatePath, Chris@0: $this->generator, Chris@0: $date, Chris@0: $this->lowUpperBound, Chris@0: $this->highLowerBound Chris@0: ); Chris@0: Chris@0: $file = new PHP_CodeCoverage_Report_HTML_Renderer_File( Chris@0: $this->templatePath, Chris@0: $this->generator, Chris@0: $date, Chris@0: $this->lowUpperBound, Chris@0: $this->highLowerBound Chris@0: ); Chris@0: Chris@0: $directory->render($report, $target . 'index.html'); Chris@0: $dashboard->render($report, $target . 'dashboard.html'); Chris@0: Chris@0: foreach ($report as $node) { Chris@0: $id = $node->getId(); Chris@0: Chris@0: if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { Chris@0: if (!file_exists($target . $id)) { Chris@0: mkdir($target . $id, 0777, true); Chris@0: } Chris@0: Chris@0: $directory->render($node, $target . $id . '/index.html'); Chris@0: $dashboard->render($node, $target . $id . '/dashboard.html'); Chris@0: } else { Chris@0: $dir = dirname($target . $id); Chris@0: Chris@0: if (!file_exists($dir)) { Chris@0: mkdir($dir, 0777, true); Chris@0: } Chris@0: Chris@0: $file->render($node, $target . $id . '.html'); Chris@0: } Chris@0: } Chris@0: Chris@0: $this->copyFiles($target); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $target Chris@0: */ Chris@0: private function copyFiles($target) Chris@0: { Chris@0: $dir = $this->getDirectory($target . 'css'); Chris@0: copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css'); Chris@0: copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); Chris@0: copy($this->templatePath . 'css/style.css', $dir . 'style.css'); Chris@0: Chris@0: $dir = $this->getDirectory($target . 'fonts'); Chris@0: copy($this->templatePath . 'fonts/glyphicons-halflings-regular.eot', $dir . 'glyphicons-halflings-regular.eot'); Chris@0: copy($this->templatePath . 'fonts/glyphicons-halflings-regular.svg', $dir . 'glyphicons-halflings-regular.svg'); Chris@0: copy($this->templatePath . 'fonts/glyphicons-halflings-regular.ttf', $dir . 'glyphicons-halflings-regular.ttf'); Chris@0: copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff', $dir . 'glyphicons-halflings-regular.woff'); Chris@0: copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff2', $dir . 'glyphicons-halflings-regular.woff2'); Chris@0: Chris@0: $dir = $this->getDirectory($target . 'js'); Chris@0: copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); Chris@0: copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); Chris@0: copy($this->templatePath . 'js/holder.min.js', $dir . 'holder.min.js'); Chris@0: copy($this->templatePath . 'js/html5shiv.min.js', $dir . 'html5shiv.min.js'); Chris@0: copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); Chris@0: copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); Chris@0: copy($this->templatePath . 'js/respond.min.js', $dir . 'respond.min.js'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $directory Chris@0: * @return string Chris@0: * @throws PHP_CodeCoverage_Exception Chris@0: * @since Method available since Release 1.2.0 Chris@0: */ Chris@0: private function getDirectory($directory) Chris@0: { Chris@0: if (substr($directory, -1, 1) != DIRECTORY_SEPARATOR) { Chris@0: $directory .= DIRECTORY_SEPARATOR; Chris@0: } Chris@0: Chris@0: if (is_dir($directory)) { Chris@0: return $directory; Chris@0: } Chris@0: Chris@0: if (@mkdir($directory, 0777, true)) { Chris@0: return $directory; Chris@0: } Chris@0: Chris@0: throw new PHP_CodeCoverage_Exception( Chris@0: sprintf( Chris@0: 'Directory "%s" does not exist.', Chris@0: $directory Chris@0: ) Chris@0: ); Chris@0: } Chris@0: }