PluginProbe ʕ •ᴥ•ʔ
Essential Addons for Elementor – Popular Elementor Templates & Widgets / 2.10.2
Essential Addons for Elementor – Popular Elementor Templates & Widgets v2.10.2
6.6.9 6.6.8 6.6.7 6.6.6 6.6.5 6.6.4 6.6.3 5.7.3 5.7.4 5.8.0 5.8.1 5.8.10 5.8.11 5.8.12 5.8.13 5.8.14 5.8.15 5.8.16 5.8.18 5.8.2 5.8.3 5.8.4 5.8.5 5.8.6 5.8.7 5.8.8 5.8.9 5.9.0 5.9.1 5.9.10 5.9.11 5.9.12 5.9.13 5.9.14 5.9.15 5.9.16 5.9.17 5.9.18 5.9.19 5.9.2 5.9.20 5.9.21 5.9.22 5.9.23 5.9.24 5.9.25 5.9.26 5.9.27 5.9.3 5.9.4 5.9.5 5.9.6 5.9.7 5.9.8 5.9.9 6.0.0 6.0.1 6.0.10 6.0.11 6.0.12 6.0.13 6.0.14 6.0.15 6.0.2 6.0.3 6.0.4 6.0.5 6.0.6 6.0.7 6.0.8 6.0.9 6.1.0 6.1.1 6.1.10 6.1.11 trunk 6.1.12 1.0.0 6.1.13 1.0.1 6.1.14 1.1.0 6.1.15 2.0 6.1.17 2.1 6.1.18 2.10.0 6.1.19 2.10.1 6.1.2 2.10.2 6.1.20 2.10.3 6.1.3 2.10.4 6.1.4 2.10.5 6.1.5 2.2.0 6.1.6 2.2.1 6.1.7 2.2.2 6.1.8 2.2.3 6.1.9 2.2.4 6.2.0 2.2.5 6.2.1 2.3.0 6.2.2 2.3.1 6.2.3 2.4.0 6.2.4 2.4.1 6.3.0 2.4.2 6.3.1 2.4.3 6.3.2 2.5.0 6.3.3 2.6.0 6.4.0 2.7.0 6.5.0 2.7.1 6.5.1 2.7.10 6.5.10 2.7.11 6.5.11 2.7.2 6.5.12 2.7.3 6.5.13 2.7.4 6.5.2 2.7.5 6.5.3 2.7.6 6.5.4 2.7.7 6.5.5 2.7.8 6.5.6 2.7.9 6.5.7 2.8.0 6.5.8 2.8.1 6.5.9 2.8.2 6.6.0 2.8.3 6.6.1 2.8.4 6.6.2 2.8.5 2.8.6 2.8.7 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 2.9.8 2.9.9 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.4.1 3.1.5 3.2.0 3.3.0 3.3.1 3.3.2 3.3.3 3.4.0 3.5.0 3.5.1 3.5.2 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.3.0 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.3.8 4.3.9 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.6.6 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.8.0 4.8.1 4.8.2 4.8.3 4.8.4 4.9.0 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.9.6 4.9.7 5.0.0 5.0.1 5.0.10 5.0.11 5.0.12 5.0.13 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.0.9 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.2.0 5.2.1 5.2.2 5.2.3 5.2.4 5.3.0 5.3.1 5.3.2 5.4.6 5.5.5 5.6.5 5.7.2
essential-addons-for-elementor-lite / vendor / matthiasmullie / path-converter / src / Converter.php
essential-addons-for-elementor-lite / vendor / matthiasmullie / path-converter / src Last commit date
Converter.php 7 years ago ConverterInterface.php 7 years ago NoConverter.php 7 years ago
Converter.php
197 lines
1 <?php
2
3 namespace MatthiasMullie\PathConverter;
4
5 /**
6 * Convert paths relative from 1 file to another.
7 *
8 * E.g.
9 * ../../images/icon.jpg relative to /css/imports/icons.css
10 * becomes
11 * ../images/icon.jpg relative to /css/minified.css
12 *
13 * Please report bugs on https://github.com/matthiasmullie/path-converter/issues
14 *
15 * @author Matthias Mullie <pathconverter@mullie.eu>
16 * @copyright Copyright (c) 2015, Matthias Mullie. All rights reserved
17 * @license MIT License
18 */
19 class Converter implements ConverterInterface
20 {
21 /**
22 * @var string
23 */
24 protected $from;
25
26 /**
27 * @var string
28 */
29 protected $to;
30
31 /**
32 * @param string $from The original base path (directory, not file!)
33 * @param string $to The new base path (directory, not file!)
34 * @param string $root Root directory (defaults to `getcwd`)
35 */
36 public function __construct($from, $to, $root = '')
37 {
38 $shared = $this->shared($from, $to);
39 if ($shared === '') {
40 // when both paths have nothing in common, one of them is probably
41 // absolute while the other is relative
42 $root = $root ?: getcwd();
43 $from = strpos($from, $root) === 0 ? $from : preg_replace('/\/+/', '/', $root.'/'.$from);
44 $to = strpos($to, $root) === 0 ? $to : preg_replace('/\/+/', '/', $root.'/'.$to);
45
46 // or traveling the tree via `..`
47 // attempt to resolve path, or assume it's fine if it doesn't exist
48 $from = @realpath($from) ?: $from;
49 $to = @realpath($to) ?: $to;
50 }
51
52 $from = $this->dirname($from);
53 $to = $this->dirname($to);
54
55 $from = $this->normalize($from);
56 $to = $this->normalize($to);
57
58 $this->from = $from;
59 $this->to = $to;
60 }
61
62 /**
63 * Normalize path.
64 *
65 * @param string $path
66 *
67 * @return string
68 */
69 protected function normalize($path)
70 {
71 // deal with different operating systems' directory structure
72 $path = rtrim(str_replace(DIRECTORY_SEPARATOR, '/', $path), '/');
73
74 /*
75 * Example:
76 * /home/forkcms/frontend/cache/compiled_templates/../../core/layout/css/../images/img.gif
77 * to
78 * /home/forkcms/frontend/core/layout/images/img.gif
79 */
80 do {
81 $path = preg_replace('/[^\/]+(?<!\.\.)\/\.\.\//', '', $path, -1, $count);
82 } while ($count);
83
84 return $path;
85 }
86
87 /**
88 * Figure out the shared path of 2 locations.
89 *
90 * Example:
91 * /home/forkcms/frontend/core/layout/images/img.gif
92 * and
93 * /home/forkcms/frontend/cache/minified_css
94 * share
95 * /home/forkcms/frontend
96 *
97 * @param string $path1
98 * @param string $path2
99 *
100 * @return string
101 */
102 protected function shared($path1, $path2)
103 {
104 // $path could theoretically be empty (e.g. no path is given), in which
105 // case it shouldn't expand to array(''), which would compare to one's
106 // root /
107 $path1 = $path1 ? explode('/', $path1) : array();
108 $path2 = $path2 ? explode('/', $path2) : array();
109
110 $shared = array();
111
112 // compare paths & strip identical ancestors
113 foreach ($path1 as $i => $chunk) {
114 if (isset($path2[$i]) && $path1[$i] == $path2[$i]) {
115 $shared[] = $chunk;
116 } else {
117 break;
118 }
119 }
120
121 return implode('/', $shared);
122 }
123
124 /**
125 * Convert paths relative from 1 file to another.
126 *
127 * E.g.
128 * ../images/img.gif relative to /home/forkcms/frontend/core/layout/css
129 * should become:
130 * ../../core/layout/images/img.gif relative to
131 * /home/forkcms/frontend/cache/minified_css
132 *
133 * @param string $path The relative path that needs to be converted
134 *
135 * @return string The new relative path
136 */
137 public function convert($path)
138 {
139 // quit early if conversion makes no sense
140 if ($this->from === $this->to) {
141 return $path;
142 }
143
144 $path = $this->normalize($path);
145 // if we're not dealing with a relative path, just return absolute
146 if (strpos($path, '/') === 0) {
147 return $path;
148 }
149
150 // normalize paths
151 $path = $this->normalize($this->from.'/'.$path);
152
153 // strip shared ancestor paths
154 $shared = $this->shared($path, $this->to);
155 $path = mb_substr($path, mb_strlen($shared));
156 $to = mb_substr($this->to, mb_strlen($shared));
157
158 // add .. for every directory that needs to be traversed to new path
159 $to = str_repeat('../', count(array_filter(explode('/', $to))));
160
161 return $to.ltrim($path, '/');
162 }
163
164 /**
165 * Attempt to get the directory name from a path.
166 *
167 * @param string $path
168 *
169 * @return string
170 */
171 protected function dirname($path)
172 {
173 if (@is_file($path)) {
174 return dirname($path);
175 }
176
177 if (@is_dir($path)) {
178 return rtrim($path, '/');
179 }
180
181 // no known file/dir, start making assumptions
182
183 // ends in / = dir
184 if (mb_substr($path, -1) === '/') {
185 return rtrim($path, '/');
186 }
187
188 // has a dot in the name, likely a file
189 if (preg_match('/.*\..*$/', basename($path)) !== 0) {
190 return dirname($path);
191 }
192
193 // you're on your own here!
194 return $path;
195 }
196 }
197