Completed
Push — master ( d70775...825d10 )
by Kacper
02:48
created

Django::getEnds()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 46
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 46
rs 8.9411
cc 1
eloc 34
nc 1
nop 1
1
<?php
2
/**
3
 * Highlighter
4
 *
5
 * Copyright (C) 2016, Some right reserved.
6
 *
7
 * @author Kacper "Kadet" Donat <[email protected]>
8
 *
9
 * Contact with author:
10
 * Xmpp: [email protected]
11
 * E-mail: [email protected]
12
 *
13
 * From Kadet with love.
14
 */
15
16
namespace Kadet\Highlighter\Language\Python;
17
18
19
use Kadet\Highlighter\Language\GreedyLanguage;
20
use Kadet\Highlighter\Matcher\CommentMatcher;
21
use Kadet\Highlighter\Matcher\RegexMatcher;
22
use Kadet\Highlighter\Matcher\SubStringMatcher;
23
use Kadet\Highlighter\Parser\CloseRule;
24
use Kadet\Highlighter\Parser\OpenRule;
25
use Kadet\Highlighter\Parser\Rule;
26
use Kadet\Highlighter\Parser\Token\LanguageToken;
27
use Kadet\Highlighter\Parser\TokenFactory;
28
use Kadet\Highlighter\Parser\Validator\Validator;
29
30
class Django extends GreedyLanguage
31
{
32
33
    /**
34
     * Tokenization rules setup
35
     */
36
    public function setupRules()
37
    {
38
        $this->rules->addMany([
39
            'comment'     => new Rule(new CommentMatcher([], [['{#', '#}']]), ['priority' => 0]),
40
            'delimiter'   => new Rule(new RegexMatcher('/((\{[{%]|[%}]\}))/')),
41
            'variable'    => new Rule(new RegexMatcher('/\{\{\s*([a-z]\w*)/')),
42
            'call'        => new Rule(new RegexMatcher('/\{\{.*?\|([a-z]\w*)/')),
43
            'keyword.tag' => new Rule(new RegexMatcher('/{%\s*([a-z]\w*)/')),
44
        ]);
45
    }
46
47
    public function getEnds($embedded = false)
48
    {
49
        return [
50
            'variable' => [
51
                new OpenRule(new SubStringMatcher('{{'), [
52
                    'factory'  => new TokenFactory(LanguageToken::class),
53
                    'priority' => 1000,
54
                    'inject'   => $this,
55
                    'context'  => Validator::everywhere(),
56
                    'language' => null
57
                ]),
58
                new CloseRule(new SubStringMatcher('}}'), [
59
                    'factory'  => new TokenFactory(LanguageToken::class),
60
                    'priority' => 1000,
61
                    'language' => $this
62
                ]),
63
            ],
64
            'tag' => [
65
                new OpenRule(new SubStringMatcher('{%'), [
66
                    'factory'  => new TokenFactory(LanguageToken::class),
67
                    'inject'   => $this,
68
                    'priority' => 1000,
69
                    'context'  => Validator::everywhere(),
70
                    'language' => null
71
                ]),
72
                new CloseRule(new SubStringMatcher('%}'), [
73
                    'factory'  => new TokenFactory(LanguageToken::class),
74
                    'language' => $this,
75
                    'priority' => 1000,
76
                ]),
77
            ],
78
            'comment' => [
79
                new OpenRule(new SubStringMatcher('{#'), [
80
                    'factory'  => new TokenFactory(LanguageToken::class),
81
                    'inject'   => $this,
82
                    'priority' => 1000,
83
                    'language' => null
84
                ]),
85
                new CloseRule(new SubStringMatcher('#}'), [
86
                    'factory'  => new TokenFactory(LanguageToken::class),
87
                    'language' => $this,
88
                    'priority' => 1000,
89
                ]),
90
            ]
91
        ];
92
    }
93
94
    /**
95
     * Unique language identifier, for example 'php'
96
     *
97
     * @return string
98
     */
99
    public function getIdentifier()
100
    {
101
        return 'python.django';
102
    }
103
}
104