rblade 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/rblade/compiler/compiles_components.rb +39 -9
- data/lib/rblade/compiler/compiles_echos.rb +5 -4
- data/lib/rblade/compiler/compiles_statements.rb +2 -0
- data/lib/rblade/compiler/statements/compiles_props.rb +61 -0
- data/lib/rblade/compiler/tokenizes_components.rb +2 -2
- data/lib/rblade/compiler/tokenizes_statements.rb +2 -58
- data/lib/rblade/component_store.rb +8 -8
- data/lib/rblade/helpers/attributes_manager.rb +62 -0
- data/lib/rblade/helpers/class_manager.rb +23 -0
- data/lib/rblade/helpers/style_manager.rb +37 -0
- data/lib/rblade/helpers/tokenizer.rb +63 -0
- data/lib/rblade/rails_template.rb +4 -1
- data/rblade.gemspec +2 -2
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 388670a7f7f3d90c6249e149cd51e898dbadc66d182e0d0111948677cb85719c
|
4
|
+
data.tar.gz: 8dd2d5415191fb833a850b9ba9f2e0fd1d51a3722d466cd410c28c9c02e079dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65742f3fbb5ffca6bbbf05e94b4d9838cbf488ae835c1607abdb73cca9c04308a5de142a356ecdbd374019eb73ef3a6ccbe9dec732fceaa555ab580ca0a7ebec
|
7
|
+
data.tar.gz: 0bb1616971c4dc02d919f9c432bf478e2f18a2021116834aac10e7be340720e0f75855c997beb5a45fb8c456cb980d5dfeaa7e44e49681c28c1643b1b168d15d
|
data/CHANGELOG.md
ADDED
@@ -2,6 +2,11 @@ require "rblade/component_store"
|
|
2
2
|
|
3
3
|
module RBlade
|
4
4
|
class CompilesComponents
|
5
|
+
def initialize
|
6
|
+
@component_count = 0
|
7
|
+
@component_stack = []
|
8
|
+
end
|
9
|
+
|
5
10
|
def compile!(tokens)
|
6
11
|
tokens.each do |token|
|
7
12
|
if [:component, :component_start, :component_end].none? token.type
|
@@ -21,25 +26,50 @@ module RBlade
|
|
21
26
|
private
|
22
27
|
|
23
28
|
def compile_token_start token
|
24
|
-
|
25
|
-
|
29
|
+
@component_count += 1
|
30
|
+
|
31
|
+
@component_stack << {
|
32
|
+
name: token.value[:name],
|
33
|
+
attributes: token.value[:attributes],
|
34
|
+
index: @component_count
|
35
|
+
}
|
36
|
+
|
37
|
+
"_comp_#{@component_count}_swap=_out;_out='';"
|
26
38
|
end
|
27
39
|
|
28
40
|
def compile_token_end token
|
29
|
-
|
41
|
+
component = @component_stack.pop
|
42
|
+
if token.value[:name] != component[:name]
|
43
|
+
raise StandardError.new "Unexpected closing tag (#{token.value[:name]}) expecting #{component[:name]}"
|
44
|
+
end
|
45
|
+
|
46
|
+
attributes = compile_attributes component[:attributes]
|
47
|
+
|
48
|
+
code = "def _component(slot,attributes);#{attributes[:assignments].join}_out='';"
|
49
|
+
code << "_stacks=[];"
|
50
|
+
code << "attributes=RBlade::AttributesManager.new(attributes);"
|
30
51
|
code << ComponentStore.fetchComponent(token.value[:name])
|
31
|
-
code << "RBlade::StackManager.get(_stacks) + _out;end;
|
52
|
+
code << "RBlade::StackManager.get(_stacks) + _out;end;"
|
53
|
+
code << "_slot=_out;_out=_comp_#{component[:index]}_swap;"
|
54
|
+
code << "_out<<_component(_slot,{#{attributes[:arguments].join(",")}});"
|
32
55
|
|
33
56
|
code
|
34
57
|
end
|
35
58
|
|
36
|
-
def compile_attributes
|
59
|
+
def compile_attributes attributes
|
37
60
|
attribute_arguments = []
|
38
61
|
attribute_assignments = []
|
39
62
|
|
40
|
-
|
41
|
-
if attribute[:type] == "class"
|
42
|
-
attribute_arguments.push "'
|
63
|
+
attributes.each do |attribute|
|
64
|
+
if attribute[:type] == "class"
|
65
|
+
attribute_arguments.push "'class': RBlade::ClassManager.new(#{attribute[:value]})"
|
66
|
+
attribute_assignments.push "_class = attributes[:class];"
|
67
|
+
|
68
|
+
next
|
69
|
+
end
|
70
|
+
if attribute[:type] == "style"
|
71
|
+
attribute_arguments.push "'style': RBlade::StyleManager.new(#{attribute[:value]})"
|
72
|
+
attribute_assignments.push "_style = attributes[:style];"
|
43
73
|
|
44
74
|
next
|
45
75
|
end
|
@@ -49,7 +79,7 @@ module RBlade
|
|
49
79
|
end
|
50
80
|
|
51
81
|
if attribute[:type] == "ruby"
|
52
|
-
attribute_arguments.push "'#{attribute[:name]}': (#{attribute[:value]})
|
82
|
+
attribute_arguments.push "'#{attribute[:name]}': (#{attribute[:value]})"
|
53
83
|
end
|
54
84
|
|
55
85
|
if attribute[:type] == "pass_through"
|
@@ -35,11 +35,12 @@ module RBlade
|
|
35
35
|
segments.delete_at i
|
36
36
|
segments.delete_at i + 1
|
37
37
|
segment_value = "_out<<"
|
38
|
-
# Special case for slot - we want this to be able to output HTML
|
39
|
-
if !wrapper_function.nil? && segments[i] != "slot"
|
40
|
-
|
38
|
+
# Special case for slot and attributes - we want this to be able to output HTML
|
39
|
+
segment_value <<= if !wrapper_function.nil? && segments[i] != "slot" && !segments[i].start_with?("attributes")
|
40
|
+
wrapper_function + "(" + segments[i] + ");"
|
41
|
+
else
|
42
|
+
"(" + segments[i] + ").to_s;"
|
41
43
|
end
|
42
|
-
segment_value <<= "(" + segments[i] + ");"
|
43
44
|
segments[i] = Token.new(:echo, segment_value)
|
44
45
|
|
45
46
|
i += 1
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "rblade/compiler/statements/compiles_conditionals"
|
2
2
|
require "rblade/compiler/statements/compiles_inline_ruby"
|
3
3
|
require "rblade/compiler/statements/compiles_loops"
|
4
|
+
require "rblade/compiler/statements/compiles_props"
|
4
5
|
require "rblade/compiler/statements/compiles_stacks"
|
5
6
|
|
6
7
|
module RBlade
|
@@ -88,6 +89,7 @@ module RBlade
|
|
88
89
|
"next" => [CompilesLoops, :compileNext],
|
89
90
|
"nextif" => [CompilesLoops, :compileNextIf],
|
90
91
|
"prepend" => [CompilesStacks, :compilePrepend],
|
92
|
+
"props" => [CompilesProps, :compileProps],
|
91
93
|
"push" => [CompilesStacks, :compilePush],
|
92
94
|
"readonly" => [CompilesConditionals, :compileReadonly],
|
93
95
|
"required" => [CompilesConditionals, :compileRequired],
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "rblade/helpers/tokenizer"
|
2
|
+
|
3
|
+
module RBlade
|
4
|
+
class CompilesStatements
|
5
|
+
class CompilesProps
|
6
|
+
def compileProps args
|
7
|
+
if args.nil?
|
8
|
+
raise StandardError.new "Props statement: wrong number of arguments (given #{args&.count}, expecting 1)"
|
9
|
+
end
|
10
|
+
|
11
|
+
props = extractProps args[0]
|
12
|
+
props.map do |key, value|
|
13
|
+
if value == "_required"
|
14
|
+
"if !defined?(#{key});raise \"Props statement: #{key} is not defined\";end;"
|
15
|
+
else
|
16
|
+
"if !defined?(#{key});#{key}=#{value};end;"
|
17
|
+
end
|
18
|
+
end.join
|
19
|
+
end
|
20
|
+
|
21
|
+
def extractProps prop_string
|
22
|
+
if !prop_string.start_with?("{") || !prop_string.end_with?("}")
|
23
|
+
raise StandardError.new "Props statement: expecting hash as parameter"
|
24
|
+
end
|
25
|
+
|
26
|
+
props = {}
|
27
|
+
prop_strings = Tokenizer.extractCommaSeparatedValues prop_string[1..-2]
|
28
|
+
|
29
|
+
prop_strings.each do |prop|
|
30
|
+
prop.strip!
|
31
|
+
|
32
|
+
key, value = prop.split(/^
|
33
|
+
(?:
|
34
|
+
('.+'):
|
35
|
+
|
|
36
|
+
(".+"):
|
37
|
+
|
|
38
|
+
([^ :]+):
|
39
|
+
|
|
40
|
+
:(?:
|
41
|
+
'(.+?)'
|
42
|
+
|
|
43
|
+
"(.+?)"
|
44
|
+
|
|
45
|
+
([^"' ]+)
|
46
|
+
)\s*=>
|
47
|
+
)
|
48
|
+
\s*(.+?)$
|
49
|
+
/x).reject(&:empty?)
|
50
|
+
|
51
|
+
if key.nil? || value.nil?
|
52
|
+
raise StandardError.new "Props statement: invalid property hash"
|
53
|
+
end
|
54
|
+
props[key] = value
|
55
|
+
end
|
56
|
+
|
57
|
+
props
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require "rblade/helpers/tokenizer"
|
1
2
|
require "ripper"
|
2
3
|
|
3
4
|
module RBlade
|
@@ -80,7 +81,7 @@ module RBlade
|
|
80
81
|
return nil
|
81
82
|
end
|
82
83
|
|
83
|
-
arguments =
|
84
|
+
arguments = Tokenizer.extractCommaSeparatedValues segments[segment_index][1..-2]
|
84
85
|
segments.delete_at segment_index
|
85
86
|
|
86
87
|
arguments
|
@@ -110,62 +111,5 @@ module RBlade
|
|
110
111
|
|
111
112
|
parentheses_difference.zero?
|
112
113
|
end
|
113
|
-
|
114
|
-
def extractArguments(segment)
|
115
|
-
# Add a comma to the end to delimit the end of the last argument
|
116
|
-
segment = segment[1..-2] + ","
|
117
|
-
segment_lines = segment.lines
|
118
|
-
|
119
|
-
tokens = Ripper.lex segment
|
120
|
-
arguments = []
|
121
|
-
|
122
|
-
current_line = 1
|
123
|
-
current_index = 0
|
124
|
-
bracket_count = {
|
125
|
-
"[]": 0,
|
126
|
-
"{}": 0,
|
127
|
-
"()": 0
|
128
|
-
}
|
129
|
-
tokens.each do |token|
|
130
|
-
case token[1]
|
131
|
-
when :on_lbracket
|
132
|
-
bracket_count[:[]] += 1
|
133
|
-
when :on_rbracket
|
134
|
-
bracket_count[:[]] -= 1
|
135
|
-
when :on_lbrace
|
136
|
-
bracket_count[:"{}"] += 1
|
137
|
-
when :on_rbrace
|
138
|
-
bracket_count[:"{}"] -= 1
|
139
|
-
when :on_lparen
|
140
|
-
bracket_count[:"()"] += 1
|
141
|
-
when :on_rparen
|
142
|
-
bracket_count[:"()"] -= 1
|
143
|
-
when :on_comma
|
144
|
-
if bracket_count[:[]] != 0 || bracket_count[:"{}"] != 0 || bracket_count[:"()"] != 0
|
145
|
-
next
|
146
|
-
end
|
147
|
-
|
148
|
-
argument = ""
|
149
|
-
|
150
|
-
# Concatenate all lines up to this token's line, including the tail end of the current line
|
151
|
-
if token[0][0] != current_line
|
152
|
-
(current_line...token[0][0]).each do |i|
|
153
|
-
argument << (segment_lines[i - 1].slice(current_index..-1) || "")
|
154
|
-
current_index = 0
|
155
|
-
end
|
156
|
-
current_line = token[0][0]
|
157
|
-
end
|
158
|
-
argument <<= segment_lines[current_line - 1].slice(current_index...token[0][1])
|
159
|
-
|
160
|
-
arguments.push argument.strip
|
161
|
-
|
162
|
-
current_index = token[0][1] + 1
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
return nil if arguments.count == 1 && arguments.first == ""
|
167
|
-
|
168
|
-
arguments
|
169
|
-
end
|
170
114
|
end
|
171
115
|
end
|
@@ -8,13 +8,13 @@ module RBlade
|
|
8
8
|
namespace = nil
|
9
9
|
path = name
|
10
10
|
|
11
|
-
if name.match
|
12
|
-
namespace, path = name.split(
|
11
|
+
if name.match? "::"
|
12
|
+
namespace, path = name.split("::")
|
13
13
|
end
|
14
14
|
|
15
|
-
path.
|
15
|
+
path.tr! ".", "/"
|
16
16
|
|
17
|
-
@@
|
17
|
+
@@template_paths[namespace]&.each do |base_path|
|
18
18
|
FILE_EXTENSIONS.each do |extension|
|
19
19
|
if File.exist? base_path + path + extension
|
20
20
|
return RBlade::Compiler.compileString File.read(base_path + path + extension)
|
@@ -28,15 +28,15 @@ module RBlade
|
|
28
28
|
def self.add_path path, namespace = nil
|
29
29
|
path = path.to_s
|
30
30
|
if !path.end_with? "/"
|
31
|
-
path
|
31
|
+
path += "/"
|
32
32
|
end
|
33
33
|
|
34
|
-
@@
|
35
|
-
@@
|
34
|
+
@@template_paths[namespace] ||= []
|
35
|
+
@@template_paths[namespace] << path
|
36
36
|
end
|
37
37
|
|
38
38
|
private
|
39
39
|
|
40
|
-
@@
|
40
|
+
@@template_paths = {}
|
41
41
|
end
|
42
42
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module RBlade
|
2
|
+
class AttributesManager
|
3
|
+
@attributes = {}
|
4
|
+
def initialize attributes
|
5
|
+
@attributes = attributes
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_s attributes = nil
|
9
|
+
attributes ||= @attributes
|
10
|
+
|
11
|
+
attributes.map do |key, value|
|
12
|
+
"#{key}=\"#{h(value)}\""
|
13
|
+
end.join " "
|
14
|
+
end
|
15
|
+
|
16
|
+
def only(keys)
|
17
|
+
keys = if keys.is_a? Array
|
18
|
+
keys.map(&:to_sym)
|
19
|
+
else
|
20
|
+
[keys.to_sym]
|
21
|
+
end
|
22
|
+
|
23
|
+
self.class.new @attributes.slice(*keys)
|
24
|
+
end
|
25
|
+
|
26
|
+
def except(keys)
|
27
|
+
keys = if keys.is_a? Array
|
28
|
+
keys.map(&:to_sym)
|
29
|
+
else
|
30
|
+
[keys.to_sym]
|
31
|
+
end
|
32
|
+
|
33
|
+
self.class.new @attributes.except(*keys)
|
34
|
+
end
|
35
|
+
|
36
|
+
def merge(default_attributes)
|
37
|
+
new_attributes = default_attributes
|
38
|
+
|
39
|
+
@attributes.each do |key, value|
|
40
|
+
if key == :class && !new_attributes[key].nil?
|
41
|
+
unless new_attributes[key].end_with? " "
|
42
|
+
new_attributes[key] << " "
|
43
|
+
end
|
44
|
+
new_attributes[key] << value.to_s
|
45
|
+
next
|
46
|
+
end
|
47
|
+
|
48
|
+
if key == :style && !new_attributes[key].nil?
|
49
|
+
unless new_attributes[key].end_with? ";"
|
50
|
+
new_attributes[key] << ";"
|
51
|
+
end
|
52
|
+
new_attributes[key] << value.to_s
|
53
|
+
next
|
54
|
+
end
|
55
|
+
|
56
|
+
new_attributes[key] = value
|
57
|
+
end
|
58
|
+
|
59
|
+
self.class.new new_attributes
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RBlade
|
2
|
+
class ClassManager
|
3
|
+
def initialize classes
|
4
|
+
if classes.is_a? String
|
5
|
+
@classes = classes
|
6
|
+
elsif classes.is_a? Array
|
7
|
+
@classes = classes.join " "
|
8
|
+
elsif classes.is_a? Hash
|
9
|
+
@classes = ""
|
10
|
+
classes.map do |value, predicate|
|
11
|
+
if predicate
|
12
|
+
@classes << "#{value} "
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@classes.rstrip!
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
@classes
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module RBlade
|
2
|
+
class StyleManager
|
3
|
+
def initialize styles
|
4
|
+
if styles.is_a? String
|
5
|
+
@styles = styles.strip
|
6
|
+
unless @styles == "" || @styles.end_with?(";")
|
7
|
+
@styles << ";"
|
8
|
+
end
|
9
|
+
elsif styles.is_a? Array
|
10
|
+
@styles = styles.map do |style|
|
11
|
+
style = style.strip
|
12
|
+
unless style.end_with? ";"
|
13
|
+
style << ";"
|
14
|
+
end
|
15
|
+
|
16
|
+
style
|
17
|
+
end.join
|
18
|
+
elsif styles.is_a? Hash
|
19
|
+
@styles = ""
|
20
|
+
styles.each do |value, predicate|
|
21
|
+
if predicate
|
22
|
+
value = value.to_s.strip
|
23
|
+
unless value.end_with? ";"
|
24
|
+
value << ";"
|
25
|
+
end
|
26
|
+
|
27
|
+
@styles << value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
@styles
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module RBlade
|
2
|
+
class Tokenizer
|
3
|
+
def self.extractCommaSeparatedValues segment
|
4
|
+
unless segment.match?(/,\s*\z/)
|
5
|
+
# Add a comma to the end to delimit the end of the last argument
|
6
|
+
segment += ","
|
7
|
+
end
|
8
|
+
segment_lines = segment.lines
|
9
|
+
|
10
|
+
tokens = Ripper.lex segment
|
11
|
+
arguments = []
|
12
|
+
|
13
|
+
current_line = 1
|
14
|
+
current_index = 0
|
15
|
+
bracket_count = {
|
16
|
+
"[]": 0,
|
17
|
+
"{}": 0,
|
18
|
+
"()": 0
|
19
|
+
}
|
20
|
+
tokens.each do |token|
|
21
|
+
case token[1]
|
22
|
+
when :on_lbracket
|
23
|
+
bracket_count[:[]] += 1
|
24
|
+
when :on_rbracket
|
25
|
+
bracket_count[:[]] -= 1
|
26
|
+
when :on_lbrace
|
27
|
+
bracket_count[:"{}"] += 1
|
28
|
+
when :on_rbrace
|
29
|
+
bracket_count[:"{}"] -= 1
|
30
|
+
when :on_lparen
|
31
|
+
bracket_count[:"()"] += 1
|
32
|
+
when :on_rparen
|
33
|
+
bracket_count[:"()"] -= 1
|
34
|
+
when :on_comma
|
35
|
+
if bracket_count[:[]] != 0 || bracket_count[:"{}"] != 0 || bracket_count[:"()"] != 0
|
36
|
+
next
|
37
|
+
end
|
38
|
+
|
39
|
+
argument = ""
|
40
|
+
|
41
|
+
# Concatenate all lines up to this token's line, including the tail end of the current line
|
42
|
+
if token[0][0] != current_line
|
43
|
+
(current_line...token[0][0]).each do |i|
|
44
|
+
argument << (segment_lines[i - 1].slice(current_index..-1) || "")
|
45
|
+
current_index = 0
|
46
|
+
end
|
47
|
+
current_line = token[0][0]
|
48
|
+
end
|
49
|
+
argument <<= segment_lines[current_line - 1].slice(current_index...token[0][1])
|
50
|
+
argument.strip!
|
51
|
+
|
52
|
+
arguments.push argument
|
53
|
+
|
54
|
+
current_index = token[0][1] + 1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
return nil if arguments.count == 1 && arguments.first == ""
|
59
|
+
|
60
|
+
arguments
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -1,12 +1,15 @@
|
|
1
1
|
require "rails"
|
2
2
|
require "rblade/compiler"
|
3
|
+
require "rblade/helpers/attributes_manager"
|
4
|
+
require "rblade/helpers/class_manager"
|
3
5
|
require "rblade/helpers/stack_manager"
|
6
|
+
require "rblade/helpers/style_manager"
|
4
7
|
|
5
8
|
module RBlade
|
6
9
|
class RailsTemplate
|
7
10
|
def call(template, source = nil)
|
8
11
|
RBlade::StackManager.clear
|
9
|
-
setup = "
|
12
|
+
setup = "_out='';_stacks=[];"
|
10
13
|
setdown = "RBlade::StackManager.get(_stacks) + _out"
|
11
14
|
setup + RBlade::Compiler.compileString(source || template.source) + setdown
|
12
15
|
end
|
data/rblade.gemspec
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "rblade"
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.2.0"
|
4
4
|
s.summary = "Blade templates for ruby"
|
5
5
|
s.description = "A port of the Laravel blade templating engine to ruby"
|
6
6
|
s.authors = ["Simon J"]
|
7
7
|
s.email = "2857218+mwnciau@users.noreply.github.com"
|
8
8
|
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|storage)/}) }
|
9
|
-
s.require_paths = [
|
9
|
+
s.require_paths = ["lib"]
|
10
10
|
s.homepage = "https://rubygems.org/gems/rblade"
|
11
11
|
s.license = "MIT"
|
12
12
|
s.required_ruby_version = ">= 3.0.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rblade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon J
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -74,6 +74,7 @@ extra_rdoc_files: []
|
|
74
74
|
files:
|
75
75
|
- ".gitignore"
|
76
76
|
- ".standard.yml"
|
77
|
+
- CHANGELOG.md
|
77
78
|
- Gemfile
|
78
79
|
- Rakefile
|
79
80
|
- do
|
@@ -88,11 +89,16 @@ files:
|
|
88
89
|
- lib/rblade/compiler/statements/compiles_conditionals.rb
|
89
90
|
- lib/rblade/compiler/statements/compiles_inline_ruby.rb
|
90
91
|
- lib/rblade/compiler/statements/compiles_loops.rb
|
92
|
+
- lib/rblade/compiler/statements/compiles_props.rb
|
91
93
|
- lib/rblade/compiler/statements/compiles_stacks.rb
|
92
94
|
- lib/rblade/compiler/tokenizes_components.rb
|
93
95
|
- lib/rblade/compiler/tokenizes_statements.rb
|
94
96
|
- lib/rblade/component_store.rb
|
97
|
+
- lib/rblade/helpers/attributes_manager.rb
|
98
|
+
- lib/rblade/helpers/class_manager.rb
|
95
99
|
- lib/rblade/helpers/stack_manager.rb
|
100
|
+
- lib/rblade/helpers/style_manager.rb
|
101
|
+
- lib/rblade/helpers/tokenizer.rb
|
96
102
|
- lib/rblade/rails_template.rb
|
97
103
|
- lib/rblade/railtie.rb
|
98
104
|
- rblade.gemspec
|