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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d90f5f3aee3f096c2b0dc962592cef3ff02563a5a8b5bef47cab9adc9eabf309
4
- data.tar.gz: cdda20661fa3aab05d14f793a4b6ef3cf6d9c0bfc116a28a49a1118ab1286d2c
3
+ metadata.gz: 90f40d53a3d644454adb306af193e5258970067eaa31075263c13ce31ce23b3f
4
+ data.tar.gz: f3308d84a9605fce9edeff88e00e29ce88ebee8d5dcde9f96439b46f6a512567
5
5
  SHA512:
6
- metadata.gz: ff109253d98e063cfcf6a79481a3cde7934afca492dcca0edd865266cc1401918ba858f04f1cd7ae125d424332f9cdbfd1e562fe4e9914c55313a08070aa61cc
7
- data.tar.gz: bb1864cc03b42c1612bd53aa29ef7278d38ad46b8d3362ab31b6093aa8abe907a7a2d1587b04338b2e2b74b868136235181a6871ef27eecb2690e59765d9e3c7
6
+ metadata.gz: aa8b2ce963950a27f69a65c23db73f544fd52e84ab5b0d200667fc2e2a976dc2a8121c6fa7de0b4e4a50f8abb49d7243b484aea7210fc14cb3e8708414050248
7
+ data.tar.gz: 8a4a0de3a7dbd16b019327282ec3f1e604a622baf4f47dc21fffe6cd2ed9c25170de5d453ea43185deffe344fcd5324cd8696aff2046821b7988179ec4edc677
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hot_module (1.0.0.alpha11)
4
+ hot_module (1.0.0.alpha13)
5
5
  concurrent-ruby (~> 1.2)
6
6
  nokolexbor (>= 0.4.2)
7
7
 
@@ -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 = HoTModuLe::View.new(resource)
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.attribute("hmod:ignore").remove
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.to_html.html_safe }
37
+ component.new(**attrs).render_in(view_context, rendering_mode: :node) { node.children }
43
38
  )
44
- new_node.first.attribute("hmod:ignore")&.remove
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}"
@@ -2,5 +2,5 @@
2
2
 
3
3
  module HoTModuLe
4
4
  # @return [String]
5
- VERSION = "1.0.0.alpha11"
5
+ VERSION = "1.0.0.alpha13"
6
6
  end
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.registered_elements << self
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
- # @param return_node [Boolean]
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 { _1.attributes.empty? }
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.attribute("hmod:ignore").remove
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.first.attribute("hmod:ignore")&.remove
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
- # And that is that.
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
- super
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.alpha11
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-04-08 00:00:00.000000000 Z
11
+ date: 2023-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby