rblade 0.2.5 → 0.4.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 +20 -0
- data/LICENSE.md +24 -0
- data/README.md +1257 -0
- data/TODO.md +2 -0
- data/lib/rblade/compiler/compiles_components.rb +34 -60
- data/lib/rblade/compiler/compiles_ruby.rb +1 -1
- data/lib/rblade/compiler/compiles_statements.rb +15 -1
- data/lib/rblade/compiler/compiles_verbatim.rb +29 -0
- data/lib/rblade/compiler/statements/compiles_conditionals.rb +26 -0
- data/lib/rblade/compiler/statements/compiles_html_attributes.rb +21 -0
- data/lib/rblade/compiler/statements/compiles_loops.rb +18 -30
- data/lib/rblade/compiler/statements/compiles_once.rb +57 -0
- data/lib/rblade/compiler/statements/compiles_props.rb +2 -2
- data/lib/rblade/compiler/statements/compiles_stacks.rb +4 -4
- data/lib/rblade/compiler/tokenizes_components.rb +7 -2
- data/lib/rblade/compiler/tokenizes_statements.rb +17 -11
- data/lib/rblade/compiler.rb +3 -1
- data/lib/rblade/component_store.rb +73 -14
- data/lib/rblade/helpers/attributes_manager.rb +6 -19
- data/lib/rblade/helpers/class_manager.rb +4 -0
- data/lib/rblade/helpers/style_manager.rb +4 -0
- data/lib/rblade/rails_template.rb +18 -2
- data/lib/rblade/railtie.rb +2 -1
- data/rblade.gemspec +3 -3
- metadata +11 -4
@@ -1,28 +1,34 @@
|
|
1
1
|
require "rblade/compiler"
|
2
2
|
|
3
3
|
module RBlade
|
4
|
-
FILE_EXTENSIONS = [".
|
4
|
+
FILE_EXTENSIONS = [".rblade", ".html.rblade"]
|
5
5
|
|
6
6
|
class ComponentStore
|
7
|
-
|
8
|
-
|
9
|
-
path
|
7
|
+
# Retrieve the method name for a component, and compile it if it hasn't already been compiled
|
8
|
+
def self.component full_name
|
9
|
+
# If this is a relative path, prepend with the previous component name's base
|
10
|
+
if full_name.start_with? "."
|
11
|
+
full_name = @@component_name_stack.last.gsub(/\.[^\.]+$/, "") + full_name
|
12
|
+
end
|
10
13
|
|
11
|
-
|
12
|
-
|
14
|
+
# Ensure each component is only compiled once
|
15
|
+
unless @@component_method_names[full_name].nil?
|
16
|
+
return @@component_method_names[full_name]
|
13
17
|
end
|
14
18
|
|
15
|
-
|
19
|
+
@@component_name_stack << full_name
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
21
|
+
namespace = nil
|
22
|
+
name = full_name
|
23
|
+
|
24
|
+
if name.match? "::"
|
25
|
+
namespace, name = full_name.split("::")
|
23
26
|
end
|
24
27
|
|
25
|
-
|
28
|
+
method_name = compile_component full_name, File.read(find_component_file(namespace, name))
|
29
|
+
@@component_name_stack.pop
|
30
|
+
|
31
|
+
method_name
|
26
32
|
end
|
27
33
|
|
28
34
|
def self.add_path path, namespace = nil
|
@@ -35,8 +41,61 @@ module RBlade
|
|
35
41
|
@@template_paths[namespace] << path
|
36
42
|
end
|
37
43
|
|
44
|
+
def self.view_name view_name
|
45
|
+
@@component_name_stack.push view_name
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.get
|
49
|
+
@@component_definitions
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.clear
|
53
|
+
@@component_definitions = ""
|
54
|
+
@@component_method_names = {}
|
55
|
+
@@component_name_stack = []
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.find_component_file namespace, name
|
59
|
+
file_path = name.tr ".", "/"
|
60
|
+
|
61
|
+
@@template_paths[namespace]&.each do |base_path|
|
62
|
+
FILE_EXTENSIONS.each do |extension|
|
63
|
+
if File.exist? base_path + file_path + extension
|
64
|
+
return "#{base_path}#{file_path}#{extension}"
|
65
|
+
end
|
66
|
+
if File.exist? base_path + file_path + "/index" + extension
|
67
|
+
# Account for index files for relative components
|
68
|
+
@@component_name_stack << @@component_name_stack.pop + ".index"
|
69
|
+
return "#{base_path}#{file_path}/index#{extension}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
raise StandardError.new "Unknown component #{namespace}::#{name}"
|
75
|
+
end
|
76
|
+
private_class_method :find_component_file
|
77
|
+
|
78
|
+
def self.compile_component(name, code)
|
79
|
+
@@component_method_names[name] = "_c#{@@component_method_names.count}"
|
80
|
+
|
81
|
+
compiled_component = RBlade::Compiler.compileString(code)
|
82
|
+
|
83
|
+
@@component_definitions \
|
84
|
+
<< "def #{@@component_method_names[name]}(slot,attributes);_out='';" \
|
85
|
+
<< "_stacks=[];" \
|
86
|
+
<< "attributes=RBlade::AttributesManager.new(attributes);" \
|
87
|
+
<< compiled_component \
|
88
|
+
<< "RBlade::StackManager.get(_stacks) + _out;end;"
|
89
|
+
|
90
|
+
@@component_method_names[name]
|
91
|
+
end
|
92
|
+
private_class_method :compile_component
|
93
|
+
|
38
94
|
private
|
39
95
|
|
96
|
+
@@component_definitions = ""
|
97
|
+
@@component_name_stack = []
|
98
|
+
@@component_method_names = {}
|
40
99
|
@@template_paths = {}
|
41
100
|
end
|
42
101
|
end
|
@@ -3,15 +3,6 @@ module RBlade
|
|
3
3
|
@attributes = {}
|
4
4
|
def initialize attributes
|
5
5
|
@attributes = attributes
|
6
|
-
|
7
|
-
if !@attributes[:_class].nil?
|
8
|
-
@attributes[:class] = mergeClasses(@attributes[:class], @attributes.delete(:_class))
|
9
|
-
end
|
10
|
-
if !@attributes[:_style].nil?
|
11
|
-
@attributes[:style] = mergeClasses(@attributes[:style], @attributes.delete(:_style))
|
12
|
-
end
|
13
|
-
|
14
|
-
@attributes
|
15
6
|
end
|
16
7
|
|
17
8
|
def default(key, default = nil)
|
@@ -26,23 +17,19 @@ module RBlade
|
|
26
17
|
!@attributes[key].nil?
|
27
18
|
end
|
28
19
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
attributes[:_class] = attributes.delete :class
|
33
|
-
end
|
34
|
-
if !attributes[:style].nil?
|
35
|
-
attributes[:_style] = attributes.delete :style
|
36
|
-
end
|
20
|
+
def method_missing(method, *)
|
21
|
+
@attributes.send(method, *)
|
22
|
+
end
|
37
23
|
|
38
|
-
|
24
|
+
def respond_to_missing?(method_name, *args)
|
25
|
+
@attributes.respond_to?(method_name) || super
|
39
26
|
end
|
40
27
|
|
41
28
|
def to_s attributes = nil
|
42
29
|
attributes ||= @attributes
|
43
30
|
|
44
31
|
attributes.map do |key, value|
|
45
|
-
"#{key}=\"#{h(value)}\""
|
32
|
+
"#{key}=\"#{(value == true) ? key : h(value)}\""
|
46
33
|
end.join " "
|
47
34
|
end
|
48
35
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "rails"
|
2
2
|
require "rblade/compiler"
|
3
|
+
require "rblade/component_store"
|
3
4
|
require "rblade/helpers/attributes_manager"
|
4
5
|
require "rblade/helpers/class_manager"
|
5
6
|
require "rblade/helpers/stack_manager"
|
@@ -8,10 +9,25 @@ require "rblade/helpers/style_manager"
|
|
8
9
|
module RBlade
|
9
10
|
class RailsTemplate
|
10
11
|
def call(template, source = nil)
|
12
|
+
RBlade::ComponentStore.clear
|
11
13
|
RBlade::StackManager.clear
|
12
|
-
|
14
|
+
|
15
|
+
unless template.nil?
|
16
|
+
view_name = template.short_identifier
|
17
|
+
.delete_prefix("app/views/")
|
18
|
+
.delete_suffix(".rblade")
|
19
|
+
.delete_suffix(".html")
|
20
|
+
.tr("/", ".")
|
21
|
+
|
22
|
+
# Let the component store know about the current view for relative components
|
23
|
+
RBlade::ComponentStore.view_name(
|
24
|
+
"view::#{view_name}"
|
25
|
+
)
|
26
|
+
end
|
27
|
+
setup = "_out='';_stacks=[];$_once_tokens=[];"
|
28
|
+
code = RBlade::Compiler.compileString(source || template.source)
|
13
29
|
setdown = "RBlade::StackManager.get(_stacks) + _out"
|
14
|
-
setup +
|
30
|
+
setup + ComponentStore.get + code + setdown
|
15
31
|
end
|
16
32
|
end
|
17
33
|
end
|
data/lib/rblade/railtie.rb
CHANGED
@@ -5,10 +5,11 @@ require "rblade/component_store"
|
|
5
5
|
module RBlade
|
6
6
|
class Railtie < ::Rails::Railtie
|
7
7
|
initializer :rblade, before: :load_config_initializers do |app|
|
8
|
-
ActionView::Template.register_template_handler(:
|
8
|
+
ActionView::Template.register_template_handler(:rblade, RBlade::RailsTemplate.new)
|
9
9
|
|
10
10
|
RBlade::ComponentStore.add_path(Rails.root.join("app", "views", "components"))
|
11
11
|
RBlade::ComponentStore.add_path(Rails.root.join("app", "views", "layouts"), "layout")
|
12
|
+
RBlade::ComponentStore.add_path(Rails.root.join("app", "views"), "view")
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
data/rblade.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "rblade"
|
3
|
-
s.version = "0.
|
4
|
-
s.summary = "
|
5
|
-
s.description = "
|
3
|
+
s.version = "0.4.0"
|
4
|
+
s.summary = "A component-first templating engine for Rails"
|
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"]
|
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)/}) }
|
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.4.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-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -66,7 +66,8 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '7.0'
|
69
|
-
description:
|
69
|
+
description: RBlade is a simple, yet powerful templating engine for Ruby on Rails,
|
70
|
+
inspired by Laravel Blade.
|
70
71
|
email: 2857218+mwnciau@users.noreply.github.com
|
71
72
|
executables: []
|
72
73
|
extensions: []
|
@@ -76,7 +77,10 @@ files:
|
|
76
77
|
- ".standard.yml"
|
77
78
|
- CHANGELOG.md
|
78
79
|
- Gemfile
|
80
|
+
- LICENSE.md
|
81
|
+
- README.md
|
79
82
|
- Rakefile
|
83
|
+
- TODO.md
|
80
84
|
- do
|
81
85
|
- docker-compose.yml
|
82
86
|
- lib/rblade.rb
|
@@ -86,9 +90,12 @@ files:
|
|
86
90
|
- lib/rblade/compiler/compiles_echos.rb
|
87
91
|
- lib/rblade/compiler/compiles_ruby.rb
|
88
92
|
- lib/rblade/compiler/compiles_statements.rb
|
93
|
+
- lib/rblade/compiler/compiles_verbatim.rb
|
89
94
|
- lib/rblade/compiler/statements/compiles_conditionals.rb
|
95
|
+
- lib/rblade/compiler/statements/compiles_html_attributes.rb
|
90
96
|
- lib/rblade/compiler/statements/compiles_inline_ruby.rb
|
91
97
|
- lib/rblade/compiler/statements/compiles_loops.rb
|
98
|
+
- lib/rblade/compiler/statements/compiles_once.rb
|
92
99
|
- lib/rblade/compiler/statements/compiles_props.rb
|
93
100
|
- lib/rblade/compiler/statements/compiles_stacks.rb
|
94
101
|
- lib/rblade/compiler/tokenizes_components.rb
|
@@ -124,5 +131,5 @@ requirements: []
|
|
124
131
|
rubygems_version: 3.5.11
|
125
132
|
signing_key:
|
126
133
|
specification_version: 4
|
127
|
-
summary:
|
134
|
+
summary: A component-first templating engine for Rails
|
128
135
|
test_files: []
|