-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCodeParser.php
128 lines (115 loc) · 3.38 KB
/
CodeParser.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
namespace common\components\mailing;
use JBBCode\CodeDefinition;
use JBBCode\CodeDefinitionSet;
use JBBCode\Parser;
use yii\base\Component;
use yii\base\InvalidConfigException;
use yii\di\Instance;
use yii\mail\MessageInterface;
use yii\web\View;
/**
* Class CodeParser
* @package common\components\mailing
*/
class CodeParser extends Component implements CodeDefinitionSet
{
use IsTrait;
const EVENT_BEFORE = 'before';
const EVENT_AFTER = 'after';
const EVENT_READY = 'ready';
const EVENT_DESTRUCT = 'destruct';
/** @var Mailing */
public $mailing;
/** @var Target */
public $target;
/** @var MessageInterface */
public $mail;
/** @var array */
public $vars = [];
/** @var callable[] */
protected $_assetsRegister = [];
/** @var CodeDefinition[] */
protected $_definitions = [];
public function __destruct()
{
$this->trigger(self::EVENT_DESTRUCT);
}
/**
* @inheritdoc
* @throws InvalidConfigException
*/
public function init()
{
if ($this->mailing === null && $this->target instanceof Target) {
$this->mailing = $this->target->delivery->mailing;
}
foreach ($this->mailing->codes as $tagName => $code) {
/** @var CodeBuilder $instance */
if (is_string($code) && $this->is($code, 'JBBCode\CodeDefinition')) {
$instance = new CodeBuilder([
'codeClass' => $code,
]);
} else if (is_array($code) && array_key_exists('class', $code) && is_string($code['class']) && $this->is($code['class'], 'JBBCode\CodeDefinition')) {
$class = $code['class'];
unset($code['class']);
$instance = $instance = new CodeBuilder([
'codeClass' => $class,
'codeConfig' => $code
]);
} else {
$instance = Instance::ensure($code, 'common\components\mailing\CodeBuilder');
}
if (empty($instance->tagName)) {
$instance->tagName = $tagName;
}
if (empty($instance->replacementText)) {
$instance->replacementText = '{param}';
}
foreach ($instance->getDefinitions($this) as $definition) {
$this->_definitions[] = $definition;
}
}
}
/**
* @return CodeDefinition[]
*/
public function getCodeDefinitions()
{
return $this->_definitions;
}
/**
* @param string $string
* @param array $vars
* @return string
*/
public function parse($string, $vars = [])
{
$this->vars = array_merge($this->vars, $vars);
$parser = new Parser();
$parser->addCodeDefinitionSet($this);
$this->trigger(self::EVENT_BEFORE);
$parser->parse($string);
$this->trigger(self::EVENT_AFTER);
return $parser->getAsHTML();
}
/**
* @param callable $callback
*/
public function addAssetsRegister($callback)
{
if (is_callable($callback)) {
$this->_assetsRegister[] = $callback;
}
}
/**
* @param View $view
*/
public function registerAssets($view)
{
foreach ($this->_assetsRegister as $callback) {
$callback($view);
}
$this->trigger(self::EVENT_READY);
}
}