bridgetown-builder 1.0.0.beta3 → 1.1.0.beta2

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: 0146eff5ec7cd4cc86e8a6875e1972fddf15b42f9b07ece028e22a5e84e37466
4
- data.tar.gz: aceafe5263cc94a43b2a7aab9f585f70bcf40b97e99a3cbd31a7d3f094805096
3
+ metadata.gz: 5e95e26924a3b4cfb3fb95fe5af3d2a7be3630a7d3aaf8dc738b24102ea0dc16
4
+ data.tar.gz: 2ae5a954e86865d3886eed2b4ecd146c892b1b5c47acc903d9d5d83611f73415
5
5
  SHA512:
6
- metadata.gz: 4815a30ce7a876508b26ad957a782a83fa2406f22233fd50d8f37730d9d5478969d252abc753c12d79f97e2ab6677b412a6bc778ec872ba5b2078428b7fbad0f
7
- data.tar.gz: 606f95191c4a22438f5caf23e4bcba13de93aa0f67630d9c4a66d81cdc221ff1a1dc9c5c86ffb5909814d98b93ad133e41732136a9da56095cf81358dfa50bf3
6
+ metadata.gz: b308dbf4bd761cead11ec7f5fba42ab136b549ba48b226b5b321ca5488d41bd527555267ce88df7b077f484506cdd5eff092d4925c82ca0f4fd24b21aa0e1775
7
+ data.tar.gz: ae39eb4841a8075f3d6c278450837434ed64f836ab2f4df5d4e5deff0e35326de617ea89b10bc3c89428f59e66165ae6daf378f5705b9663b3b01359cddcaacd
@@ -7,13 +7,16 @@ module Bridgetown
7
7
  def generator(method_name = nil, &block)
8
8
  block = method(method_name) if method_name.is_a?(Symbol)
9
9
  local_name = name # pull the name method into a local variable
10
+ builder_priority = self.class.instance_variable_get(:@priority)
10
11
 
11
- new_gen = Class.new(Bridgetown::Generator) do
12
+ anon_generator = Class.new(Bridgetown::Generator) do
12
13
  define_method(:_builder_block) { block }
13
14
  define_singleton_method(:custom_name) { local_name }
14
15
 
15
16
  attr_reader :site
16
17
 
18
+ priority builder_priority || :low
19
+
17
20
  def inspect
18
21
  "#<#{self.class.custom_name} (Generator)>"
19
22
  end
@@ -23,10 +26,10 @@ module Bridgetown
23
26
  end
24
27
  end
25
28
 
26
- first_low_priority_index = site.generators.find_index { |gen| gen.class.priority == :low }
27
- site.generators.insert(first_low_priority_index || 0, new_gen.new(site.config))
29
+ site.generators << anon_generator.new(site.config)
30
+ site.generators.sort!
28
31
 
29
- functions << { name: name, generator: new_gen }
32
+ functions << { name: name, generator: anon_generator }
30
33
  end
31
34
  end
32
35
  end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Builders
5
+ module DSL
6
+ module Inspectors
7
+ # Add a couple familar DOM API features
8
+ module QuerySelection
9
+ def query_selector(selector)
10
+ css(selector).first
11
+ end
12
+
13
+ def query_selector_all(selector)
14
+ css(selector)
15
+ end
16
+ end
17
+
18
+ # HTML inspector type
19
+ module HTML
20
+ # Are there inspectors available? Is it an .htm* file?
21
+ def self.can_run?(resource, inspectors)
22
+ inspectors &&
23
+ resource.destination&.output_ext&.starts_with?(".htm") &&
24
+ !resource.data.bypass_inspectors
25
+ end
26
+
27
+ # Process the resource with the available inspectors and return the output HTML
28
+ #
29
+ # @return [String] transformed HTML
30
+ def self.call(resource, inspectors)
31
+ doc = Nokogiri.HTML5(resource.output)
32
+
33
+ inspectors.each do |block|
34
+ block.call(doc, resource)
35
+ end
36
+
37
+ doc.to_html
38
+ end
39
+ end
40
+
41
+ # XML inspector type
42
+ module XML
43
+ # Strip the resource's initial extension dot. `.rss` => `rss`
44
+ def self.resource_ext(resource)
45
+ resource.destination&.output_ext&.delete_prefix(".")
46
+ end
47
+
48
+ # Are there any inspectors available which match the resource extension?
49
+ def self.can_run?(resource, inspectors)
50
+ inspectors &&
51
+ inspectors[resource_ext(resource)] &&
52
+ !resource.data.bypass_inspectors
53
+ end
54
+
55
+ # Process the resource with the available inspectors and return the output XML
56
+ #
57
+ # @return [String] transformed XML
58
+ def self.call(resource, inspectors)
59
+ doc = Nokogiri::XML(resource.output)
60
+
61
+ inspectors[resource_ext(resource)].each do |block|
62
+ block.call(doc, resource)
63
+ end
64
+
65
+ doc.to_xml
66
+ end
67
+ end
68
+
69
+ class << self
70
+ # Require the Nokogiri gem if necessary and add the `QuerySelection` mixin
71
+ def setup_nokogiri
72
+ unless defined?(Nokogiri)
73
+ Bridgetown::Utils::RequireGems.require_with_graceful_fail "nokogiri"
74
+ end
75
+
76
+ return if Nokogiri::XML::Node <= QuerySelection
77
+
78
+ Nokogiri::XML::Node.include QuerySelection
79
+ end
80
+
81
+ # Shorthand for `HTML.call`
82
+ def process_html(...)
83
+ HTML.call(...)
84
+ end
85
+
86
+ # Shorthand for `XML.call`
87
+ def process_xml(...)
88
+ XML.call(...)
89
+ end
90
+ end
91
+
92
+ # Set up an inspector to review or manipulate HTML resources
93
+ # @yield the block to be called after the resource has been rendered
94
+ # @yieldparam [Nokogiri::HTML5::Document] the Nokogiri document
95
+ def inspect_html(&block)
96
+ unless @_html_inspectors
97
+ @_html_inspectors = []
98
+
99
+ Inspectors.setup_nokogiri
100
+
101
+ hook :resources, :post_render do |resource|
102
+ next unless HTML.can_run?(resource, @_html_inspectors)
103
+
104
+ resource.output = Inspectors.process_html(resource, @_html_inspectors)
105
+ end
106
+ end
107
+
108
+ @_html_inspectors << block
109
+ end
110
+
111
+ # Set up an inspector to review or manipulate XML resources
112
+ # @param extension [String] defaults to `xml`
113
+ # @yield the block to be called after the resource has been rendered
114
+ # @yieldparam [Nokogiri::XML::Document] the Nokogiri document
115
+ def inspect_xml(extension = "xml", &block)
116
+ unless @_xml_inspectors
117
+ @_xml_inspectors = {}
118
+
119
+ Inspectors.setup_nokogiri
120
+
121
+ hook :resources, :post_render do |resource|
122
+ next unless Inspectors::XML.can_run?(resource, @_xml_inspectors)
123
+
124
+ resource.output = Inspectors.process_xml(resource, @_xml_inspectors)
125
+ end
126
+ end
127
+
128
+ (@_xml_inspectors[extension.to_s] ||= []).tap do |arr|
129
+ arr << block
130
+ end
131
+
132
+ @_xml_inspectors
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -3,15 +3,28 @@
3
3
  require "bridgetown-builder/dsl/generators"
4
4
  require "bridgetown-builder/dsl/helpers"
5
5
  require "bridgetown-builder/dsl/hooks"
6
+ require "bridgetown-builder/dsl/inspectors"
6
7
  require "bridgetown-builder/dsl/http"
7
8
  require "bridgetown-builder/dsl/liquid"
8
9
  require "bridgetown-builder/dsl/resources"
10
+
9
11
  module Bridgetown
10
12
  module Builders
11
13
  class PluginBuilder
14
+ include Bridgetown::Prioritizable
15
+
16
+ self.priorities = {
17
+ highest: 100,
18
+ high: 10,
19
+ normal: 0,
20
+ low: -10,
21
+ lowest: -100,
22
+ }.freeze
23
+
12
24
  include DSL::Generators
13
25
  include DSL::Helpers
14
26
  include DSL::Hooks
27
+ include DSL::Inspectors
15
28
  include DSL::HTTP
16
29
  include DSL::Liquid
17
30
  include DSL::Resources
@@ -15,7 +15,7 @@ Bridgetown::Hooks.register_one :site, :pre_read, priority: :low, reloadable: fal
15
15
  # SiteBuilder is the superclass sites can subclass to create any number of
16
16
  # builders, but if the site hasn't defined it explicitly, this is a no-op
17
17
  if defined?(SiteBuilder)
18
- SiteBuilder.descendants.map do |c|
18
+ SiteBuilder.descendants.sort.map do |c|
19
19
  c.new(c.name, site).build_with_callbacks
20
20
  end
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bridgetown-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta3
4
+ version: 1.1.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bridgetown Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-18 00:00:00.000000000 Z
11
+ date: 2022-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bridgetown-core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0.beta3
19
+ version: 1.1.0.beta2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0.beta3
26
+ version: 1.1.0.beta2
27
27
  description:
28
28
  email: maintainers@bridgetownrb.com
29
29
  executables: []
@@ -39,6 +39,7 @@ files:
39
39
  - lib/bridgetown-builder/dsl/helpers.rb
40
40
  - lib/bridgetown-builder/dsl/hooks.rb
41
41
  - lib/bridgetown-builder/dsl/http.rb
42
+ - lib/bridgetown-builder/dsl/inspectors.rb
42
43
  - lib/bridgetown-builder/dsl/liquid.rb
43
44
  - lib/bridgetown-builder/dsl/resources.rb
44
45
  - lib/bridgetown-builder/plugin.rb