Text::getExpressionTypeMap()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php declare(strict_types = 1);
2
3
namespace Apicart\FQL\Tokenizer;
4
5
use Apicart\FQL\Token\Token\GroupBegin;
6
use Apicart\FQL\Token\Token\Phrase;
7
use Apicart\FQL\Token\Token\Word;
8
use Apicart\FQL\Value\Token;
9
use RuntimeException;
10
11
final class Text extends AbstractTokenExtractor
12
{
13
    /**
14
     * Map of regex expressions to Token types.
15
     *
16
     * @var array
17
     */
18
    private static $expressionTypeMap = [
19
        '/(?<lexeme>[\s]+)/Au' => Tokenizer::TOKEN_WHITESPACE,
20
        '/(?<lexeme>\+)/Au' => Tokenizer::TOKEN_MANDATORY,
21
        '/(?<lexeme>-)/Au' => Tokenizer::TOKEN_PROHIBITED,
22
        '/(?<lexeme>!)/Au' => Tokenizer::TOKEN_LOGICAL_NOT_2,
23
        '/(?<lexeme>\))/Au' => Tokenizer::TOKEN_GROUP_END,
24
        '/(?<lexeme>NOT)(?:[\s"()+\-!]|$)/Au' => Tokenizer::TOKEN_LOGICAL_NOT,
25
        '/(?<lexeme>(?:AND|&&))(?:[\s"()+\-!]|$)/Au' => Tokenizer::TOKEN_LOGICAL_AND,
26
        '/(?<lexeme>(?:OR|\|\|))(?:[\s"()+\-!]|$)/Au' => Tokenizer::TOKEN_LOGICAL_OR,
27
        '/(?<lexeme>\()/Au' => Tokenizer::TOKEN_GROUP_BEGIN,
28
        '/(?<lexeme>(?<quote>(?<!\\\\)["])(?<phrase>.*?)(?:(?<!\\\\)(?P=quote)))/Aus' => Tokenizer::TOKEN_TERM,
29
        '/(?<lexeme>(?<word>(?:\\\\\\\\|\\\\ |\\\\\(|\\\\\)|\\\\"|[^"()\s])+?))(?:(?<!\\\\)["]|\(|\)|$|\s)/Au'
30
        => Tokenizer::TOKEN_TERM,
31
    ];
32
33
34 186
    protected function getExpressionTypeMap(): array
35
    {
36 186
        return self::$expressionTypeMap;
37
    }
38
39
40 143
    protected function createTermToken(int $position, array $data): Token
41
    {
42 143
        $lexeme = $data['lexeme'];
43
        switch (true) {
44 143
            case isset($data['word']):
45 135
                return new Word(
46 135
                    $lexeme,
47 135
                    $position,
48 135
                    '',
49
                    // un-backslash special chars
50 135
                    preg_replace('/(?:\\\\(\\\\|(["+\-!() ])))/', '$1', $data['word'])
51
                );
52 11
            case isset($data['phrase']):
53 10
                $quote = $data['quote'];
54 10
                return new Phrase(
55 10
                    $lexeme,
56 10
                    $position,
57 10
                    '',
58 10
                    $quote,
59
                    // un-backslash quote
60 10
                    preg_replace('/(?:\\\\([' . $quote . ']))/', '$1', $data['phrase'])
61
                );
62
        }
63 1
        throw new RuntimeException('Could not extract term token from the given data');
64
    }
65
66
67 14
    protected function createGroupBeginToken(int $position, array $data): GroupBegin
68
    {
69 14
        return new GroupBegin($data['lexeme'], $position, $data['lexeme'], '');
70
    }
71
72
}
73