Text   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 33
c 1
b 0
f 0
dl 0
loc 59
ccs 21
cts 21
cp 1
rs 10
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getExpressionTypeMap() 0 3 1
A createGroupBeginToken() 0 3 1
A createTermToken() 0 24 3
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