RegexpMapper::main()   A
last analyzed

Complexity

Conditions 6
Paths 6

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
cc 6
eloc 6
nc 6
nop 1
dl 0
loc 12
ccs 0
cts 7
cp 0
crap 42
rs 9.2222
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
5
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
6
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
11
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
13
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
14
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15
 *
16
 * This software consists of voluntary contributions made by many individuals
17
 * and is licensed under the LGPL. For more information please see
18
 * <http://phing.info>.
19
 */
20
21
namespace Phing\Mapper;
22
23
use Phing\Exception\BuildException;
24
use Phing\Util\Regexp;
25
26
/**
27
 * Uses regular expressions to perform filename transformations.
28
 *
29
 * @author Andreas Aderhold <[email protected]>
30
 * @author Hans Lellelid <[email protected]>
31
 */
32
class RegexpMapper implements FileNameMapper
33
{
34
    /**
35
     * @var string
36
     */
37
    private $to;
38
39
    /**
40
     * The Regexp engine.
41
     *
42
     * @var Regexp
43
     */
44
    private $reg;
45
46
    private $handleDirSep = false;
47
    private $caseSensitive = true;
48
49
    /**
50
     * Instantiage regexp matcher here.
51
     */
52
    public function __construct()
53
    {
54
        $this->reg = new Regexp();
55
        $this->reg->setIgnoreCase(!$this->caseSensitive);
56
    }
57
58
    /**
59
     * Attribute specifying whether to ignore the difference
60
     * between / and \ (the two common directory characters).
61
     *
62
     * @param bool $handleDirSep a boolean, default is false
63
     */
64
    public function setHandleDirSep($handleDirSep)
65
    {
66
        $this->handleDirSep = $handleDirSep;
67
    }
68
69
    /**
70
     * Attribute specifying whether to ignore the difference
71
     * between / and \ (the two common directory characters).
72
     */
73
    public function getHandleDirSep()
74
    {
75
        return $this->handleDirSep;
76
    }
77
78
    /**
79
     * Attribute specifying whether to ignore the case difference
80
     * in the names.
81
     *
82
     * @param bool $caseSensitive a boolean, default is false
83
     */
84
    public function setCaseSensitive($caseSensitive)
85
    {
86
        $this->caseSensitive = $caseSensitive;
87
    }
88
89
    /**
90
     * Sets the &quot;from&quot; pattern. Required.
91
     * {@inheritdoc}
92
     *
93
     * @param string $from
94
     */
95
    public function setFrom($from)
96
    {
97
        if (null === $from) {
0 ignored issues
show
introduced by
The condition null === $from is always false.
Loading history...
98
            throw new BuildException("this mapper requires a 'from' attribute");
99
        }
100
101
        $this->reg->setPattern($from);
102
    }
103
104
    /**
105
     * Sets the &quot;to&quot; pattern. Required.
106
     *
107
     * {@inheritdoc}
108
     *
109
     * @param string $to
110
     *
111
     * @intern [HL] I'm changing the way this works for now to just use string
112
     *              <code>$this->to = StringHelper::toCharArray($to);</code>
113
     */
114
    public function setTo($to)
115
    {
116
        if (null === $to) {
0 ignored issues
show
introduced by
The condition null === $to is always false.
Loading history...
117
            throw new BuildException("this mapper requires a 'to' attribute");
118
        }
119
120
        $this->to = $to;
121
    }
122
123
    /**
124
     * {@inheritdoc}
125
     *
126
     * @return null|array
127
     */
128
    public function main($sourceFileName)
129
    {
130
        if ($this->handleDirSep) {
131
            if (false !== strpos('\\', $sourceFileName)) {
132
                $sourceFileName = str_replace('\\', '/', $sourceFileName);
133
            }
134
        }
135
        if (null === $this->reg || null === $this->to || !$this->reg->matches((string) $sourceFileName)) {
136
            return null;
137
        }
138
139
        return [$this->replaceReferences($sourceFileName)];
140
    }
141
142
    /**
143
     * Replace all backreferences in the to pattern with the matched groups.
144
     * groups of the source.
145
     *
146
     * @param string $source the source filename
147
     *
148
     * @return null|array|string
149
     *
150
     * FIXME Can't we just use engine->replace() to handle this?  the Preg engine will automatically convert \1 references to $1
151
     *
152
     * @intern the expression has already been processed (when ->matches() was run in Main())
153
     *         so no need to pass $source again to the engine.
154
     *         Replaces \1 with value of reg->getGroup(1) and return the modified "to" string.
155
     */
156
    private function replaceReferences($source)
0 ignored issues
show
Unused Code introduced by
The parameter $source is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

156
    private function replaceReferences(/** @scrutinizer ignore-unused */ $source)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
157
    {
158
        return preg_replace_callback('/\\\([\d]+)/', [$this, 'replaceReferencesCallback'], $this->to);
159
    }
160
161
    /**
162
     * Gets the matched group from the Regexp engine.
163
     *
164
     * @param array $matches matched elements
165
     *
166
     * @return string
167
     */
168
    private function replaceReferencesCallback($matches)
169
    {
170
        return (string) $this->reg->getGroup($matches[1]);
171
    }
172
}
173