rblade 1.0.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +4 -0
- data/README.md +16 -0
- data/REFERENCE.md +17 -13
- data/lib/rblade/compiler/compiles_statements.rb +2 -0
- data/lib/rblade/compiler/statements/compiles_loops.rb +56 -9
- data/lib/rblade/helpers/attributes_manager.rb +1 -1
- data/rblade.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edaa1af6299a8281520a73611def0838ef1017f2ec7bb3fd8a125bcd02e5c7ce
|
4
|
+
data.tar.gz: 6363e44a009a29e8771c50ecf4768b0d365b0d2147ba998db72805e9b05c0390
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 996e77805b56530e9f136c087753938c10c8dc71d45b1fbaec10e81e890878b9a0da00a10fa024a650cb2e463e155fe8da723fb16a6eb690f5811915ce4fe879
|
7
|
+
data.tar.gz: 5bbe562c01ec5fb12e77cb53aa2991cebfd83792dd831a41957497e3b04e29df442511c890d48fcb05bef78107cf5347019c49c7c8dc9e5d3f9ef0557a63f940
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -222,6 +222,16 @@ In addition to conditional statements, RBlade provides simple directives for wor
|
|
222
222
|
<p>This is user {{ user.id }}</p>
|
223
223
|
@endEach
|
224
224
|
|
225
|
+
{{-- Compiles to users.each_with_index do |user, index| ... --}}
|
226
|
+
@eachWithIndex (user, index in users)
|
227
|
+
<p>This is user {{ index }} {{ user.name }}</p>
|
228
|
+
@endEachWithIndex
|
229
|
+
|
230
|
+
{{-- eachWithIndex has a special case for Hashes: in this example, the result is "Item 1: a A" --}}
|
231
|
+
@eachWithIndex (key, value, index in {a: 'A'})
|
232
|
+
Item #{{ index + 1 }}: {{ key }} {{ value }}
|
233
|
+
@endEachWithIndex
|
234
|
+
|
225
235
|
@forElse (name in [])
|
226
236
|
<li>{{ name }}</li>
|
227
237
|
@empty
|
@@ -234,6 +244,12 @@ In addition to conditional statements, RBlade provides simple directives for wor
|
|
234
244
|
<p>No users</p>
|
235
245
|
@endEachElse
|
236
246
|
|
247
|
+
@eachWithIndexElse (user, index in users)
|
248
|
+
<li>{{ index }}: {{ user.name }}</li>
|
249
|
+
@empty
|
250
|
+
<p>No users</p>
|
251
|
+
@endEachWithIndexElse
|
252
|
+
|
237
253
|
@while (true)
|
238
254
|
<p>I'm looping forever.</p>
|
239
255
|
@endWhile
|
data/REFERENCE.md
CHANGED
@@ -36,6 +36,7 @@ By default, RBlade will look for components in the `app/views/components` folder
|
|
36
36
|
| `<x-name><x-slot::header><h1>Header</h1><//>Content<//>` | Pass a named block to a component |
|
37
37
|
| `{{ header }}` | Output the contents of a named block |
|
38
38
|
| `<div {{ header.attributes }}>` | Output the attributes passed into a named block |
|
39
|
+
| `@shouldRender(RUBY_EXPRESSION)` | Only renders the component if RUBY_EXPRESSION evaluates to true |
|
39
40
|
|
40
41
|
<a name="quick-reference-attributes"></a>
|
41
42
|
## Attributes
|
@@ -75,19 +76,22 @@ The attributes variable is an instance of a class that manages attributes. As we
|
|
75
76
|
<a name="quick-reference-loops"></a>
|
76
77
|
## Loops
|
77
78
|
|
78
|
-
| Syntax
|
79
|
-
|
80
|
-
| `@while( looping ) ... @endWhile`
|
81
|
-
| `@until( finished ) ... @endUntil`
|
82
|
-
| `@for( i in 1..10 ) ... @endFor`
|
83
|
-
| `@each( i in 1..10 ) ... @endEach`
|
84
|
-
| `@each( key, value in {a: 1} ) ... @endEach`
|
85
|
-
| `@
|
86
|
-
| `@
|
87
|
-
| `@
|
88
|
-
| `@
|
89
|
-
| `@
|
90
|
-
| `@
|
79
|
+
| Syntax | Description |
|
80
|
+
|:-----------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------|
|
81
|
+
| `@while( looping ) ... @endWhile` | Compiles to a Ruby while statement |
|
82
|
+
| `@until( finished ) ... @endUntil` | Compiles to a Ruby until statement |
|
83
|
+
| `@for( i in 1..10 ) ... @endFor` | Compiles to a Ruby for loop |
|
84
|
+
| `@each( i in 1..10 ) ... @endEach` | Calls `each` on the given collection, with `\|i\|` as the block argument |
|
85
|
+
| `@each( key, value in {a: 1} ) ... @endEach` | Calls `each` on the given Hash, with `\|key, value\|` as the block arguments |
|
86
|
+
| `@eachWithIndex( value, index in ['a', 'b'] ) ... @endEachWithIndex` | Calls `each_with_index` on the given Array, with `\|value, index\|` as the block arguments |
|
87
|
+
| `@eachWithIndex( key, value, index in {a: 1} ) ... @endEachWithIndex` | Calls `each_with_index` on the given Hash, where `key` is the Hash key, `value` is the Hash value, and `index` is the index |
|
88
|
+
| `@forElse( i in 1..10 ) ... @empty ... @endForElse` | Compiles to a for loop as above, but the block after `@empty` is printed if the given collection is empty |
|
89
|
+
| `@eachElse( i in 1..10 ) ... @empty ... @endEachElse` | Compiles to a each loop as above, but the block after `@empty` is printed if the given collection is empty |
|
90
|
+
| `@eachWithIndexElse( value, index in 1..10 ) ... @empty ... @endEachWithIndexElse` | Compiles to a each_with_index loop as above, but the block after `@empty` is printed if the given collection is empty |
|
91
|
+
| `@break` | Break out of the current loop |
|
92
|
+
| `@next` | Go to the next iteration in the current loop |
|
93
|
+
| `@break( RUBY_EXPRESSION )` | Break out of the current loop if the expression evaluate to true |
|
94
|
+
| `@next( RUBY_EXPRESSION )` | Go to the next iteration in the current loop if the expression evaluate to true |
|
91
95
|
|
92
96
|
<a name="quick-reference-forms"></a>
|
93
97
|
## Forms
|
@@ -81,6 +81,8 @@ module RBlade
|
|
81
81
|
"elsif" => [CompilesConditionals, :compileElsif],
|
82
82
|
"each" => [CompilesLoops, :compileEach],
|
83
83
|
"eachelse" => [CompilesLoops, :compileEachElse],
|
84
|
+
"eachwithindex" => [CompilesLoops, :compileEachWithIndex],
|
85
|
+
"eachwithindexelse" => [CompilesLoops, :compileEachWithIndexElse],
|
84
86
|
"empty" => [CompilesLoops, :compileEmpty],
|
85
87
|
"empty?" => [CompilesConditionals, :compileEmpty],
|
86
88
|
"end" => [CompilesStatements, :compileEnd],
|
@@ -19,27 +19,74 @@ module RBlade
|
|
19
19
|
|
20
20
|
def compileEach args
|
21
21
|
if args.nil? || args.count > 2
|
22
|
-
raise StandardError.new "Each statement: wrong number of arguments (given #{args&.count || 0}, expecting 1)"
|
22
|
+
raise StandardError.new "Each statement: wrong number of arguments (given #{args&.count || 0}, expecting 1 or 2)"
|
23
23
|
end
|
24
|
-
|
25
|
-
args
|
24
|
+
last_arg, collection = args.pop.split(" in ")
|
25
|
+
args.push(last_arg)
|
26
26
|
|
27
|
-
|
27
|
+
if collection.nil?
|
28
|
+
raise StandardError.new "Each statement: collection not found (expecting 'in')"
|
29
|
+
end
|
28
30
|
|
29
|
-
"#{collection}.each do |#{
|
31
|
+
"#{collection}.each do |#{args.join(",")}|;"
|
32
|
+
end
|
33
|
+
|
34
|
+
def compileEachWithIndex args
|
35
|
+
if args.nil? || args.count > 3
|
36
|
+
raise StandardError.new "Each with index statement: wrong number of arguments (given #{args&.count || 0}, expecting 1 to 3)"
|
37
|
+
end
|
38
|
+
last_arg, collection = args.pop.split(" in ")
|
39
|
+
args.push(last_arg)
|
40
|
+
|
41
|
+
if collection.nil?
|
42
|
+
raise StandardError.new "Each with index statement: collection not found (expecting 'in')"
|
43
|
+
end
|
44
|
+
|
45
|
+
# Special case for 3 arguments: the first 2 arguments are the key/value pair in a Hash, and
|
46
|
+
# the third is the index
|
47
|
+
if args.count == 3
|
48
|
+
"#{collection}.each_with_index do |_ivar,#{args[2]}|;#{args[0]},#{args[1]}=_ivar;"
|
49
|
+
else
|
50
|
+
"#{collection}.each_with_index do |#{args.join(",")}|;"
|
51
|
+
end
|
30
52
|
end
|
31
53
|
|
32
54
|
def compileEachElse args
|
33
55
|
if args.nil? || args.count > 2
|
34
56
|
raise StandardError.new "Each else statement: wrong number of arguments (given #{args&.count || 0}, expecting 1)"
|
35
57
|
end
|
36
|
-
|
37
|
-
args
|
58
|
+
last_arg, collection = args.pop.split(" in ")
|
59
|
+
args.push(last_arg)
|
60
|
+
|
61
|
+
if collection.nil?
|
62
|
+
raise StandardError.new "Each else statement: collection not found (expecting 'in')"
|
63
|
+
end
|
64
|
+
|
38
65
|
@loop_else_counter += 1
|
39
66
|
|
40
|
-
|
67
|
+
"_looped_#{@loop_else_counter}=false;#{collection}.each do |#{args.join(",")}|;_looped_#{@loop_else_counter}=true;"
|
68
|
+
end
|
69
|
+
|
70
|
+
def compileEachWithIndexElse args
|
71
|
+
if args.nil? || args.count > 3
|
72
|
+
raise StandardError.new "Each with index statement: wrong number of arguments (given #{args&.count || 0}, expecting 1 to 3)"
|
73
|
+
end
|
74
|
+
last_arg, collection = args.pop.split(" in ")
|
75
|
+
args.push(last_arg)
|
76
|
+
|
77
|
+
if collection.nil?
|
78
|
+
raise StandardError.new "Each with index statement: collection not found (expecting 'in')"
|
79
|
+
end
|
80
|
+
|
81
|
+
@loop_else_counter += 1
|
41
82
|
|
42
|
-
|
83
|
+
# Special case for 3 arguments: the first 2 arguments are the key/value pair in a Hash, and
|
84
|
+
# the third is the index
|
85
|
+
if args.count == 3
|
86
|
+
"_looped_#{@loop_else_counter}=false;#{collection}.each_with_index do |_ivar,#{args[2]}|;#{args[0]},#{args[1]}=_ivar;_looped_#{@loop_else_counter}=true;"
|
87
|
+
else
|
88
|
+
"_looped_#{@loop_else_counter}=false;#{collection}.each_with_index do |#{args.join(",")}|;_looped_#{@loop_else_counter}=true;"
|
89
|
+
end
|
43
90
|
end
|
44
91
|
|
45
92
|
def compileFor args
|
data/rblade.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "rblade"
|
3
|
-
s.version = "1.0
|
3
|
+
s.version = "1.1.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: 1.0
|
4
|
+
version: 1.1.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-08-
|
11
|
+
date: 2024-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -140,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
142
|
requirements: []
|
143
|
-
rubygems_version: 3.
|
143
|
+
rubygems_version: 3.3.5
|
144
144
|
signing_key:
|
145
145
|
specification_version: 4
|
146
146
|
summary: A component-first templating engine for Rails
|