Completed
Push — 1.x ( 257780...f31d1d )
by Mikaël
42:33 queued 33:38
created

Utils::cleanString()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 6
cts 6
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
crap 2
1
<?php
2
3
namespace WsdlToPhp\PackageGenerator\Generator;
4
5
use WsdlToPhp\PackageGenerator\ConfigurationReader\GeneratorOptions;
6
7
class Utils
8
{
9
    /**
10
     * Gets upper case word admong a string from the end or from the beginning part
11
     * @param string $optionValue
12
     * @param string $string the string from which we can extract the part
13
     * @return string
14
     */
15 472
    public static function getPart($optionValue, $string)
16
    {
17 472
        $elementType = '';
18 472
        $string = str_replace('_', '', $string);
19 472
        $string = preg_replace('/([0-9])/', '', $string);
20 472
        if (!empty($string)) {
21
            switch ($optionValue) {
22 472
                case GeneratorOptions::VALUE_END:
23 12
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
24 12
                    $partsCount = count($parts);
25 12
                    if ($partsCount == 0) {
26
                        $elementType = $string;
27 12
                    } elseif (!empty($parts[$partsCount - 1])) {
28 12
                        $elementType = substr($string, strrpos($string, implode('', array_slice($parts, -1))) - 1);
29 12
                    } else {
30
                        for ($i = $partsCount - 1; $i >= 0; $i--) {
31
                            $part = trim($parts[$i]);
32
                            if (!empty($part)) {
33
                                break;
34
                            }
35
                        }
36
                        $elementType = substr($string, ((count($parts) - 2 - $i) + 1) * -1);
37
                    }
38 12
                    break;
39 460
                case GeneratorOptions::VALUE_START:
40 460
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
41 460
                    $partsCount = count($parts);
42 460
                    if ($partsCount == 0) {
43
                        $elementType = $string;
44 460
                    } elseif (empty($parts[0]) && !empty($parts[1])) {
45 460
                        $elementType = substr($string, 0, strlen($parts[1]) + 1);
46 460
                    } else {
47 16
                        for ($i = 0; $i < $partsCount; $i++) {
48 16
                            $part = trim($parts[$i]);
49 16
                            if (!empty($part)) {
50 16
                                break;
51
                            }
52 16
                        }
53 16
                        $elementType = substr($string, 0, $i);
54
                    }
55 460
                    break;
56
                default:
57
                    break;
58
            }
59 472
        }
60 472
        return $elementType;
61
    }
62
    /**
63
     * Get content from url using a proxy or not
64
     * @param string $url
65
     * @param string $basicAuthLogin
66
     * @param string $basicAuthPassword
67
     * @param string $proxyHost
68
     * @param string $proxyPort
69
     * @param string $proxyLogin
70
     * @param string $proxyPassword
71
     * @param array $contextOptions
72
     * @return string
73
     */
74 8
    public static function getContentFromUrl($url, $basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = array())
75
    {
76 8
        $context = null;
77 8
        $options = self::getContentFromUrlContextOptions($url, $basicAuthLogin, $basicAuthPassword, $proxyHost, $proxyPort, $proxyLogin, $proxyPassword, $contextOptions);
78 8
        if (!empty($options)) {
79 4
            $context = stream_context_create($options);
80 4
        }
81 8
        return file_get_contents($url, false, $context);
82
    }
83
    /**
84
     * @param string $url
85
     * @param string $basicAuthLogin
86
     * @param string $basicAuthPassword
87
     * @param string $proxyHost
88
     * @param string $proxyPort
89
     * @param string $proxyLogin
90
     * @param string $proxyPassword
91
     * @param array $contextOptions
92
     * @return string[]
93
     */
94 24
    public static function getContentFromUrlContextOptions($url, $basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = array())
95
    {
96 24
        $protocol = strpos($url, 'https://') !== false ? 'https' : 'http';
97 24
        $proxyOptions = $basicAuthOptions = array();
98 24
        if (!empty($basicAuthLogin) && !empty($basicAuthPassword)) {
99
            $basicAuthOptions = array(
100
                $protocol => array(
101
                    'header' => array(
102 12
                        sprintf('Authorization: Basic %s', base64_encode(sprintf('%s:%s', $basicAuthLogin, $basicAuthPassword))),
103 12
                    ),
104 12
                ),
105 12
            );
106 12
        }
107 24
        if (!empty($proxyHost)) {
108
            $proxyOptions = array(
109
                $protocol => array(
110 12
                    'proxy' => sprintf('tcp://%s%s',
111 12
                        $proxyHost,
112 12
                        empty($proxyPort) ? '' : sprintf(':%s', $proxyPort)
113 12
                    ),
114
                    'header' => array(
115 12
                        sprintf('Proxy-Authorization: Basic %s', base64_encode(sprintf('%s:%s', $proxyLogin, $proxyPassword))),
116 12
                    ),
117 12
                ),
118 12
            );
119 12
        }
120 24
        return array_merge_recursive($contextOptions, $proxyOptions, $basicAuthOptions);
121
    }
122
    /**
123
     * Returns the value with good type
124
     * @param mixed $value the value
125
     * @return mixed
126
     */
127 580
    public static function getValueWithinItsType($value, $knownType = null)
128
    {
129 580
        if (is_int($value) || (!is_null($value) && in_array($knownType, array('time', 'positiveInteger', 'unsignedLong', 'unsignedInt', 'short', 'long', 'int', 'integer'), true))) {
130 8
            return intval($value);
131 580
        } elseif (is_float($value) || (!is_null($value) && in_array($knownType, array('float', 'double', 'decimal'), true))) {
132
            return floatval($value);
133 580
        } elseif (is_bool($value) || (!is_null($value) && in_array($knownType, array('bool', 'boolean'), true))) {
134 108
            return ($value === 'true' || $value === true || $value === 1 || $value === '1');
135
        }
136 564
        return $value;
137
    }
138
    /**
139
     * @param string $origin
140
     * @param string $destination
141
     * @return string
142
     */
143 188
    public static function resolveCompletePath($origin, $destination)
144
    {
145 188
        $resolvedPath = $destination;
146 188
        if (!empty($destination) && strpos($destination, 'http://') === false && strpos($destination, 'https://') === false && !empty($origin)) {
147 188
            if (substr($destination, 0, 2) === './') {
148 8
                $destination = substr($destination, 2);
149 8
            }
150 188
            $destinationParts = explode('/', $destination);
151
152 188
            $fileParts = pathinfo($origin);
153 188
            $fileBasename = (is_array($fileParts) && array_key_exists('basename', $fileParts)) ? $fileParts['basename'] : '';
154 188
            $parts = parse_url(str_replace('/' . $fileBasename, '', $origin));
155 188
            $scheme = (is_array($parts) && array_key_exists('scheme', $parts)) ? $parts['scheme'] : '';
156 188
            $host = (is_array($parts) && array_key_exists('host', $parts)) ? $parts['host'] : '';
157 188
            $path = (is_array($parts) && array_key_exists('path', $parts)) ? $parts['path'] : '';
158 188
            $path = str_replace('/' . $fileBasename, '', $path);
159 188
            $pathParts = explode('/', $path);
160 188
            $finalPath = implode('/', $pathParts);
161
162 188
            foreach ($destinationParts as $locationPart) {
163 188
                if ($locationPart == '..') {
164 8
                    $finalPath = substr($finalPath, 0, strrpos($finalPath, '/', 0));
165 8
                } else {
166 188
                    $finalPath .= '/' . $locationPart;
167
                }
168 188
            }
169
170 188
            $port = (is_array($parts) && array_key_exists('port', $parts)) ? $parts['port'] : '';
171
            /**
172
             * Remote file
173
             */
174 188
            if (!empty($scheme) && !empty($host)) {
175 4
                $resolvedPath = str_replace('urn', 'http', $scheme) . '://' . $host . (!empty($port) ? ':' . $port : '') . str_replace('//', '/', $finalPath);
176 188
            } elseif (empty($scheme) && empty($host) && count($pathParts)) {
177
                /**
178
                 * Local file
179
                 */
180 184
                if (is_file($finalPath)) {
181 184
                    $resolvedPath = $finalPath;
182 184
                }
183 184
            }
184 188
        }
185 188
        return $resolvedPath;
186
    }
187
    /**
188
     * Clean comment
189
     * @param string $comment the comment to clean
190
     * @param string $glueSeparator ths string to use when gathering values
191
     * @param bool $uniqueValues indicates if comment values must be unique or not
192
     * @return string
193
     */
194 136
    public static function cleanComment($comment, $glueSeparator = ',', $uniqueValues = true)
195
    {
196 136
        if (!is_scalar($comment) && !is_array($comment)) {
197 4
            return '';
198
        }
199 132
        return trim(str_replace('*/', '*[:slash:]', is_scalar($comment) ? $comment : implode($glueSeparator, $uniqueValues ? array_unique($comment) : $comment)));
200
    }
201
    /**
202
     * Clean a string to make it valid as PHP variable
203
     * See more about the used regular expression at {@link http://www.regular-expressions.info/unicode.html}:
204
     * - \p{L} for any valid letter
205
     * - \p{N} for any valid number
206
     * - /u for suporting unicode
207
     * @param string $string the string to clean
208
     * @param bool $keepMultipleUnderscores optional, allows to keep the multiple consecutive underscores
209
     * @return string
210
     */
211 532
    public static function cleanString($string, $keepMultipleUnderscores = true)
212
    {
213 532
        $cleanedString = preg_replace('/[^\p{L}\p{N}_]/u', '_', $string);
214 532
        if (!$keepMultipleUnderscores) {
215 96
            $cleanedString = preg_replace('/[_]+/', '_', $cleanedString);
216 96
        }
217 532
        return $cleanedString;
218
    }
219
    /**
220
     * @param string $namespacedClassName
221
     * @return string
222
     */
223 196
    public static function removeNamespace($namespacedClassName)
224
    {
225 196
        $elements = explode('\\', $namespacedClassName);
226 196
        return (string)array_pop($elements);
227
    }
228
    /**
229
     * @param string $directory
230
     * @param int $permissions
231
     * @return bool
232
     */
233 220
    public static function createDirectory($directory, $permissions = 0775)
234
    {
235 220
        if (!is_dir($directory)) {
236 44
            mkdir($directory, $permissions, true);
237 44
        }
238 220
        return true;
239
    }
240
}
241