jekyll-gem-resolver 1.0.0 → 1.1.1
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/README.md +2 -1
- data/lib/jekyll/gem_resolver/parser.rb +28 -0
- data/lib/jekyll/gem_resolver/resolver.rb +23 -0
- data/lib/jekyll/gem_resolver/transformer.rb +83 -0
- data/lib/jekyll/gem_resolver/version.rb +1 -1
- data/lib/jekyll-gem-resolver.rb +5 -0
- metadata +20 -3
- data/lib/jekyll_gem_resolver.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfcd692a085800c78674d3044c864a8c65a9ebb7a496a744b0e0ec22753c6293
|
4
|
+
data.tar.gz: 8118c58f5e4b8ffce5218e52bba1c330b203b2971f85650c4760aebf07f72811
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 449d72929c3efd0d32b88d9839fb2a0e2e96fab28c58e8fc151db2d0c7a331ee18831cdb3b675037c076594c3adb6c5fa8049829024c8553bd9907bca9c1d400
|
7
|
+
data.tar.gz: 84e2fa62e10233514910ee9ac9dc5432f586269fa1cca93ef040f379bab460d3138e4b3856ef1457fd75f97f07725bda2b667f31e8d46d3e69f95f4dcdca8c3e
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# jekyll-gem-resolver
|
2
2
|
[](https://badge.fury.io/rb/jekyll-gem-resolver)
|
3
|
+
[](https://github.com/cr7pt0gr4ph7/jekyll-gem-resolver/actions/workflows/ci.yml)
|
3
4
|
|
4
5
|
Simple Jekyll plugin that enables including resources from non-Jekyll gems into the site build.
|
5
6
|
|
@@ -12,7 +13,7 @@ When enabled, the plugin scans certain, configurable parts of your `_config.yml`
|
|
12
13
|
The origin of this plugin is that I wanted to build [Bootstrap][bootstrap-website]
|
13
14
|
from source using Jekyll's SASS processor and the [boostrap gem][bootstrap-rubygem]. But there is no easy way to reference the external files of the `bootstrap` gem
|
14
15
|
in your `_config.yml`, except for using absolute paths, which feels unsatisfying for a number of reasons.
|
15
|
-
This plugin was born to resolve this problem.
|
16
|
+
This plugin was born to resolve this problem, as described in [this blog post](https://blog.taktgeber.it/2024/02/13/jekyll-gem-resolver#how-to-build-bootstrap-from-source-using-jekyll).
|
16
17
|
|
17
18
|
## Installation
|
18
19
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module GemResolver
|
3
|
+
class PackageReference
|
4
|
+
attr_reader :type, :name, :relative_path
|
5
|
+
|
6
|
+
def initialize(package_type, package_name, relative_path)
|
7
|
+
@type = package_type
|
8
|
+
@name = package_name
|
9
|
+
@relative_path = relative_path
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class PackageReferenceParser
|
14
|
+
def try_parse(value)
|
15
|
+
return nil unless value.is_a? String
|
16
|
+
|
17
|
+
if /^gem:(?<gem_name>[^:]+):(?<relative_path>.*)/ =~ value
|
18
|
+
PackageReference.new('gem', gem_name, "/#{relative_path}")
|
19
|
+
elsif /^gem:(?<gem_name>[^\/:]+)(?<relative_path>.*)/ =~ value
|
20
|
+
PackageReference.new('gem', gem_name, relative_path)
|
21
|
+
else
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'jekyll'
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module GemResolver
|
5
|
+
class PackageReferenceResolver
|
6
|
+
def resolve_reference(pkg)
|
7
|
+
case pkg.type
|
8
|
+
when 'gem'
|
9
|
+
resolve_gem(pkg.name, pkg.relative_path)
|
10
|
+
else
|
11
|
+
Jekyll.logger.error("Unsupported package reference type #{package_type.inspect}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def resolve_gem(gem_name, relative_path)
|
18
|
+
spec = Gem::Specification.find_by_name(gem_name)
|
19
|
+
spec.gem_dir + relative_path
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'jekyll'
|
2
|
+
require 'jekyll/gem_resolver/parser'
|
3
|
+
require 'jekyll/gem_resolver/resolver'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module GemResolver
|
7
|
+
class ConfigTransformer
|
8
|
+
def initialize(parser = nil, resolver = nil)
|
9
|
+
@parser = parser || Jekyll::GemResolver::PackageReferenceParser.new()
|
10
|
+
@resolver = resolver || Jekyll::GemResolver::PackageReferenceResolver.new()
|
11
|
+
end
|
12
|
+
|
13
|
+
def transform_site_config(site)
|
14
|
+
transform_yaml(site.config)
|
15
|
+
end
|
16
|
+
|
17
|
+
def transform_yaml(config)
|
18
|
+
options = config['gem_resolver'] || {}
|
19
|
+
(options['transform'] || []).each { |path_to_transform| transform_config_node(config, path_to_transform.split('.')) }
|
20
|
+
config
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def transform_config_node(node, path, use_fallbacks = true)
|
26
|
+
# Have we arrived at the last segment of the path?
|
27
|
+
if path.nil? || path.empty?
|
28
|
+
# Special behavior: If this node is an array, behave as if path contains an additional '.*'
|
29
|
+
return transform_config_node(node, ['*'], false) if node.is_a?(Array) && use_fallbacks
|
30
|
+
|
31
|
+
# Not an array: Directly process this node
|
32
|
+
return transform_config_value(node)
|
33
|
+
end
|
34
|
+
|
35
|
+
# The path has at least one remaining segment
|
36
|
+
key = strip_brackets(path[0])
|
37
|
+
remaining_path = path[1..-1]
|
38
|
+
|
39
|
+
if node.is_a? Array
|
40
|
+
if key == '*'
|
41
|
+
# Transform each value in this array recursively
|
42
|
+
node.map! { |value| transform_config_node(value, remaining_path) }
|
43
|
+
else
|
44
|
+
# Recurse into the specified array item
|
45
|
+
index = Integer(key)
|
46
|
+
node[index] = transform_config_node(node[index], remaining_path)
|
47
|
+
end
|
48
|
+
elsif node.is_a? Hash
|
49
|
+
if key == '*'
|
50
|
+
# Transform each value in this hash recursively
|
51
|
+
node.transform_values! { |value| transform_config_node(value, remaining_path) }
|
52
|
+
else
|
53
|
+
# Recurse into the specified hash value
|
54
|
+
node[key] = transform_config_node(node[key], remaining_path)
|
55
|
+
end
|
56
|
+
else
|
57
|
+
# The path has remaining segments, but this is a leaf node.
|
58
|
+
# This means that the specified path does not match, and we therefore
|
59
|
+
# do not modify or transform this node.
|
60
|
+
end
|
61
|
+
|
62
|
+
return node
|
63
|
+
end
|
64
|
+
|
65
|
+
def strip_brackets(text)
|
66
|
+
return text unless text
|
67
|
+
return text.gsub(/^\[(.+)\]$/, '\1')
|
68
|
+
end
|
69
|
+
|
70
|
+
def transform_config_value(value)
|
71
|
+
return value unless value.is_a? String # Not a package reference, ignore
|
72
|
+
|
73
|
+
package_ref = @parser.try_parse(value)
|
74
|
+
return value if package_ref.nil? # Not a package reference, ignore
|
75
|
+
|
76
|
+
result = @resolver.resolve(package_ref)
|
77
|
+
Jekyll.logger.error("Failed to resolve package reference #{value}") if result.nil?
|
78
|
+
Jekyll.logger.info("Resolved #{value} to #{result}") unless result.nil?
|
79
|
+
result
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-gem-resolver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Waslowksi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '13.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: Gem resolver plugin for Jekyll
|
56
70
|
email:
|
57
71
|
- cr7pt0gr4ph7@gmail.com
|
@@ -61,8 +75,11 @@ extra_rdoc_files: []
|
|
61
75
|
files:
|
62
76
|
- LICENSE
|
63
77
|
- README.md
|
78
|
+
- lib/jekyll-gem-resolver.rb
|
79
|
+
- lib/jekyll/gem_resolver/parser.rb
|
80
|
+
- lib/jekyll/gem_resolver/resolver.rb
|
81
|
+
- lib/jekyll/gem_resolver/transformer.rb
|
64
82
|
- lib/jekyll/gem_resolver/version.rb
|
65
|
-
- lib/jekyll_gem_resolver.rb
|
66
83
|
homepage: https://github.com/cr7pt0gr4ph7/jekyll-gem-resolver
|
67
84
|
licenses:
|
68
85
|
- MIT
|
data/lib/jekyll_gem_resolver.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
module JekyllGemResolver
|
2
|
-
def self.transform_config(site)
|
3
|
-
options = site.config['gem_resolver'] || {}
|
4
|
-
(options['transform'] || []).each { |path_to_transform| transform_config_node(site.config, path_to_transform.split('.')) }
|
5
|
-
end
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
def self.transform_config_node(node, path, use_fallbacks = true)
|
10
|
-
# Have we arrived at the last segment of the path?
|
11
|
-
if path.nil? || path.empty?
|
12
|
-
# Special behavior: If this node is an array, behave as if path contains an additional '.*'
|
13
|
-
return transform_config_node(node, ['*'], false) if node.is_a?(Array) && use_fallbacks
|
14
|
-
|
15
|
-
# Not an array: Directly process this node
|
16
|
-
return transform_config_value(node)
|
17
|
-
end
|
18
|
-
|
19
|
-
# The path has at least one remaining segment
|
20
|
-
key = strip_brackets(path[0])
|
21
|
-
remaining_path = path[1..-1]
|
22
|
-
|
23
|
-
if node.is_a? Array
|
24
|
-
if key == '*'
|
25
|
-
# Transform each value in this array recursively
|
26
|
-
node.map! { |value| transform_config_node(value, remaining_path) }
|
27
|
-
else
|
28
|
-
# Recurse into the specified array item
|
29
|
-
index = Integer(key)
|
30
|
-
node[index] = transform_config_node(node[index], remaining_path)
|
31
|
-
end
|
32
|
-
elsif node.is_a? Hash
|
33
|
-
if key == '*'
|
34
|
-
# Transform each value in this hash recursively
|
35
|
-
node.transform_values! { |value| transform_config_node(value, remaining_path) }
|
36
|
-
else
|
37
|
-
# Recurse into the specified hash value
|
38
|
-
node[key] = transform_config_node(node[key], remaining_path)
|
39
|
-
end
|
40
|
-
else
|
41
|
-
# The path has remaining segments, but this is a leaf node.
|
42
|
-
# This means that the specified path does not match, and we therefore
|
43
|
-
# do not modify or transform this node.
|
44
|
-
end
|
45
|
-
|
46
|
-
return node
|
47
|
-
end
|
48
|
-
|
49
|
-
def self.strip_brackets(text)
|
50
|
-
return text unless text
|
51
|
-
return text.gsub(/^\[(.+)\]$/, '\1')
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.transform_config_value(value)
|
55
|
-
return value unless value.is_a? String
|
56
|
-
|
57
|
-
result = if /^gem:(?<gem_name>[^:]+):(?<relative_path>.*)/ =~ value
|
58
|
-
resolve_gem(gem_name, "/#{relative_path}")
|
59
|
-
elsif /^gem:(?<gem_name>[^\/]+)(?<relative_path>.*)/ =~ value
|
60
|
-
resolve_gem(gem_name, relative_path)
|
61
|
-
else
|
62
|
-
nil
|
63
|
-
end
|
64
|
-
|
65
|
-
Jekyll.logger.info("Resolved #{value} to #{result}") unless result.nil?
|
66
|
-
result
|
67
|
-
end
|
68
|
-
|
69
|
-
def self.resolve_gem(gem_name, relative_path)
|
70
|
-
spec = Gem::Specification.find_by_name(gem_name)
|
71
|
-
spec.gem_dir + relative_path
|
72
|
-
end
|
73
|
-
|
74
|
-
Jekyll::Hooks.register :site, :after_init do |site|
|
75
|
-
transform_config(site)
|
76
|
-
end
|
77
|
-
end
|