Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
40.00% covered (danger)
40.00%
2 / 5
CRAP
87.18% covered (warning)
87.18%
34 / 39
Minifier
0.00% covered (danger)
0.00%
0 / 1
40.00% covered (danger)
40.00%
2 / 5
16.54
87.18% covered (warning)
87.18%
34 / 39
 open
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 close
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 minify
0.00% covered (danger)
0.00%
0 / 1
7.99
72.73% covered (warning)
72.73%
8 / 11
 shouldMinify
0.00% covered (danger)
0.00%
0 / 1
5.07
85.71% covered (warning)
85.71%
6 / 7
 compileMinify
0.00% covered (danger)
0.00%
0 / 1
2.00
92.86% covered (success)
92.86%
13 / 14
<?php
/**
 * Part of the Caffeinated PHP packages.
 *
 * MIT License and copyright information bundled with this package in the LICENSE file
 */
namespace Radic\BladeExtensions\Helpers;
/**
 * This is the Minifier.
 *
 * @package        Radic\BladeExtensions
 * @author         Caffeinated Dev Team
 * @copyright      Copyright (c) 2015, Caffeinated
 * @license        https://tldrlegal.com/license/mit-license MIT License
 */
class Minifier
{
    /**
     * @var
     */
    protected $type;
    /**
     * open
     *
     * @param $type
     */
    public function open($type)
    {
        $this->type = trim(strtolower($type));
        ob_start();
    }
    /**
     * close
     */
    public function close()
    {
        $code = ob_get_clean();
        echo $this->minify($this->type, $code);
        $this->type = null;
    }
    /**
     * minify
     *
     * @param $type
     * @param $code
     * @return string
     */
    protected function minify($type, $code)
    {
        $types = ['html', 'css', 'js'];
        if (!in_array($type, $types, true)) {
            $typeStr = implode(', ', $types);
            throw new \InvalidArgumentException("BladeExtensions Minifier could not minify your code, you haven't specified a valid type. Given: [{$type}]. Allowed: [{$typeStr}]");
        }
        if ($type === 'html') {
            return $this->compileMinify($code);
        } elseif ($type === 'css' && class_exists('MatthiasMullie\Minify\CSS')) {
            return with(new \MatthiasMullie\Minify\CSS($code))->execute();
        } elseif ($type === 'js' && class_exists('MatthiasMullie\Minify\CSS')) {
            return with(new \MatthiasMullie\Minify\JS($code))->execute();
        } else {
            return $code;
        }
    }
    /**
     *
     * @author https://github.com/yocmen/html-minify
     * @param string $value the contents of the view file
     *
     * @return bool
     */
    protected function shouldMinify($value)
    {
        if (preg_match('/skipmin/', $value)
            || preg_match('/<(pre|textarea)/', $value)
            || preg_match('/<script[^\??>]*>[^<\/script>]/', $value)
            || preg_match('/value=("|\')(.*)([ ]{2,})(.*)("|\')/', $value)
        ) {
            return false;
        } else {
            return true;
        }
    }
    /**
     * Compress the HTML output before saving it
     *
     * @author https://github.com/yocmen/html-minify
     * @param string $value the contents of the view file
     *
     * @return string
     */
    protected function compileMinify($value)
    {
        if ($this->shouldMinify($value)) {
            $replace = [
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                '/<\?php/'                  => '<?php ',
                '/\n([\S])/'                => ' $1',
                '/\r/'                      => '',
                '/\n/'                      => '',
                '/\t/'                      => ' ',
                '/ +/'                      => ' ',
                '/>\s</'                    => '><'
            ];
            return preg_replace(
                array_keys($replace),
                array_values($replace),
                $value
            );
        } else {
            return $value;
        }
    }
}