MatthiasMullie\Minify\CSS::combineImports PHP Method

combineImports() protected method

Combine CSS from import statements.
protected combineImports ( string $source, string $content, string[] $parents ) : string
$source string The file to combine imports for
$content string The CSS content to combine imports for
$parents string[] Parent paths, for circular reference checks
return string
    protected function combineImports($source, $content, $parents)
    {
        $importRegexes = array('/
            # import statement
            @import

            # whitespace
            \\s+

                # open url()
                url\\(

                    # (optional) open path enclosure
                    (?P<quotes>["\']?)

                        # fetch path
                        (?P<path>

                            # do not fetch data uris or external sources
                            (?!(
                                ["\']?
                                (data|https?):
                            ))

                            .+?
                        )

                    # (optional) close path enclosure
                    (?P=quotes)

                # close url()
                \\)

                # (optional) trailing whitespace
                \\s*

                # (optional) media statement(s)
                (?P<media>[^;]*)

                # (optional) trailing whitespace
                \\s*

            # (optional) closing semi-colon
            ;?

            /ix', '/

            # import statement
            @import

            # whitespace
            \\s+

                # open path enclosure
                (?P<quotes>["\'])

                    # fetch path
                    (?P<path>

                        # do not fetch data uris or external sources
                        (?!(
                            ["\']?
                            (data|https?):
                        ))

                        .+?
                    )

                # close path enclosure
                (?P=quotes)

                # (optional) trailing whitespace
                \\s*

                # (optional) media statement(s)
                (?P<media>[^;]*)

                # (optional) trailing whitespace
                \\s*

            # (optional) closing semi-colon
            ;?

            /ix');
        // find all relative imports in css
        $matches = array();
        foreach ($importRegexes as $importRegex) {
            if (preg_match_all($importRegex, $content, $regexMatches, PREG_SET_ORDER)) {
                $matches = array_merge($matches, $regexMatches);
            }
        }
        $search = array();
        $replace = array();
        // loop the matches
        foreach ($matches as $match) {
            // get the path for the file that will be imported
            $importPath = dirname($source) . '/' . $match['path'];
            // only replace the import with the content if we can grab the
            // content of the file
            if ($this->canImportFile($importPath)) {
                // check if current file was not imported previously in the same
                // import chain.
                if (in_array($importPath, $parents)) {
                    throw new FileImportException('Failed to import file "' . $importPath . '": circular reference detected.');
                }
                // grab referenced file & minify it (which may include importing
                // yet other @import statements recursively)
                $minifier = new static($importPath);
                $importContent = $minifier->execute($source, $parents);
                // check if this is only valid for certain media
                if (!empty($match['media'])) {
                    $importContent = '@media ' . $match['media'] . '{' . $importContent . '}';
                }
                // add to replacement array
                $search[] = $match[0];
                $replace[] = $importContent;
            }
        }
        // replace the import statements
        $content = str_replace($search, $replace, $content);
        return $content;
    }