PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / 4.17.0
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress v4.17.0
4.17.2 4.17.1 4.17.0 4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 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.7.0 4.8.0 4.9.0
wp-user-avatar / third-party / vendor / symfony / translation / Extractor / PhpExtractor.php
wp-user-avatar / third-party / vendor / symfony / translation / Extractor Last commit date
AbstractFileExtractor.php 2 months ago ChainExtractor.php 2 months ago ExtractorInterface.php 2 months ago PhpExtractor.php 2 months ago PhpStringTokenParser.php 2 months ago
PhpExtractor.php
212 lines
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 namespace ProfilePressVendor\Symfony\Component\Translation\Extractor;
12
13 use ProfilePressVendor\Symfony\Component\Finder\Finder;
14 use ProfilePressVendor\Symfony\Component\Translation\MessageCatalogue;
15 /**
16 * PhpExtractor extracts translation messages from a PHP template.
17 *
18 * @author Michel Salib <michelsalib@hotmail.com>
19 */
20 class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface
21 {
22 public const MESSAGE_TOKEN = 300;
23 public const METHOD_ARGUMENTS_TOKEN = 1000;
24 public const DOMAIN_TOKEN = 1001;
25 /**
26 * Prefix for new found message.
27 */
28 private $prefix = '';
29 /**
30 * The sequence that captures translation messages.
31 */
32 protected $sequences = [['->', 'trans', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['->', 'trans', '(', self::MESSAGE_TOKEN], ['new', 'TranslatableMessage', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['new', 'TranslatableMessage', '(', self::MESSAGE_TOKEN], ['new', '\\', 'Symfony', '\\', 'Component', '\\', 'Translation', '\\', 'TranslatableMessage', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['new', 'ProfilePressVendor\Symfony\Component\Translation\TranslatableMessage', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['new', '\\', 'Symfony', '\\', 'Component', '\\', 'Translation', '\\', 'TranslatableMessage', '(', self::MESSAGE_TOKEN], ['new', 'ProfilePressVendor\Symfony\Component\Translation\TranslatableMessage', '(', self::MESSAGE_TOKEN], ['t', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['t', '(', self::MESSAGE_TOKEN]];
33 /**
34 * {@inheritdoc}
35 */
36 public function extract($resource, MessageCatalogue $catalog)
37 {
38 $files = $this->extractFiles($resource);
39 foreach ($files as $file) {
40 $this->parseTokens(token_get_all(file_get_contents($file)), $catalog, $file);
41 gc_mem_caches();
42 }
43 }
44 /**
45 * {@inheritdoc}
46 */
47 public function setPrefix(string $prefix)
48 {
49 $this->prefix = $prefix;
50 }
51 /**
52 * Normalizes a token.
53 *
54 * @param mixed $token
55 *
56 * @return string|null
57 */
58 protected function normalizeToken($token)
59 {
60 if (isset($token[1]) && 'b"' !== $token) {
61 return $token[1];
62 }
63 return $token;
64 }
65 /**
66 * Seeks to a non-whitespace token.
67 */
68 private function seekToNextRelevantToken(\Iterator $tokenIterator)
69 {
70 for (; $tokenIterator->valid(); $tokenIterator->next()) {
71 $t = $tokenIterator->current();
72 if (\T_WHITESPACE !== $t[0]) {
73 break;
74 }
75 }
76 }
77 private function skipMethodArgument(\Iterator $tokenIterator)
78 {
79 $openBraces = 0;
80 for (; $tokenIterator->valid(); $tokenIterator->next()) {
81 $t = $tokenIterator->current();
82 if ('[' === $t[0] || '(' === $t[0]) {
83 ++$openBraces;
84 }
85 if (']' === $t[0] || ')' === $t[0]) {
86 --$openBraces;
87 }
88 if (0 === $openBraces && ',' === $t[0] || -1 === $openBraces && ')' === $t[0]) {
89 break;
90 }
91 }
92 }
93 /**
94 * Extracts the message from the iterator while the tokens
95 * match allowed message tokens.
96 */
97 private function getValue(\Iterator $tokenIterator)
98 {
99 $message = '';
100 $docToken = '';
101 $docPart = '';
102 for (; $tokenIterator->valid(); $tokenIterator->next()) {
103 $t = $tokenIterator->current();
104 if ('.' === $t) {
105 // Concatenate with next token
106 continue;
107 }
108 if (!isset($t[1])) {
109 break;
110 }
111 switch ($t[0]) {
112 case \T_START_HEREDOC:
113 $docToken = $t[1];
114 break;
115 case \T_ENCAPSED_AND_WHITESPACE:
116 case \T_CONSTANT_ENCAPSED_STRING:
117 if ('' === $docToken) {
118 $message .= PhpStringTokenParser::parse($t[1]);
119 } else {
120 $docPart = $t[1];
121 }
122 break;
123 case \T_END_HEREDOC:
124 if ($indentation = strspn($t[1], ' ')) {
125 $docPartWithLineBreaks = $docPart;
126 $docPart = '';
127 foreach (preg_split('~(\r\n|\n|\r)~', $docPartWithLineBreaks, -1, \PREG_SPLIT_DELIM_CAPTURE) as $str) {
128 if (\in_array($str, ["\r\n", "\n", "\r"], \true)) {
129 $docPart .= $str;
130 } else {
131 $docPart .= substr($str, $indentation);
132 }
133 }
134 }
135 $message .= PhpStringTokenParser::parseDocString($docToken, $docPart);
136 $docToken = '';
137 $docPart = '';
138 break;
139 case \T_WHITESPACE:
140 break;
141 default:
142 break 2;
143 }
144 }
145 return $message;
146 }
147 /**
148 * Extracts trans message from PHP tokens.
149 */
150 protected function parseTokens(array $tokens, MessageCatalogue $catalog, string $filename)
151 {
152 $tokenIterator = new \ArrayIterator($tokens);
153 for ($key = 0; $key < $tokenIterator->count(); ++$key) {
154 foreach ($this->sequences as $sequence) {
155 $message = '';
156 $domain = 'messages';
157 $tokenIterator->seek($key);
158 foreach ($sequence as $sequenceKey => $item) {
159 $this->seekToNextRelevantToken($tokenIterator);
160 if ($this->normalizeToken($tokenIterator->current()) === $item) {
161 $tokenIterator->next();
162 continue;
163 } elseif (self::MESSAGE_TOKEN === $item) {
164 $message = $this->getValue($tokenIterator);
165 if (\count($sequence) === $sequenceKey + 1) {
166 break;
167 }
168 } elseif (self::METHOD_ARGUMENTS_TOKEN === $item) {
169 $this->skipMethodArgument($tokenIterator);
170 } elseif (self::DOMAIN_TOKEN === $item) {
171 $domainToken = $this->getValue($tokenIterator);
172 if ('' !== $domainToken) {
173 $domain = $domainToken;
174 }
175 break;
176 } else {
177 break;
178 }
179 }
180 if ($message) {
181 $catalog->set($message, $this->prefix . $message, $domain);
182 $metadata = $catalog->getMetadata($message, $domain) ?? [];
183 $normalizedFilename = preg_replace('{[\\\\/]+}', '/', $filename);
184 $metadata['sources'][] = $normalizedFilename . ':' . $tokens[$key][2];
185 $catalog->setMetadata($message, $metadata, $domain);
186 break;
187 }
188 }
189 }
190 }
191 /**
192 * @return bool
193 *
194 * @throws \InvalidArgumentException
195 */
196 protected function canBeExtracted(string $file)
197 {
198 return $this->isFile($file) && 'php' === pathinfo($file, \PATHINFO_EXTENSION);
199 }
200 /**
201 * {@inheritdoc}
202 */
203 protected function extractFromDirectory($directory)
204 {
205 if (!class_exists(Finder::class)) {
206 throw new \LogicException(sprintf('You cannot use "%s" as the "symfony/finder" package is not installed. Try running "composer require symfony/finder".', static::class));
207 }
208 $finder = new Finder();
209 return $finder->files()->name('*.php')->in($directory);
210 }
211 }
212