wproot 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/bin/wproot +7 -0
- data/lib/wproot.rb +11 -0
- data/lib/wproot/cli.rb +35 -0
- data/lib/wproot/compass.rb +15 -0
- data/lib/wproot/haml.rb +15 -0
- data/lib/wproot/version.rb +3 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/wproot_spec.rb +59 -0
- data/vendor/HamlPHP.php +7 -0
- data/vendor/HamlPHP/.gitignore +6 -0
- data/vendor/HamlPHP/MIT-LICENSE +22 -0
- data/vendor/HamlPHP/README.mkd +39 -0
- data/vendor/HamlPHP/src/HamlPHP/CommentNode.php +92 -0
- data/vendor/HamlPHP/src/HamlPHP/Compiler.php +109 -0
- data/vendor/HamlPHP/src/HamlPHP/ContentEvaluator/ContentEvaluator.php +16 -0
- data/vendor/HamlPHP/src/HamlPHP/ContentEvaluator/DefaultContentEvaluator.php +22 -0
- data/vendor/HamlPHP/src/HamlPHP/DoctypeNode.php +47 -0
- data/vendor/HamlPHP/src/HamlPHP/Element.php +618 -0
- data/vendor/HamlPHP/src/HamlPHP/ElementNode.php +222 -0
- data/vendor/HamlPHP/src/HamlPHP/Filter/CssFilter.php +31 -0
- data/vendor/HamlPHP/src/HamlPHP/Filter/Filter.php +18 -0
- data/vendor/HamlPHP/src/HamlPHP/Filter/FilterContainer.php +34 -0
- data/vendor/HamlPHP/src/HamlPHP/Filter/JavascriptFilter.php +29 -0
- data/vendor/HamlPHP/src/HamlPHP/Filter/PhpFilter.php +24 -0
- data/vendor/HamlPHP/src/HamlPHP/Filter/PlainFilter.php +46 -0
- data/vendor/HamlPHP/src/HamlPHP/FilterNode.php +29 -0
- data/vendor/HamlPHP/src/HamlPHP/HamlNode.php +75 -0
- data/vendor/HamlPHP/src/HamlPHP/HamlPHP.php +191 -0
- data/vendor/HamlPHP/src/HamlPHP/Helpers.php +136 -0
- data/vendor/HamlPHP/src/HamlPHP/Interpolation.php +71 -0
- data/vendor/HamlPHP/src/HamlPHP/NodeFactory.php +80 -0
- data/vendor/HamlPHP/src/HamlPHP/RootNode.php +133 -0
- data/vendor/HamlPHP/src/HamlPHP/Storage/DontEvaluateStorage.php +68 -0
- data/vendor/HamlPHP/src/HamlPHP/Storage/FileStorage.php +74 -0
- data/vendor/HamlPHP/src/HamlPHP/Storage/Storage.php +24 -0
- data/vendor/HamlPHP/src/HamlPHP/TagNode.php +125 -0
- data/vendor/HamlPHP/src/HamlPHP/Util/BaseException.php +340 -0
- data/vendor/HamlPHP/src/HamlPHP/Util/BaseObject.php +94 -0
- data/vendor/HamlPHP/src/HamlPHP/Util/StringScanner.php +989 -0
- data/wproot.gemspec +21 -0
- metadata +126 -0
@@ -0,0 +1,222 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
require_once 'RootNode.php';
|
4
|
+
require_once 'HamlNode.php';
|
5
|
+
require_once 'Element.php';
|
6
|
+
|
7
|
+
class ElementNode extends HamlNode
|
8
|
+
{
|
9
|
+
private $_phpVariable;
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @var Element
|
13
|
+
*/
|
14
|
+
private $_el;
|
15
|
+
|
16
|
+
public function __construct($line, $compiler)
|
17
|
+
{
|
18
|
+
parent::__construct($line);
|
19
|
+
$this->_phpVariable = false;
|
20
|
+
$this->_el = new Element($this->getHaml(), $compiler);
|
21
|
+
$this->_phpVariable = $this->_el->isPhpVariable();
|
22
|
+
}
|
23
|
+
|
24
|
+
public function render()
|
25
|
+
{
|
26
|
+
return $this->renderHtml($this->_el);
|
27
|
+
}
|
28
|
+
|
29
|
+
private function renderHtml(Element $element)
|
30
|
+
{
|
31
|
+
$output = '';
|
32
|
+
|
33
|
+
if ($this->getIndentationLevel() > 0)
|
34
|
+
{
|
35
|
+
$output .= $this->getSpaces() . '<' . $element->getTag();
|
36
|
+
}
|
37
|
+
else
|
38
|
+
{
|
39
|
+
$output .= '<' . $element->getTag();
|
40
|
+
}
|
41
|
+
|
42
|
+
if ($element->useAttsHelper())
|
43
|
+
{
|
44
|
+
$output .= ' <?php atts(array(';
|
45
|
+
if (($atts = $element->getAttributes()) != null)
|
46
|
+
{
|
47
|
+
if (isset($atts['id'])) {
|
48
|
+
$output .= "'id' => " . $this->_renderArrayValue($atts['id'], '_', 'php').', ';
|
49
|
+
unset($atts['id']);
|
50
|
+
}
|
51
|
+
|
52
|
+
if (isset($atts['class'])) {
|
53
|
+
$output .= "'class' => " . $this->_renderArrayValue($atts['class'], ' ', 'php').', ';
|
54
|
+
unset($atts['class']);
|
55
|
+
}
|
56
|
+
|
57
|
+
foreach ($atts as $name => $att)
|
58
|
+
{
|
59
|
+
$output .= "";
|
60
|
+
switch ($att['t'])
|
61
|
+
{
|
62
|
+
case 'str':
|
63
|
+
$output .= "'$name' => {$att['v']}, ";
|
64
|
+
continue;
|
65
|
+
case 'php':
|
66
|
+
if (is_array($att['v']))
|
67
|
+
$output .= "'$name' => array(" . join(',', $att['v']) . ')';
|
68
|
+
else
|
69
|
+
$output .= "'$name' => {$att['v']}, ";
|
70
|
+
|
71
|
+
continue;
|
72
|
+
case 'static':
|
73
|
+
$output .= "'$name' => '$name', ";
|
74
|
+
continue;
|
75
|
+
case 'function':
|
76
|
+
$output .= "{$att['v']}, ";
|
77
|
+
continue;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
$output = rtrim($output, ', ');
|
83
|
+
$output .= ')); ?>';
|
84
|
+
}
|
85
|
+
else
|
86
|
+
{
|
87
|
+
if (($atts = $element->getAttributes()) !== null)
|
88
|
+
{
|
89
|
+
if (isset($atts['id'])) {
|
90
|
+
$output .= ' id="'.$this->_renderArrayValue($atts['id'], '_', 'txt').'"';
|
91
|
+
unset($atts['id']);
|
92
|
+
}
|
93
|
+
|
94
|
+
if (isset($atts['class'])) {
|
95
|
+
$output .= ' class="'.$this->_renderArrayValue($atts['class'], ' ', 'txt').'"';
|
96
|
+
unset($atts['class']);
|
97
|
+
}
|
98
|
+
|
99
|
+
foreach ($atts as $name => $att)
|
100
|
+
{
|
101
|
+
switch ($att['t'])
|
102
|
+
{
|
103
|
+
case 'str':
|
104
|
+
$output .= " {$name}={$att['v']}";
|
105
|
+
continue;
|
106
|
+
case 'php':
|
107
|
+
$output .= " $name=<?php {$att['v']}; ?>";
|
108
|
+
|
109
|
+
continue;
|
110
|
+
case 'static':
|
111
|
+
$output .= " $name=\"$name\"";
|
112
|
+
continue;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
$content = $this->renderTagContent($element->getInlineContent());
|
119
|
+
|
120
|
+
$interpolation = new Interpolation($output);
|
121
|
+
$output = $interpolation->render();
|
122
|
+
|
123
|
+
// render inline content
|
124
|
+
$output .= '>' . $content . '</' . $element->getTag() . '>';
|
125
|
+
return $output . "\n";
|
126
|
+
}
|
127
|
+
|
128
|
+
/**
|
129
|
+
* Joins the string $parts together using $separator but format the return according to context.
|
130
|
+
* This method concatenates all the parts using $separtor as glue. If the context is 'txt'
|
131
|
+
* and at least one part is php, the returned string will be encapsuled inside <?php ... ?>
|
132
|
+
* If the context is 'php' the string returned will be a valid php code.
|
133
|
+
* @code
|
134
|
+
* _renderArrayValue(array(
|
135
|
+
* array('t' => 'str', 'v' => 'a',
|
136
|
+
* array('t' => 'str', 'v' => 'b')); # -> a_b
|
137
|
+
*
|
138
|
+
* _renderArrayValue(array(
|
139
|
+
* array('t' => 'str', 'v' => 'a',
|
140
|
+
* array('t' => 'str', 'v' => 'b'), 'php'); # -> 'a_b'
|
141
|
+
*
|
142
|
+
* _renderArrayValue(array(
|
143
|
+
* array('t' => 'str', 'v' => 'a',
|
144
|
+
* array('t' => 'php', 'v' => '$b')); # -> <?php echo 'a_'.$b; ?>
|
145
|
+
*
|
146
|
+
* _renderArrayValue(array(
|
147
|
+
* array('t' => 'str', 'v' => 'a',
|
148
|
+
* array('t' => 'php', 'v' => '$b'), 'php'); # -> 'a_'.$b
|
149
|
+
* @endcode
|
150
|
+
*
|
151
|
+
* @param $arr_parts The components of the id
|
152
|
+
* @param $context The context into which the value will be inserted. Can be 'txt' (default) or 'php'
|
153
|
+
*/
|
154
|
+
private function _renderArrayValue($parts, $separator = ' ', $context = 'txt')
|
155
|
+
{
|
156
|
+
$hasPhp = false;
|
157
|
+
$values = array();
|
158
|
+
|
159
|
+
foreach ($parts as $p)
|
160
|
+
{
|
161
|
+
if ($p['t'] == 'php')
|
162
|
+
{
|
163
|
+
$hasPhp = true;
|
164
|
+
$values[] = $p['v'];
|
165
|
+
}
|
166
|
+
else
|
167
|
+
{
|
168
|
+
$values[] = "'{$p['v']}'";
|
169
|
+
}
|
170
|
+
}
|
171
|
+
|
172
|
+
if (!$hasPhp)
|
173
|
+
{
|
174
|
+
$quote = '';
|
175
|
+
if ('php' == $context)
|
176
|
+
$quote = "'";
|
177
|
+
|
178
|
+
$value = '';
|
179
|
+
foreach($parts as $p)
|
180
|
+
$value .= "$separator{$p['v']}";
|
181
|
+
|
182
|
+
return $quote . trim($value, $separator) . $quote;
|
183
|
+
}
|
184
|
+
else
|
185
|
+
{
|
186
|
+
$value = join(".", $values);
|
187
|
+
$value = str_replace("'.'", $separator, $value);
|
188
|
+
$value = str_replace(".'", ".'$separator", $value);
|
189
|
+
$value = str_replace("'.", "$separator'.", $value);
|
190
|
+
|
191
|
+
if('txt' == $context)
|
192
|
+
return '<?php echo '.$value.'; ?>';
|
193
|
+
|
194
|
+
return $value;
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
private function renderTagContent($content)
|
199
|
+
{
|
200
|
+
if ($this->hasChildren())
|
201
|
+
{
|
202
|
+
$content = "\n" . $this->renderChildren() . $this->getSpaces();
|
203
|
+
}
|
204
|
+
|
205
|
+
if ($content === null)
|
206
|
+
{
|
207
|
+
$content = '';
|
208
|
+
}
|
209
|
+
|
210
|
+
if ($this->_phpVariable)
|
211
|
+
{
|
212
|
+
$content = "<?php echo " . $content . " ?>";
|
213
|
+
}
|
214
|
+
else
|
215
|
+
{
|
216
|
+
$interpolation = new Interpolation($content);
|
217
|
+
$content = $interpolation->render();
|
218
|
+
}
|
219
|
+
|
220
|
+
return $content;
|
221
|
+
}
|
222
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
require_once 'Filter.php';
|
4
|
+
|
5
|
+
class CssFilter implements Filter
|
6
|
+
{
|
7
|
+
public function getIdentifier()
|
8
|
+
{
|
9
|
+
return 'css';
|
10
|
+
}
|
11
|
+
|
12
|
+
public function filter(HamlNode $node)
|
13
|
+
{
|
14
|
+
if (null === $node) {
|
15
|
+
throw new Exception("CssFilter: node is null.");
|
16
|
+
}
|
17
|
+
|
18
|
+
$plainFilter = new PlainFilter();
|
19
|
+
|
20
|
+
$output = $node->getSpaces() . "<style type=\"text/css\">\n";
|
21
|
+
|
22
|
+
$oldLevel = $node->getIndentationLevel();
|
23
|
+
$node->setIndentationLevel($oldLevel + 2);
|
24
|
+
$output .= $plainFilter->filter($node);
|
25
|
+
$node->setIndentationLevel($oldLevel);
|
26
|
+
|
27
|
+
$output .= $node->getSpaces() . "</style>";
|
28
|
+
|
29
|
+
return $output . "\n";
|
30
|
+
}
|
31
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
interface Filter
|
4
|
+
{
|
5
|
+
/**
|
6
|
+
* Returns an identifier of this filter.
|
7
|
+
*
|
8
|
+
* @return string
|
9
|
+
*/
|
10
|
+
public function getIdentifier();
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Filters given node.
|
14
|
+
*
|
15
|
+
* @param HamlNode object
|
16
|
+
*/
|
17
|
+
public function filter(HamlNode $node);
|
18
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
require_once 'Filter.php';
|
4
|
+
|
5
|
+
class FilterContainer
|
6
|
+
{
|
7
|
+
private $_filters = array();
|
8
|
+
|
9
|
+
public function __construct($filters = array())
|
10
|
+
{
|
11
|
+
foreach ($filters as $filter) {
|
12
|
+
$this->addFilter($filter);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
public function addFilter(Filter $filter)
|
17
|
+
{
|
18
|
+
$this->_filters[$filter->getIdentifier()] = $filter;
|
19
|
+
}
|
20
|
+
|
21
|
+
public function getFilters()
|
22
|
+
{
|
23
|
+
return $this->_filters;
|
24
|
+
}
|
25
|
+
|
26
|
+
public function getFilter($identifier)
|
27
|
+
{
|
28
|
+
if (isset($this->_filters[$identifier])) {
|
29
|
+
return $this->_filters[$identifier];
|
30
|
+
}
|
31
|
+
|
32
|
+
return null;
|
33
|
+
}
|
34
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
class JavascriptFilter implements Filter
|
4
|
+
{
|
5
|
+
public function getIdentifier()
|
6
|
+
{
|
7
|
+
return 'javascript';
|
8
|
+
}
|
9
|
+
|
10
|
+
public function filter(HamlNode $node)
|
11
|
+
{
|
12
|
+
if ($node === null) {
|
13
|
+
throw new Exception('Javascript filter: node is null');
|
14
|
+
}
|
15
|
+
|
16
|
+
$plainFilter = new PlainFilter();
|
17
|
+
|
18
|
+
$output = $node->getSpaces() . "<script type=\"text/javascript\">\n";
|
19
|
+
|
20
|
+
$oldLevel = $node->getIndentationLevel();
|
21
|
+
$node->setIndentationLevel($oldLevel + 2);
|
22
|
+
$output .= $plainFilter->filter($node);
|
23
|
+
$node->setIndentationLevel($oldLevel);
|
24
|
+
|
25
|
+
$output .= $node->getSpaces() . "</script>";
|
26
|
+
|
27
|
+
return $output . "\n";
|
28
|
+
}
|
29
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
class PhpFilter implements Filter
|
4
|
+
{
|
5
|
+
public function getIdentifier()
|
6
|
+
{
|
7
|
+
return 'php';
|
8
|
+
}
|
9
|
+
|
10
|
+
public function filter(HamlNode $node)
|
11
|
+
{
|
12
|
+
if ($node === null) {
|
13
|
+
throw new Exception('PHP filter: node is null');
|
14
|
+
}
|
15
|
+
|
16
|
+
$plainFilter = new PlainFilter();
|
17
|
+
|
18
|
+
$output = $node->getSpaces() . "<?php\n";
|
19
|
+
$output .= $plainFilter->filter($node);
|
20
|
+
$output .= $node->getSpaces() . "?>";
|
21
|
+
|
22
|
+
return $output . "\n";
|
23
|
+
}
|
24
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
require_once 'Filter.php';
|
4
|
+
|
5
|
+
class PlainFilter implements Filter
|
6
|
+
{
|
7
|
+
public function getIdentifier()
|
8
|
+
{
|
9
|
+
return 'plain';
|
10
|
+
}
|
11
|
+
|
12
|
+
public function filter(HamlNode $node)
|
13
|
+
{
|
14
|
+
if (null === $node) {
|
15
|
+
throw new Exception("PlainFilter: node is null.");
|
16
|
+
}
|
17
|
+
|
18
|
+
$children = $node->getChildren();
|
19
|
+
$output = '';
|
20
|
+
|
21
|
+
foreach ($children as $childNode) {
|
22
|
+
$output .= $this->renderChildrenHaml($childNode);
|
23
|
+
}
|
24
|
+
|
25
|
+
return $output;
|
26
|
+
}
|
27
|
+
|
28
|
+
protected function renderChildrenHaml(HamlNode $node)
|
29
|
+
{
|
30
|
+
$parent = $node->getParent();
|
31
|
+
$haml = $parent !== null
|
32
|
+
? $parent->getSpaces() . $node->getHaml() : $node->getRawHaml();
|
33
|
+
|
34
|
+
$output = $haml . "\n";
|
35
|
+
|
36
|
+
if ($node->hasChildren()) {
|
37
|
+
$children = $node->getChildren();
|
38
|
+
|
39
|
+
for ($i = 0, $count = count($children); $i < $count; ++$i) {
|
40
|
+
$output .= $this->renderChildrenHaml($children[$i]);
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
return $output;
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
class FilterNode extends HamlNode
|
4
|
+
{
|
5
|
+
private $_filterContainer = null;
|
6
|
+
|
7
|
+
public function __construct($line, FilterContainer $container = null)
|
8
|
+
{
|
9
|
+
parent::__construct($line);
|
10
|
+
$this->_filterContainer = $container;
|
11
|
+
}
|
12
|
+
|
13
|
+
public function render()
|
14
|
+
{
|
15
|
+
if (null === $this->_filterContainer) {
|
16
|
+
return '';
|
17
|
+
}
|
18
|
+
|
19
|
+
$identifier = str_replace(':', '', $this->getHaml());
|
20
|
+
$filter = $this->_filterContainer->getFilter($identifier);
|
21
|
+
|
22
|
+
if (null === $filter) {
|
23
|
+
throw new Exception(sprintf("Unknown filter '%s'.", $identifier));
|
24
|
+
}
|
25
|
+
|
26
|
+
$interpolation = new Interpolation($filter->filter($this));
|
27
|
+
return $interpolation->render();
|
28
|
+
}
|
29
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
class HamlNode extends RootNode
|
4
|
+
{
|
5
|
+
private $_rawHaml;
|
6
|
+
private $_haml;
|
7
|
+
private $_spaces;
|
8
|
+
|
9
|
+
public function __construct($line)
|
10
|
+
{
|
11
|
+
parent::__construct();
|
12
|
+
$this->_rawHaml = $line;
|
13
|
+
$this->_haml = trim($line);
|
14
|
+
$this->setIndentationLevel(strlen($line) - strlen(ltrim($line)));
|
15
|
+
}
|
16
|
+
|
17
|
+
public function getSpaces()
|
18
|
+
{
|
19
|
+
return $this->_spaces;
|
20
|
+
}
|
21
|
+
|
22
|
+
public function setIndentationLevel($level)
|
23
|
+
{
|
24
|
+
$oldLevel = $this->getIndentationLevel();
|
25
|
+
parent::setIndentationLevel($level);
|
26
|
+
$this->_spaces = $this->createSpaces();
|
27
|
+
|
28
|
+
if ($this->hasChildren()) {
|
29
|
+
$children = $this->getChildren();
|
30
|
+
|
31
|
+
for ($i = 0, $len = count($children); $i < $len; $i++) {
|
32
|
+
$childNode = $children[$i];
|
33
|
+
$currentLevel = $this->getIndentationLevel();
|
34
|
+
$childLevel = $childNode->getIndentationLevel();
|
35
|
+
$oldDiff = $childLevel - $oldLevel;
|
36
|
+
$newLevel = $currentLevel + $oldDiff;
|
37
|
+
$childNode->setIndentationLevel($newLevel);
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
public function getRawHaml()
|
43
|
+
{
|
44
|
+
return $this->_rawHaml;
|
45
|
+
}
|
46
|
+
|
47
|
+
public function getHaml()
|
48
|
+
{
|
49
|
+
return $this->_haml;
|
50
|
+
}
|
51
|
+
|
52
|
+
private function createSpaces()
|
53
|
+
{
|
54
|
+
$spaces = '';
|
55
|
+
|
56
|
+
for ($i = 0; $i < $this->getIndentationLevel(); ++$i) {
|
57
|
+
$spaces .= ' ';
|
58
|
+
}
|
59
|
+
|
60
|
+
return $spaces;
|
61
|
+
}
|
62
|
+
|
63
|
+
public function render()
|
64
|
+
{
|
65
|
+
$output = $this->_spaces . $this->_haml . "\n";
|
66
|
+
$interpolation = new Interpolation($output);
|
67
|
+
$output = $interpolation->render();
|
68
|
+
|
69
|
+
if ($this->hasChildren()) {
|
70
|
+
$output = $output . $this->renderChildren();
|
71
|
+
}
|
72
|
+
|
73
|
+
return $output;
|
74
|
+
}
|
75
|
+
}
|