Passed
Pull Request — master (#183)
by Luke
03:12
created

AbstractSniffer::getOption()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2.0625

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 1
dl 0
loc 6
ccs 3
cts 4
cp 0.75
crap 2.0625
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * CSVelte: Slender, elegant CSV for PHP
4
 *
5
 * Inspired by Python's CSV module and Frictionless Data and the W3C's CSV
6
 * standardization efforts, CSVelte was written in an effort to take all the
7
 * suck out of working with CSV.
8
 *
9
 * @copyright Copyright (c) 2018 Luke Visinoni
10
 * @author    Luke Visinoni <[email protected]>
11
 * @license   See LICENSE file (MIT license)
12
 */
13
namespace CSVelte\Sniffer;
14
15
abstract class AbstractSniffer
16
{
17
    /**
18
     * Placeholder strings -- hold the place of newlines and delimiters contained
19
     * within quoted text so that the explode method doesn't split incorrectly.
20
     */
21
    const PLACEHOLDER_NEWLINE = '[__NEWLINE__]';
22
    const PLACEHOLDER_DELIM   = '[__DELIMIT__]';
23
24
    protected $options = [];
25
26 7
    public function __construct(array $options = [])
27
    {
28 7
        $this->setOptions($options);
29 7
    }
30
31 7
    protected function setOptions(array $options)
32
    {
33 7
        $this->options = array_merge($this->options, $options);
34 7
        return $this;
35
    }
36
37
    protected function setOption($option, $value)
38
    {
39
        if (array_key_exists($option, $this->options)) {
40
            $this->options[$option] = $value;
41
        }
42
        return $this;
43
    }
44
45 6
    protected function getOption($option)
46
    {
47 6
        if (array_key_exists($option, $this->options)) {
48 6
            return $this->options[$option];
49
        };
50
    }
51
52
    /**
53
     * Replace all instances of newlines and whatever character you specify (as
54
     * the delimiter) that are contained within quoted text. The replacements are
55
     * simply a special placeholder string.
56
     *
57
     * @param string $data  The string to do the replacements on
58
     * @param string $delim The delimiter character to replace
59
     *
60
     * @return string The data with replacements performed
61
     */
62 2
    protected function replaceQuotedSpecialChars($data, $delim = null, $eol = null)
63
    {
64 2
        if (is_null($eol)) {
65 1
            $eol = "\r\n|\r|\n";
66 1
        }
67 2
        return preg_replace_callback('/([\'"])(.*)\1/imsU', function ($matches) use ($delim, $eol) {
68 2
            $ret = preg_replace("/({$eol})/", static::PLACEHOLDER_NEWLINE, $matches[0]);
69 2
            if (!is_null($delim)) {
70 2
                $ret = str_replace($delim, static::PLACEHOLDER_DELIM, $ret);
71 2
            }
72 2
            return $ret;
73 2
        }, $data);
74
    }
75
76
    /**
77
     * Replaces all quoted columns with a blank string. I was using this method
78
     * to prevent explode() from incorrectly splitting at delimiters and newlines
79
     * within quotes when parsing a file. But this was before I wrote the
80
     * replaceQuotedSpecialChars method which (at least to me) makes more sense.
81
     *
82
     * @param string $data The string to replace quoted strings within
83
     *
84
     * @return string The input string with quoted strings removed
85
     */
86 3
    protected function removeQuotedStrings($data)
87
    {
88 3
        return preg_replace($pattern = '/(["\'])(?:(?=(\\\\?))\2.)*?\1/sm', $replace = '', $data);
89
    }
90
91 1
    protected function unQuote($string)
92
    {
93 1
        return preg_replace('/^(["\'])(.*)\1$/', '\2', (string) $string);
94
    }
95
96
    /**
97
     * Analyze data (sniff)
98
     *
99
     * @param string $data The data to analyze (sniff)
100
     *
101
     * @return string|string[]
102
     */
103
    abstract public function sniff($data);
104
}