SimpleQueryColorizer   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 60
dl 0
loc 89
rs 10
c 0
b 0
f 0
wmc 6

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A format() 0 10 2
A colorize() 0 15 3
1
<?php declare(strict_types=1);
2
3
namespace Rostenkowski\Doctrine\Debugger;
4
5
6
class SimpleQueryColorizer
7
{
8
9
	private static $keywords = [
10
		'DROP TABLE',
11
		'CREATE TABLE',
12
		'PRAGMA',
13
		'SELECT',
14
		'FROM',
15
		'WHERE',
16
		'ORDER BY',
17
		'GROUP BY',
18
		'LEFT JOIN',
19
		'INNER JOIN',
20
		'UNION ALL',
21
		'AND',
22
		'OR',
23
		'UPDATE',
24
		'INSERT',
25
		'DELETE',
26
		'START TRANSACTION',
27
		'COMMIT',
28
		'INTO',
29
		'SET',
30
		'VALUES',
31
		'DEFAULT',
32
		'PRIMARY KEY',
33
		'VARCHAR',
34
		'INTEGER',
35
		'TEXT',
36
		'IN',
37
		'IS',
38
		'NULL',
39
		'NOT NULL',
40
	];
41
42
	private static $newline = [
43
		'SELECT',
44
		'FROM',
45
		'WHERE',
46
		'ORDER BY',
47
		'GROUP BY',
48
		'LEFT JOIN',
49
		'INNER JOIN',
50
		'UNION ALL',
51
		'AND',
52
		'OR',
53
	];
54
55
	private static $keywordRegex;
56
57
	private static $newlineRegex;
58
59
60
	public function __construct()
61
	{
62
		self::$keywordRegex = '/\b(' . implode('|', self::$keywords) . ')\b/';
63
		self::$newlineRegex = '/\b(' . implode('|', self::$newline) . ')\b/';
64
	}
65
66
67
	public function colorize(string $sql, bool $format = false): string
68
	{
69
		if ($format) {
70
			$sql = $this->format($sql);
71
		}
72
73
		// each query type has custom colors
74
		$type = strtolower(substr($sql, 0, 6));
75
		if (!in_array($type, ['select', 'update', 'delete', 'insert'])) {
76
			$type = '';
77
		}
78
		$template = '<span class="reserved">$1</span>';
79
		$sql = preg_replace(self::$keywordRegex, $template, $sql);
80
81
		return "<div class='query $type'>$sql</div>";
82
	}
83
84
85
	public function format(string $sql): string
86
	{
87
		$template = '<br>$1';
88
		$sql = preg_replace(self::$newlineRegex, $template, $sql);
89
90
		if (substr($sql, 0, 4) === '<br>') {
91
			$sql = substr($sql, 4);
92
		}
93
94
		return $sql;
95
	}
96
}
97