-
Notifications
You must be signed in to change notification settings - Fork 0
/
Marker.php
98 lines (66 loc) · 1.91 KB
/
Marker.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
<?php
namespace Pronode;
class Marker {
/**
* String with {{markerCommand}} syntax.
*/
public string $string;
/**
* Pronode command converted from {{markerCommand}}
*/
public string $command;
/**
* Marker HTML placement type: inner || outer
*
* If marker is inside tag's attribute => outer (so JS knows to replace outerHtml)
* If marker is inside tag contents => inner (so JS knows to replace innerHtml)
*/
public string $htmlPlacement = 'undefined';
/**
* Marker start position inside Template contents
*/
public int $pos;
/**
* Marker end position inside Template contents
*/
public int $end;
/**
* Marker -> Fragment relation.
* Marker may belong to only one Fragment
*/
public Fragment $fragment;
function __construct(string $markerString) {
$this->string = $markerString;
$this->command = $this->toCommand($this->string);
}
/**
* Sets start and end positions of Marker inside Template contents
*/
public function setPos(int $start) : void {
$this->pos = $start;
$this->end = $start + strlen($this->string);
}
/**
* Converts {{markerCommand}} to Pronode command.
*/
protected function toCommand(string $markerString) : string {
$command = $markerString;
// Remove braces:
$command = str_replace('{', '', $command);
$command = str_replace('}', '', $command);
// Template shorthand: target|templateName syntax is just shorthand for target.view,templateName
$command = str_replace('|', '.view,', $command);
// Make sure that the command always requests for a view:
if (strpos($command, '.view') === false) {
$command .= '.view'; // TODO: this has to be the LAST command, above checks just an occurence
}
return $command;
}
/**
* Executes ->command on given Node.
* Returns result child Node.
*/
public function exec(Node $node) : Node {
return $node->exec($this->command);
}
}