hot_module 1.0.0.alpha11 → 1.0.0.alpha13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/hot_module/component_renderer.rb +4 -9
- data/lib/hot_module/version.rb +1 -1
- data/lib/hot_module.rb +26 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90f40d53a3d644454adb306af193e5258970067eaa31075263c13ce31ce23b3f
|
4
|
+
data.tar.gz: f3308d84a9605fce9edeff88e00e29ce88ebee8d5dcde9f96439b46f6a512567
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa8b2ce963950a27f69a65c23db73f544fd52e84ab5b0d200667fc2e2a976dc2a8121c6fa7de0b4e4a50f8abb49d7243b484aea7210fc14cb3e8708414050248
|
7
|
+
data.tar.gz: 8a4a0de3a7dbd16b019327282ec3f1e604a622baf4f47dc21fffe6cd2ed9c25170de5d453ea43185deffe344fcd5324cd8696aff2046821b7988179ec4edc677
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module HoTModuLe
|
4
|
-
class View < Bridgetown::ERBView
|
5
|
-
attr_accessor :child_nodes
|
6
|
-
end
|
7
|
-
|
8
4
|
class ComponentRenderer < Bridgetown::Builder
|
9
5
|
def build
|
10
6
|
render_html_modules
|
@@ -13,13 +9,13 @@ module HoTModuLe
|
|
13
9
|
# rubocop:todo Metrics
|
14
10
|
def render_html_modules
|
15
11
|
inspect_html do |doc, resource|
|
16
|
-
view_context =
|
12
|
+
view_context = Bridgetown::ERBView.new(resource)
|
17
13
|
|
18
14
|
HoTModuLe.registered_elements.each do |component|
|
19
15
|
tag_name = component.tag_name
|
20
16
|
doc.xpath("//#{tag_name}").reverse.each do |node|
|
21
17
|
if node["hmod:ignore"]
|
22
|
-
node.
|
18
|
+
node.remove_attribute("hmod:ignore")
|
23
19
|
next
|
24
20
|
end
|
25
21
|
|
@@ -37,11 +33,10 @@ module HoTModuLe
|
|
37
33
|
attrs.merge!(new_attrs)
|
38
34
|
attrs.transform_keys!(&:to_sym)
|
39
35
|
|
40
|
-
view_context.child_nodes = node.children
|
41
36
|
new_node = node.replace(
|
42
|
-
component.new(**attrs).render_in(view_context) { node.children
|
37
|
+
component.new(**attrs).render_in(view_context, rendering_mode: :node) { node.children }
|
43
38
|
)
|
44
|
-
new_node.
|
39
|
+
new_node.remove_attribute("hmod:ignore")
|
45
40
|
end
|
46
41
|
rescue StandardError => e
|
47
42
|
Bridgetown.logger.error "Unable to render <#{tag_name}> (#{component}) in #{resource.path}"
|
data/lib/hot_module/version.rb
CHANGED
data/lib/hot_module.rb
CHANGED
@@ -38,6 +38,11 @@ module HoTModuLe
|
|
38
38
|
@registered_elements
|
39
39
|
end
|
40
40
|
|
41
|
+
def self.register_element(component)
|
42
|
+
@registered_elements ||= Concurrent::Set.new
|
43
|
+
@registered_elements << component
|
44
|
+
end
|
45
|
+
|
41
46
|
# @param klass [Class]
|
42
47
|
# @return [void]
|
43
48
|
def self.included(klass)
|
@@ -98,7 +103,7 @@ module HoTModuLe
|
|
98
103
|
# @return [String]
|
99
104
|
def tag_name(value = nil)
|
100
105
|
@tag_name ||= begin
|
101
|
-
HoTModuLe.
|
106
|
+
HoTModuLe.register_element self
|
102
107
|
value
|
103
108
|
end
|
104
109
|
end
|
@@ -145,14 +150,25 @@ module HoTModuLe
|
|
145
150
|
# @return [Hash]
|
146
151
|
def attributes = {}
|
147
152
|
|
153
|
+
def rendering_mode = @_rendering_mode || :node
|
154
|
+
|
155
|
+
def rendering_mode=(mode)
|
156
|
+
@_rendering_mode = case mode
|
157
|
+
when :node, :string
|
158
|
+
mode
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
148
162
|
# @param attributes [Hash]
|
149
163
|
# @param content [String, Nokolexbor::Element]
|
150
|
-
#
|
151
|
-
def render_element(attributes: self.attributes, content: self.content, return_node: false) # rubocop:disable Metrics
|
164
|
+
def render_element(attributes: self.attributes, content: self.content) # rubocop:disable Metrics
|
152
165
|
doc = self.class.doc.clone
|
153
166
|
@_content = content
|
154
167
|
|
155
|
-
tmpl_el = doc.css("> template").find
|
168
|
+
tmpl_el = doc.css("> template").find do |node|
|
169
|
+
node.attributes.empty? ||
|
170
|
+
(node.attributes.count == 1 && node.attributes.any? { |k| k[0].start_with?("data-") })
|
171
|
+
end
|
156
172
|
|
157
173
|
unless tmpl_el
|
158
174
|
tmpl_el = doc.document.create_element("template")
|
@@ -167,7 +183,7 @@ module HoTModuLe
|
|
167
183
|
HoTModuLe.registered_elements.each do |component|
|
168
184
|
tmpl_el.children[0].css(component.tag_name).reverse.each do |node|
|
169
185
|
if node["hmod:ignore"]
|
170
|
-
node.
|
186
|
+
node.remove_attribute("hmod:ignore")
|
171
187
|
next
|
172
188
|
end
|
173
189
|
|
@@ -187,7 +203,7 @@ module HoTModuLe
|
|
187
203
|
new_node = node.replace(
|
188
204
|
component.new(**attrs).render_element(content: node.children)
|
189
205
|
)
|
190
|
-
new_node.
|
206
|
+
new_node.remove_attribute("hmod:ignore")
|
191
207
|
end
|
192
208
|
end
|
193
209
|
|
@@ -242,8 +258,7 @@ module HoTModuLe
|
|
242
258
|
tmpl_el.remove
|
243
259
|
end
|
244
260
|
|
245
|
-
|
246
|
-
return_node ? doc : doc.to_html
|
261
|
+
rendering_mode == :node ? doc : doc.to_html
|
247
262
|
end
|
248
263
|
|
249
264
|
def call(...) = render_element(...)
|
@@ -375,9 +390,10 @@ if defined?(Bridgetown)
|
|
375
390
|
Bridgetown::Component.extend ActiveSupport::DescendantsTracker
|
376
391
|
|
377
392
|
HoTModuLe.module_eval do
|
378
|
-
def render_in(
|
393
|
+
def render_in(view_context, rendering_mode = :string, &block)
|
379
394
|
@attributes&.[]=("hmod:ignore", "")
|
380
|
-
|
395
|
+
self.rendering_mode = rendering_mode
|
396
|
+
super(view_context, &block)
|
381
397
|
end
|
382
398
|
end
|
383
399
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hot_module
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.alpha13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jared White
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|