CssCachingProxy   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 28
dl 0
loc 105
rs 10
c 2
b 0
f 0
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A modifyFilecontent() 0 60 2
A getIncludeHtml() 0 13 2
A getCacheFileExtension() 0 4 1
1
<?php
2
/*------------------------------------------------------------------------------
3
4
   Project  : CachingProxy
5
   Filename : src/CssCachingProxy.php
6
   Autor    : (c) Sebastian Krüger <[email protected]>
7
   Date     : 15.09.2013
8
9
   For the full copyright and license information, please view the LICENSE
10
   file that was distributed with this source code.
11
12
   Description: extends the CachingProxy with css
13
14
  ----------------------------------------------------------------------------*/
15
16
namespace secra\CachingProxy;
17
18
class CssCachingProxy extends AbstractCachingProxy
19
{
20
    /**
21
     * Delivers the set of html tags for webpage inclusion
22
     *
23
     * @return string   the html .css link tags
24
     *
25
     */
26
    public function getIncludeHtml()
27
    {
28
        // return include html code
29
        $filelist = $this->getIncludeFileset();
30
31
        $htmlreturn = "";
32
33
        foreach ($filelist as $file) {
34
            $htmlreturn .= "<link rel=\"stylesheet\" type=\"text/css\" ";
35
            $htmlreturn .= "href=\"".$file."\" />\n";
36
        }
37
38
        return $htmlreturn;
39
    }
40
41
    /**
42
     * Delivers extension for cached files
43
     *
44
     * @return string   file extension
45
     *
46
     */
47
    protected function getCacheFileExtension()
48
    {
49
        // return Extension of css files
50
        return '.css';
51
    }
52
53
    /**
54
     * Modifiy filepath definations in css files because of
55
     * different cachefolder path
56
     *
57
     * @param  string $csscontent     content processed of css file
58
     * @param  string $cssfilepath    absolut path to css file
59
     *
60
     * @return string   modified css content
61
     *
62
     */
63
    protected function modifyFilecontent($csscontent, $cssfilepath)
64
    {
65
        // Remove the path to docroot from full filepath and remove filename from cssfilepath
66
        $relativeCssPath = dirname(preg_replace("#^".$this->docrootpath."#", "", $cssfilepath));
67
68
        // Use # insted of / in regexpress!
69
        // Search for every url() expr in css files only if the start with ./
70
        // Don't matter if url in " or not
71
        $csscontent = preg_replace_callback(
72
            '#url\("?\./([^"]+)"?\)#i',
73
            function ($matches) use ($relativeCssPath)
74
            {
75
                // $matches[1] contain first subpattern
76
                return 'url("/'.$relativeCssPath.'/'.$matches[1].'")';
77
            },
78
            $csscontent
79
        );
80
81
        // Now search for path with ../ sequences
82
        $csscontent = preg_replace_callback(
83
            '#url\(("|\')?(../){1,20}([^"\']+)("|\')?\)#i',
84
            function ($matches) use ($relativeCssPath)
85
            {
86
                // $matches[0] contains whole matching pattern
87
                // $matches[2] contains ../ subpattern !! but only one time !!
88
                // $matches[3] contain path subpattern
89
90
                // Now count only how much ../ in the begining of the string to avoid counting of ../ in the middle
91
92
                // Where is the first .
93
                $posFirstDot = strpos($matches[0], ".");
94
95
                // Number of char that countain only ./ from the beginning of the string
96
                $charCount = strspn($matches[0], "./", $posFirstDot);
97
98
                // Cut the first part of the string
99
                $pathstring = substr($matches[0], $posFirstDot, $charCount);
100
101
                // Count the ../
102
                $pathdepth = substr_count($pathstring, '../');
103
104
                // Add starting slash, in case all folders has to be replaced, so the last can match in for loop
105
                // later the / is need because we transform the relativ to absolut path, so we need a starting slash
106
                $relativeCssPath = "/".$relativeCssPath;
107
108
                // Remove all folder that dots stand for
109
                for ($i=0; $i<$pathdepth; $i++) {
110
                    // find last occurrence of / in csspath, remove folder depth from last to first
111
                    $lastSlashPos = strrpos($relativeCssPath, "/");
112
                    // remove the last folder now, substr replace everything to the end of the string as default
113
                    $relativeCssPath = substr_replace($relativeCssPath, "", $lastSlashPos);
114
                }
115
116
                return 'url("'.$relativeCssPath.'/'.$matches[3].'")';
117
            },
118
            $csscontent
119
        );
120
121
        // return css content
122
        return $csscontent;
123
    }
124
}