‪TYPO3CMS  ‪main
CsvStreamFilter.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
26 class ‪CsvStreamFilter extends \php_user_filter
27 {
28  protected const ‪NAME = 'csv.typo3';
29 
47  public function ‪filter($in, $out, &$consumed, $closing): int
48  {
49  while ($bucket = stream_bucket_make_writeable($in)) {
50  // removes sequence boundary indicator
51  $bucket->data = str_replace(
52  $this->params['sequence'],
53  '',
54  $bucket->data
55  );
56  if ($this->params['LF'] === false) {
57  // remove line-feed added by `fputcsv` per default
58  $bucket->data = preg_replace('#\r?\n$#', '', $bucket->data);
59  }
60  $consumed += $bucket->datalen;
61  stream_bucket_append($out, $bucket);
62  }
63  return PSFS_PASS_ON;
64  }
65 
70  public static function ‪applyStreamFilter($stream, bool $LF = true): \Closure
71  {
73  // must contain a spacing character to enforce enclosure
74  $sequence = "\t\x1d\x1e\x1f";
75  stream_filter_append(
76  $stream,
77  self::NAME,
78  STREAM_FILTER_WRITE,
79  ['sequence' => $sequence, 'LF' => $LF]
80  );
81  return ‪self::buildStreamFilterModifier($sequence);
82  }
83 
87  protected static function ‪registerStreamFilter()
88  {
89  if (in_array(self::NAME, stream_get_filters(), true)) {
90  return;
91  }
92  stream_filter_register(
93  self::NAME,
94  static::class
95  );
96  }
97 
98  protected static function ‪buildStreamFilterModifier(string $sequence): \Closure
99  {
100  return static function ($element) use ($sequence) {
101  foreach ($element as &$value) {
102  if (is_numeric($value) || $value === '') {
103  continue;
104  }
105  $value = $sequence . $value;
106  }
107  unset($value); // de-reference
108  return $element;
109  };
110  }
111 }
‪TYPO3\CMS\Core\IO\CsvStreamFilter\NAME
‪const NAME
Definition: CsvStreamFilter.php:28
‪TYPO3\CMS\Core\IO\CsvStreamFilter\registerStreamFilter
‪static registerStreamFilter()
Definition: CsvStreamFilter.php:87
‪TYPO3\CMS\Core\IO\CsvStreamFilter\applyStreamFilter
‪static applyStreamFilter($stream, bool $LF=true)
Definition: CsvStreamFilter.php:70
‪TYPO3\CMS\Core\IO\CsvStreamFilter\buildStreamFilterModifier
‪static buildStreamFilterModifier(string $sequence)
Definition: CsvStreamFilter.php:98
‪TYPO3\CMS\Core\IO\CsvStreamFilter\filter
‪filter($in, $out, &$consumed, $closing)
Definition: CsvStreamFilter.php:47
‪TYPO3\CMS\Core\IO
Definition: CsvStreamFilter.php:18
‪TYPO3\CMS\Core\IO\CsvStreamFilter
Definition: CsvStreamFilter.php:27