Chris@14: Chris@14: * Chris@14: * For the full copyright and license information, please view the LICENSE Chris@14: * file that was distributed with this source code. Chris@14: */ Chris@14: Chris@14: namespace SebastianBergmann\CodeCoverage\Report\Html; Chris@14: Chris@14: use SebastianBergmann\CodeCoverage\CodeCoverage; Chris@14: use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; Chris@14: use SebastianBergmann\CodeCoverage\RuntimeException; Chris@14: Chris@14: /** Chris@14: * Generates an HTML report from a code coverage object. Chris@14: */ Chris@14: class Facade Chris@14: { Chris@14: /** Chris@14: * @var string Chris@14: */ Chris@14: private $templatePath; Chris@14: Chris@14: /** Chris@14: * @var string Chris@14: */ Chris@14: private $generator; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $lowUpperBound; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $highLowerBound; Chris@14: Chris@14: /** Chris@14: * Constructor. Chris@14: * Chris@14: * @param int $lowUpperBound Chris@14: * @param int $highLowerBound Chris@14: * @param string $generator Chris@14: */ Chris@14: public function __construct($lowUpperBound = 50, $highLowerBound = 90, $generator = '') Chris@14: { Chris@14: $this->generator = $generator; Chris@14: $this->highLowerBound = $highLowerBound; Chris@14: $this->lowUpperBound = $lowUpperBound; Chris@14: $this->templatePath = __DIR__ . '/Renderer/Template/'; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @param CodeCoverage $coverage Chris@14: * @param string $target Chris@14: */ Chris@14: public function process(CodeCoverage $coverage, $target) Chris@14: { Chris@14: $target = $this->getDirectory($target); Chris@14: $report = $coverage->getReport(); Chris@14: unset($coverage); Chris@14: Chris@14: if (!isset($_SERVER['REQUEST_TIME'])) { Chris@14: $_SERVER['REQUEST_TIME'] = \time(); Chris@14: } Chris@14: Chris@14: $date = \date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']); Chris@14: Chris@14: $dashboard = new Dashboard( Chris@14: $this->templatePath, Chris@14: $this->generator, Chris@14: $date, Chris@14: $this->lowUpperBound, Chris@14: $this->highLowerBound Chris@14: ); Chris@14: Chris@14: $directory = new Directory( Chris@14: $this->templatePath, Chris@14: $this->generator, Chris@14: $date, Chris@14: $this->lowUpperBound, Chris@14: $this->highLowerBound Chris@14: ); Chris@14: Chris@14: $file = new File( Chris@14: $this->templatePath, Chris@14: $this->generator, Chris@14: $date, Chris@14: $this->lowUpperBound, Chris@14: $this->highLowerBound Chris@14: ); Chris@14: Chris@14: $directory->render($report, $target . 'index.html'); Chris@14: $dashboard->render($report, $target . 'dashboard.html'); Chris@14: Chris@14: foreach ($report as $node) { Chris@14: $id = $node->getId(); Chris@14: Chris@14: if ($node instanceof DirectoryNode) { Chris@14: if (!\file_exists($target . $id)) { Chris@14: \mkdir($target . $id, 0777, true); Chris@14: } Chris@14: Chris@14: $directory->render($node, $target . $id . '/index.html'); Chris@14: $dashboard->render($node, $target . $id . '/dashboard.html'); Chris@14: } else { Chris@14: $dir = \dirname($target . $id); Chris@14: Chris@14: if (!\file_exists($dir)) { Chris@14: \mkdir($dir, 0777, true); Chris@14: } Chris@14: Chris@14: $file->render($node, $target . $id . '.html'); Chris@14: } Chris@14: } Chris@14: Chris@14: $this->copyFiles($target); Chris@14: } Chris@14: Chris@14: /** Chris@14: * @param string $target Chris@14: */ Chris@14: private function copyFiles($target) Chris@14: { Chris@14: $dir = $this->getDirectory($target . '.css'); Chris@14: Chris@14: \file_put_contents( Chris@14: $dir . 'bootstrap.min.css', Chris@14: \str_replace( Chris@14: 'url(../fonts/', Chris@14: 'url(../.fonts/', Chris@14: \file_get_contents($this->templatePath . 'css/bootstrap.min.css') Chris@14: ) Chris@14: Chris@14: ); Chris@14: Chris@14: \copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); Chris@14: \copy($this->templatePath . 'css/style.css', $dir . 'style.css'); Chris@14: Chris@14: $dir = $this->getDirectory($target . '.fonts'); Chris@14: \copy($this->templatePath . 'fonts/glyphicons-halflings-regular.eot', $dir . 'glyphicons-halflings-regular.eot'); Chris@14: \copy($this->templatePath . 'fonts/glyphicons-halflings-regular.svg', $dir . 'glyphicons-halflings-regular.svg'); Chris@14: \copy($this->templatePath . 'fonts/glyphicons-halflings-regular.ttf', $dir . 'glyphicons-halflings-regular.ttf'); Chris@14: \copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff', $dir . 'glyphicons-halflings-regular.woff'); Chris@14: \copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff2', $dir . 'glyphicons-halflings-regular.woff2'); Chris@14: Chris@14: $dir = $this->getDirectory($target . '.js'); Chris@14: \copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); Chris@14: \copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); Chris@14: \copy($this->templatePath . 'js/holder.min.js', $dir . 'holder.min.js'); Chris@14: \copy($this->templatePath . 'js/html5shiv.min.js', $dir . 'html5shiv.min.js'); Chris@14: \copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); Chris@14: \copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); Chris@14: \copy($this->templatePath . 'js/respond.min.js', $dir . 'respond.min.js'); Chris@14: \copy($this->templatePath . 'js/file.js', $dir . 'file.js'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * @param string $directory Chris@14: * Chris@14: * @return string Chris@14: * Chris@14: * @throws RuntimeException Chris@14: */ Chris@14: private function getDirectory($directory) Chris@14: { Chris@14: if (\substr($directory, -1, 1) != DIRECTORY_SEPARATOR) { Chris@14: $directory .= DIRECTORY_SEPARATOR; Chris@14: } Chris@14: Chris@14: if (\is_dir($directory)) { Chris@14: return $directory; Chris@14: } Chris@14: Chris@14: if (@\mkdir($directory, 0777, true)) { Chris@14: return $directory; Chris@14: } Chris@14: Chris@14: throw new RuntimeException( Chris@14: \sprintf( Chris@14: 'Directory "%s" does not exist.', Chris@14: $directory Chris@14: ) Chris@14: ); Chris@14: } Chris@14: }