PluginProbe
WPIDE – File Manager & Code Editor / 3.5.9
WPIDE – File Manager & Code Editor v3.5.9
3.5.9 3.5.8 3.5.7 2.0.14 2.0.15 2.0.16 2.0.2 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1 2.2 2.3 2.3.1 2.3.2 2.4.0 2.5 2.6 3.0 3.1 3.2 3.3 All 55 releases
wpide / vendor / symfony / mime / Encoder / QpEncoder.php

QpEncoder.php in WPIDE – File Manager & Code Editor 3.5.9, at vendor/symfony/mime/Encoder/QpEncoder.php

196 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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
12 namespace Symfony\Component\Mime\Encoder;
13
14 use Symfony\Component\Mime\CharacterStream;
15
16 /**
17 * @author Chris Corbyn
18 */
19 class QpEncoder implements EncoderInterface
20 {
21 /**
22 * Pre-computed QP for HUGE optimization.
23 */
24 private const QP_MAP = [
25 0 => '=00', 1 => '=01', 2 => '=02', 3 => '=03', 4 => '=04',
26 5 => '=05', 6 => '=06', 7 => '=07', 8 => '=08', 9 => '=09',
27 10 => '=0A', 11 => '=0B', 12 => '=0C', 13 => '=0D', 14 => '=0E',
28 15 => '=0F', 16 => '=10', 17 => '=11', 18 => '=12', 19 => '=13',
29 20 => '=14', 21 => '=15', 22 => '=16', 23 => '=17', 24 => '=18',
30 25 => '=19', 26 => '=1A', 27 => '=1B', 28 => '=1C', 29 => '=1D',
31 30 => '=1E', 31 => '=1F', 32 => '=20', 33 => '=21', 34 => '=22',
32 35 => '=23', 36 => '=24', 37 => '=25', 38 => '=26', 39 => '=27',
33 40 => '=28', 41 => '=29', 42 => '=2A', 43 => '=2B', 44 => '=2C',
34 45 => '=2D', 46 => '=2E', 47 => '=2F', 48 => '=30', 49 => '=31',
35 50 => '=32', 51 => '=33', 52 => '=34', 53 => '=35', 54 => '=36',
36 55 => '=37', 56 => '=38', 57 => '=39', 58 => '=3A', 59 => '=3B',
37 60 => '=3C', 61 => '=3D', 62 => '=3E', 63 => '=3F', 64 => '=40',
38 65 => '=41', 66 => '=42', 67 => '=43', 68 => '=44', 69 => '=45',
39 70 => '=46', 71 => '=47', 72 => '=48', 73 => '=49', 74 => '=4A',
40 75 => '=4B', 76 => '=4C', 77 => '=4D', 78 => '=4E', 79 => '=4F',
41 80 => '=50', 81 => '=51', 82 => '=52', 83 => '=53', 84 => '=54',
42 85 => '=55', 86 => '=56', 87 => '=57', 88 => '=58', 89 => '=59',
43 90 => '=5A', 91 => '=5B', 92 => '=5C', 93 => '=5D', 94 => '=5E',
44 95 => '=5F', 96 => '=60', 97 => '=61', 98 => '=62', 99 => '=63',
45 100 => '=64', 101 => '=65', 102 => '=66', 103 => '=67', 104 => '=68',
46 105 => '=69', 106 => '=6A', 107 => '=6B', 108 => '=6C', 109 => '=6D',
47 110 => '=6E', 111 => '=6F', 112 => '=70', 113 => '=71', 114 => '=72',
48 115 => '=73', 116 => '=74', 117 => '=75', 118 => '=76', 119 => '=77',
49 120 => '=78', 121 => '=79', 122 => '=7A', 123 => '=7B', 124 => '=7C',
50 125 => '=7D', 126 => '=7E', 127 => '=7F', 128 => '=80', 129 => '=81',
51 130 => '=82', 131 => '=83', 132 => '=84', 133 => '=85', 134 => '=86',
52 135 => '=87', 136 => '=88', 137 => '=89', 138 => '=8A', 139 => '=8B',
53 140 => '=8C', 141 => '=8D', 142 => '=8E', 143 => '=8F', 144 => '=90',
54 145 => '=91', 146 => '=92', 147 => '=93', 148 => '=94', 149 => '=95',
55 150 => '=96', 151 => '=97', 152 => '=98', 153 => '=99', 154 => '=9A',
56 155 => '=9B', 156 => '=9C', 157 => '=9D', 158 => '=9E', 159 => '=9F',
57 160 => '=A0', 161 => '=A1', 162 => '=A2', 163 => '=A3', 164 => '=A4',
58 165 => '=A5', 166 => '=A6', 167 => '=A7', 168 => '=A8', 169 => '=A9',
59 170 => '=AA', 171 => '=AB', 172 => '=AC', 173 => '=AD', 174 => '=AE',
60 175 => '=AF', 176 => '=B0', 177 => '=B1', 178 => '=B2', 179 => '=B3',
61 180 => '=B4', 181 => '=B5', 182 => '=B6', 183 => '=B7', 184 => '=B8',
62 185 => '=B9', 186 => '=BA', 187 => '=BB', 188 => '=BC', 189 => '=BD',
63 190 => '=BE', 191 => '=BF', 192 => '=C0', 193 => '=C1', 194 => '=C2',
64 195 => '=C3', 196 => '=C4', 197 => '=C5', 198 => '=C6', 199 => '=C7',
65 200 => '=C8', 201 => '=C9', 202 => '=CA', 203 => '=CB', 204 => '=CC',
66 205 => '=CD', 206 => '=CE', 207 => '=CF', 208 => '=D0', 209 => '=D1',
67 210 => '=D2', 211 => '=D3', 212 => '=D4', 213 => '=D5', 214 => '=D6',
68 215 => '=D7', 216 => '=D8', 217 => '=D9', 218 => '=DA', 219 => '=DB',
69 220 => '=DC', 221 => '=DD', 222 => '=DE', 223 => '=DF', 224 => '=E0',
70 225 => '=E1', 226 => '=E2', 227 => '=E3', 228 => '=E4', 229 => '=E5',
71 230 => '=E6', 231 => '=E7', 232 => '=E8', 233 => '=E9', 234 => '=EA',
72 235 => '=EB', 236 => '=EC', 237 => '=ED', 238 => '=EE', 239 => '=EF',
73 240 => '=F0', 241 => '=F1', 242 => '=F2', 243 => '=F3', 244 => '=F4',
74 245 => '=F5', 246 => '=F6', 247 => '=F7', 248 => '=F8', 249 => '=F9',
75 250 => '=FA', 251 => '=FB', 252 => '=FC', 253 => '=FD', 254 => '=FE',
76 255 => '=FF',
77 ];
78
79 private static $safeMapShare = [];
80
81 /**
82 * A map of non-encoded ascii characters.
83 *
84 * @var string[]
85 *
86 * @internal
87 */
88 protected $safeMap = [];
89
90 public function __construct()
91 {
92 $id = static::class;
93 if (!isset(self::$safeMapShare[$id])) {
94 $this->initSafeMap();
95 self::$safeMapShare[$id] = $this->safeMap;
96 } else {
97 $this->safeMap = self::$safeMapShare[$id];
98 }
99 }
100
101 protected function initSafeMap(): void
102 {
103 foreach (array_merge([0x09, 0x20], range(0x21, 0x3C), range(0x3E, 0x7E)) as $byte) {
104 $this->safeMap[$byte] = \chr($byte);
105 }
106 }
107
108 /**
109 * {@inheritdoc}
110 *
111 * Takes an unencoded string and produces a QP encoded string from it.
112 *
113 * QP encoded strings have a maximum line length of 76 characters.
114 * If the first line needs to be shorter, indicate the difference with
115 * $firstLineOffset.
116 */
117 public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string
118 {
119 if ($maxLineLength > 76 || $maxLineLength <= 0) {
120 $maxLineLength = 76;
121 }
122
123 $thisLineLength = $maxLineLength - $firstLineOffset;
124
125 $lines = [];
126 $lNo = 0;
127 $lines[$lNo] = '';
128 $currentLine = &$lines[$lNo++];
129 $size = $lineLen = 0;
130 $charStream = new CharacterStream($string, $charset);
131
132 // Fetching more than 4 chars at one is slower, as is fetching fewer bytes
133 // Conveniently 4 chars is the UTF-8 safe number since UTF-8 has up to 6
134 // bytes per char and (6 * 4 * 3 = 72 chars per line) * =NN is 3 bytes
135 while (null !== $bytes = $charStream->readBytes(4)) {
136 $enc = $this->encodeByteSequence($bytes, $size);
137
138 $i = strpos($enc, '=0D=0A');
139 $newLineLength = $lineLen + (false === $i ? $size : $i);
140
141 if ($currentLine && $newLineLength >= $thisLineLength) {
142 $lines[$lNo] = '';
143 $currentLine = &$lines[$lNo++];
144 $thisLineLength = $maxLineLength;
145 $lineLen = 0;
146 }
147
148 $currentLine .= $enc;
149
150 if (false === $i) {
151 $lineLen += $size;
152 } else {
153 // 6 is the length of '=0D=0A'.
154 $lineLen = $size - strrpos($enc, '=0D=0A') - 6;
155 }
156 }
157
158 return $this->standardize(implode("=\r\n", $lines));
159 }
160
161 /**
162 * Encode the given byte array into a verbatim QP form.
163 */
164 private function encodeByteSequence(array $bytes, int &$size): string
165 {
166 $ret = '';
167 $size = 0;
168 foreach ($bytes as $b) {
169 if (isset($this->safeMap[$b])) {
170 $ret .= $this->safeMap[$b];
171 ++$size;
172 } else {
173 $ret .= self::QP_MAP[$b];
174 $size += 3;
175 }
176 }
177
178 return $ret;
179 }
180
181 /**
182 * Make sure CRLF is correct and HT/SPACE are in valid places.
183 */
184 private function standardize(string $string): string
185 {
186 $string = str_replace(["\t=0D=0A", ' =0D=0A', '=0D=0A'], ["=09\r\n", "=20\r\n", "\r\n"], $string);
187 switch ($end = \ord(substr($string, -1))) {
188 case 0x09:
189 case 0x20:
190 $string = substr_replace($string, self::QP_MAP[$end], -1);
191 }
192
193 return $string;
194 }
195 }
196