rblade 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,7 +17,7 @@ module RBlade
17
17
 
18
18
  def compilePushOnce args
19
19
  if args&.count != 1 && args&.count != 2
20
- raise StandardError.new "Push once statement: wrong number of arguments (given #{args.count}, expecting 1 or 2)"
20
+ raise StandardError.new "Push once statement: wrong number of arguments (given #{args&.count || 0}, expecting 1 or 2)"
21
21
  end
22
22
  @once_counter += 1
23
23
  once_id = args[1].nil? ? ":_#{@once_counter}" : args[1]
@@ -27,8 +27,8 @@ module RBlade
27
27
  end
28
28
 
29
29
  def compileEndPushOnce args
30
- if !args.nil?
31
- raise StandardError.new "End push once statement: wrong number of arguments (given #{args&.count}, expecting 0)"
30
+ unless args.nil?
31
+ raise StandardError.new "End push once statement: wrong number of arguments (given #{args.count}, expecting 0)"
32
32
  end
33
33
 
34
34
  "RBlade::StackManager.push(_p1_#{@once_counter}, _out);_out=_p1_#{@once_counter}_b;end;"
@@ -36,7 +36,7 @@ module RBlade
36
36
 
37
37
  def compilePrependOnce args
38
38
  if args&.count != 1 && args&.count != 2
39
- raise StandardError.new "Prepend once statement: wrong number of arguments (given #{args.count}, expecting 1 or 2)"
39
+ raise StandardError.new "Prepend once statement: wrong number of arguments (given #{args&.count || 0}, expecting 1 or 2)"
40
40
  end
41
41
  @once_counter += 1
42
42
  once_id = args[1].nil? ? ":_#{@once_counter}" : args[1]
@@ -46,8 +46,8 @@ module RBlade
46
46
  end
47
47
 
48
48
  def compileEndPrependOnce args
49
- if !args.nil?
50
- raise StandardError.new "End prepend once statement: wrong number of arguments (given #{args&.count}, expecting 0)"
49
+ unless args.nil?
50
+ raise StandardError.new "End prepend once statement: wrong number of arguments (given #{args.count}, expecting 0)"
51
51
  end
52
52
 
53
53
  "RBlade::StackManager.prepend(_p1_#{@once_counter}, _out);_out=_p1_#{@once_counter}_b;end;"
@@ -7,28 +7,24 @@ module RBlade
7
7
 
8
8
  def compileStack args
9
9
  if args&.count != 1
10
- raise StandardError.new "Stack statement: wrong number of arguments (given #{args&.count}, expecting 1)"
10
+ raise StandardError.new "Stack statement: wrong number of arguments (given #{args&.count || 0}, expecting 1)"
11
11
  end
12
12
 
13
13
  "RBlade::StackManager.initialize(#{args[0]}, _out);_stacks.push(#{args[0]});_out = '';"
14
14
  end
15
15
 
16
16
  def compilePrepend args
17
- if args.nil? || args.count > 2
18
- raise StandardError.new "Prepend statement: wrong number of arguments (given #{args&.count}, expecting 1 or 2)"
17
+ if args&.count != 1
18
+ raise StandardError.new "Prepend statement: wrong number of arguments (given #{args&.count || 0}, expecting 1)"
19
19
  end
20
20
 
21
- if args.count == 2
22
- "RBlade::StackManager.prepend(#{args[0]}, #{args[1]});"
23
- else
24
- @push_counter += 1
21
+ @push_counter += 1
25
22
 
26
- "_p_#{@push_counter}=#{args[0]};_p_#{@push_counter}_b=_out;_out='';"
27
- end
23
+ "_p_#{@push_counter}=#{args[0]};_p_#{@push_counter}_b=_out;_out='';"
28
24
  end
29
25
 
30
26
  def compileEndPrepend args
31
- if !args.nil?
27
+ unless args.nil?
32
28
  raise StandardError.new "End prepend statement: wrong number of arguments (given #{args&.count}, expecting 0)"
33
29
  end
34
30
 
@@ -37,29 +33,57 @@ module RBlade
37
33
  "RBlade::StackManager.prepend(_p_#{@push_counter + 1}, _out);_out=_p_#{@push_counter + 1}_b;"
38
34
  end
39
35
 
36
+ def compilePrependIf args
37
+ if args&.count != 2
38
+ raise StandardError.new "Prepend if statement: wrong number of arguments (given #{args&.count}, expecting 2)"
39
+ end
40
+
41
+ "if #{args[0]};" + compilePrepend([args[1]])
42
+ end
43
+
44
+ def compileEndPrependIf args
45
+ unless args.nil?
46
+ raise StandardError.new "End prepend if statement: wrong number of arguments (given #{args.count}, expecting 0)"
47
+ end
48
+
49
+ "end;" + compileEndPush(nil)
50
+ end
51
+
40
52
  def compilePush args
41
- if args.nil? || args.count > 2
42
- raise StandardError.new "Push statement: wrong number of arguments (given #{args&.count}, expecting 1 or 2)"
53
+ if args&.count != 1
54
+ raise StandardError.new "Push statement: wrong number of arguments (given #{args&.count}, expecting 1)"
43
55
  end
44
56
 
45
- if args.count == 2
46
- "RBlade::StackManager.push(#{args[0]}, #{args[1]});"
47
- else
48
- @push_counter += 1
57
+ @push_counter += 1
49
58
 
50
- "_p_#{@push_counter}=#{args[0]};_p_#{@push_counter}_b=_out;_out='';"
59
+ "_p_#{@push_counter}=#{args[0]};_p_#{@push_counter}_b=_out;_out='';"
60
+ end
61
+
62
+ def compilePushIf args
63
+ if args&.count != 2
64
+ raise StandardError.new "Push if statement: wrong number of arguments (given #{args&.count || 0}, expecting 2)"
51
65
  end
66
+
67
+ "if #{args[0]};" + compilePush([args[1]])
52
68
  end
53
69
 
54
70
  def compileEndPush args
55
- if !args.nil?
56
- raise StandardError.new "End push statement: wrong number of arguments (given #{args&.count}, expecting 0)"
71
+ unless args.nil?
72
+ raise StandardError.new "End push statement: wrong number of arguments (given #{args.count}, expecting 0)"
57
73
  end
58
74
 
59
75
  @push_counter -= 1
60
76
 
61
77
  "RBlade::StackManager.push(_p_#{@push_counter + 1}, _out);_out=_p_#{@push_counter + 1}_b;"
62
78
  end
79
+
80
+ def compileEndPushIf args
81
+ unless args.nil?
82
+ raise StandardError.new "End push if statement: wrong number of arguments (given #{args.count}, expecting 0)"
83
+ end
84
+
85
+ "end;" + compileEndPush(nil)
86
+ end
63
87
  end
64
88
  end
65
89
  end
@@ -12,12 +12,12 @@ module RBlade
12
12
  (?:
13
13
  (?:
14
14
  (@@)
15
- (\w+(?!\w))
15
+ (\w+(?!\w)[!\?]?)
16
16
  )
17
17
  |
18
18
  (?:
19
19
  (@)
20
- (\w+(?!\w))
20
+ (\w+(?!\w)[!\?]?)
21
21
  (?:[ \t]*
22
22
  (\(.*?\))
23
23
  )?
@@ -45,6 +45,7 @@ module RBlade
45
45
  i += 1
46
46
  elsif segment == "@"
47
47
  tokenizeStatement! segments, i
48
+ handleSpecialCases! segments, i
48
49
 
49
50
  i += 1
50
51
  elsif !segments[i].nil? && segments[i] != ""
@@ -74,6 +75,16 @@ module RBlade
74
75
  segments[i] = Token.new(type: :statement, value: statement_data)
75
76
  end
76
77
 
78
+ def handleSpecialCases!(segments, i)
79
+ case segments[i][:value][:name]
80
+ when "case"
81
+ # Remove any whitespace before a when statement
82
+ until segments[i + 1].nil? || segments[i + 1] == "@"
83
+ segments.delete_at i + 1
84
+ end
85
+ end
86
+ end
87
+
77
88
  def tokenizeArguments!(segments, segment_index)
78
89
  success = expandSegmentToEndParenthesis! segments, segment_index
79
90
 
@@ -1,6 +1,6 @@
1
1
  require "rblade/compiler/compiles_comments"
2
2
  require "rblade/compiler/compiles_components"
3
- require "rblade/compiler/compiles_echos"
3
+ require "rblade/compiler/compiles_prints"
4
4
  require "rblade/compiler/compiles_ruby"
5
5
  require "rblade/compiler/compiles_verbatim"
6
6
  require "rblade/compiler/compiles_statements"
@@ -37,7 +37,7 @@ module RBlade
37
37
  CompilesRuby.new.compile! tokens
38
38
  TokenizesComponents.new.tokenize! tokens
39
39
  TokenizesStatements.new.tokenize! tokens
40
- CompilesEchos.new.compile! tokens
40
+ CompilesPrints.new.compile! tokens
41
41
  CompilesStatements.new.compile! tokens
42
42
  CompilesComponents.new.compile! tokens
43
43
 
@@ -49,7 +49,7 @@ module RBlade
49
49
 
50
50
  CompilesComments.compile!(tokens)
51
51
  CompilesRuby.compile! tokens
52
- CompilesEchos.compile!(tokens)
52
+ CompilesPrints.compile!(tokens)
53
53
 
54
54
  compileTokens tokens
55
55
  end
@@ -81,7 +81,7 @@ module RBlade
81
81
  compiled_component = RBlade::Compiler.compileString(code)
82
82
 
83
83
  @@component_definitions \
84
- << "def #{@@component_method_names[name]}(slot,attributes);_out='';" \
84
+ << "def #{@@component_method_names[name]}(slot,attributes,params,session,flash,cookies);_out='';" \
85
85
  << "_stacks=[];" \
86
86
  << "attributes=RBlade::AttributesManager.new(attributes);" \
87
87
  << compiled_component \
@@ -15,16 +15,22 @@ module RBlade
15
15
  @attributes[key]
16
16
  end
17
17
 
18
- def has?(key)
19
- !@attributes[key].nil?
18
+ def has?(*keys)
19
+ keys.map!(&:to_sym)
20
+
21
+ keys.all? { |key| @attributes.has_key? key }
20
22
  end
21
23
 
22
- def method_missing(method, *)
23
- @attributes.send(method, *)
24
+ def method_missing(method, *, &)
25
+ if [:select, :filter, :slice].include? method
26
+ AttributesManager.new @attributes.send(method, *, &)
27
+ else
28
+ @attributes.send(method, *, &)
29
+ end
24
30
  end
25
31
 
26
32
  def respond_to_missing?(method_name, *args)
27
- @attributes.respond_to?(method_name) || super
33
+ @attributes.respond_to?(method_name)
28
34
  end
29
35
 
30
36
  def to_s attributes = nil
@@ -46,7 +52,7 @@ module RBlade
46
52
  [keys.to_sym]
47
53
  end
48
54
 
49
- self.class.new @attributes.slice(*keys)
55
+ AttributesManager.new @attributes.slice(*keys)
50
56
  end
51
57
 
52
58
  def except(keys)
@@ -56,7 +62,15 @@ module RBlade
56
62
  [keys.to_sym]
57
63
  end
58
64
 
59
- self.class.new @attributes.except(*keys)
65
+ AttributesManager.new @attributes.except(*keys)
66
+ end
67
+
68
+ def class(new_classes)
69
+ new_classes = ClassManager.new(new_classes).to_s
70
+ attributes = @attributes.dup
71
+ attributes[:class] = mergeClasses attributes[:class], new_classes
72
+
73
+ AttributesManager.new attributes
60
74
  end
61
75
 
62
76
  def merge(default_attributes)
@@ -76,7 +90,13 @@ module RBlade
76
90
  new_attributes[key] = value
77
91
  end
78
92
 
79
- self.class.new new_attributes
93
+ AttributesManager.new new_attributes
94
+ end
95
+
96
+ def has_any?(*keys)
97
+ keys.map!(&:to_sym)
98
+
99
+ keys.any? { |key| @attributes.has_key? key }
80
100
  end
81
101
 
82
102
  private
@@ -16,8 +16,14 @@ module RBlade
16
16
  to_s
17
17
  end
18
18
 
19
- def attributes
20
- @attributes
19
+ def method_missing(method, *)
20
+ @content.send(method, *)
21
21
  end
22
+
23
+ def respond_to_missing?(method_name, *args)
24
+ @content.respond_to?(method_name)
25
+ end
26
+
27
+ attr_reader :attributes
22
28
  end
23
29
  end
data/rblade.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "rblade"
3
- s.version = "0.5.0"
3
+ s.version = "1.0.0"
4
4
  s.summary = "A component-first templating engine for Rails"
5
5
  s.description = "RBlade is a simple, yet powerful templating engine for Ruby on Rails, inspired by Laravel Blade."
6
6
  s.authors = ["Simon J"]
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.5.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon J
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-30 00:00:00.000000000 Z
11
+ date: 2024-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -79,24 +79,32 @@ files:
79
79
  - Gemfile
80
80
  - LICENSE.md
81
81
  - README.md
82
+ - REFERENCE.md
82
83
  - Rakefile
83
- - TODO.md
84
84
  - do
85
85
  - docker-compose.yml
86
+ - examples/README.md
87
+ - examples/application/home.rblade
88
+ - examples/components/content/alert.rblade
89
+ - examples/components/content/hero.rblade
90
+ - examples/components/h1.rblade
91
+ - examples/components/p.rblade
92
+ - examples/layouts/app.rblade
86
93
  - lib/rblade.rb
87
94
  - lib/rblade/compiler.rb
88
95
  - lib/rblade/compiler/compiles_comments.rb
89
96
  - lib/rblade/compiler/compiles_components.rb
90
- - lib/rblade/compiler/compiles_echos.rb
97
+ - lib/rblade/compiler/compiles_prints.rb
91
98
  - lib/rblade/compiler/compiles_ruby.rb
92
99
  - lib/rblade/compiler/compiles_statements.rb
93
100
  - lib/rblade/compiler/compiles_verbatim.rb
101
+ - lib/rblade/compiler/statements/compiles_component_helpers.rb
94
102
  - lib/rblade/compiler/statements/compiles_conditionals.rb
103
+ - lib/rblade/compiler/statements/compiles_form.rb
95
104
  - lib/rblade/compiler/statements/compiles_html_attributes.rb
96
105
  - lib/rblade/compiler/statements/compiles_inline_ruby.rb
97
106
  - lib/rblade/compiler/statements/compiles_loops.rb
98
107
  - lib/rblade/compiler/statements/compiles_once.rb
99
- - lib/rblade/compiler/statements/compiles_props.rb
100
108
  - lib/rblade/compiler/statements/compiles_stacks.rb
101
109
  - lib/rblade/compiler/tokenizes_components.rb
102
110
  - lib/rblade/compiler/tokenizes_statements.rb
@@ -115,7 +123,7 @@ homepage: https://rubygems.org/gems/rblade
115
123
  licenses:
116
124
  - MIT
117
125
  metadata: {}
118
- post_install_message:
126
+ post_install_message:
119
127
  rdoc_options: []
120
128
  require_paths:
121
129
  - lib
@@ -130,8 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
138
  - !ruby/object:Gem::Version
131
139
  version: '0'
132
140
  requirements: []
133
- rubygems_version: 3.5.11
134
- signing_key:
141
+ rubygems_version: 3.3.5
142
+ signing_key:
135
143
  specification_version: 4
136
144
  summary: A component-first templating engine for Rails
137
145
  test_files: []
data/TODO.md DELETED
@@ -1,2 +0,0 @@
1
- Add @shouldRender? Or say you can use return (return _out) to exit early? @return? @exitComponent?
2
-