jekyll_flexible_include 2.0.2 → 2.0.3
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/.rubocop.yml +3 -0
- data/CHANGELOG.md +0 -6
- data/README.md +72 -4
- data/Rakefile +4 -1
- data/jekyll_flexible_include_plugin.gemspec +48 -0
- data/lib/{jekyll_flexible_include → flexible_include}/version.rb +1 -1
- data/lib/flexible_include.rb +218 -0
- metadata +24 -124
- data/.editorconfig +0 -39
- data/.vscode/launch.json +0 -75
- data/.vscode/settings.json +0 -4
- data/Gemfile +0 -8
- data/Gemfile.lock +0 -131
- data/LICENSE +0 -22
- data/jekyll_flexible_include.gemspec +0 -54
- data/lib/jekyll_flexible_include.rb +0 -182
- data/sig/jekyll_flexible_include.rbs +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa11b845ffd2d483de86a54aadce690978744f497bfd432e2a683a834204f6d6
|
4
|
+
data.tar.gz: 7cc4cbfecf9061a07802f35aeb9a119b6b5921b8aefc93c2d6f8d707c31d82f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d27e4488a061b886c166cd9bc6f77ef3b17e1ce686c7f18904665f0b1e5ce6445a487bb617c787d9abfafdeac7f2a9dee46c16a66425aaa3f49b44daf05f9c76
|
7
|
+
data.tar.gz: 995e5902bd70b1eb67dc67ff1d37235c9e231235693f686ab706015bf23b157e5db41c4d3a131f152d847eb685bf537fbc13d433ab7debd27df7d55c71045496
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,14 +1,8 @@
|
|
1
|
-
## 2.0.2 / 2022-03-11
|
2
|
-
* This version should actually work, crossing fingers
|
3
|
-
|
4
|
-
## 2.0.1 / 2022-03-11
|
5
|
-
* Struggling with poorly documented gem naming conventions, this release is broken, do not use
|
6
1
|
## 2.0.0 / 2022-03-11
|
7
2
|
* Made into a Ruby gem and published on RubyGems.org as [jekyll_flexible_include](https://rubygems.org/gems/jekyll_flexible_include).
|
8
3
|
* `bin/attach` script added for debugging
|
9
4
|
* Rubocop standards added
|
10
5
|
* Proper versioning and CHANGELOG.md added
|
11
|
-
* This release is broken, do not use
|
12
6
|
|
13
7
|
## 1.1.1 / 2021-05-01
|
14
8
|
* Handles spaces in filenames properly.
|
data/README.md
CHANGED
@@ -4,7 +4,12 @@ Jekyll `flexible_include` Plugin
|
|
4
4
|
|
5
5
|
`Flexible_include` is a Jekyll plugin that includes the contents of a file or the result of a process into a generated page. `Flexible_include` is useful because Jekyll's built-in `include` tag only supports the including of files residing within the `_includes/` subfolder of a Jekyll project, and because `flexible_include` offers additional ways of including content.
|
6
6
|
|
7
|
-
Originally called `include_absolute`, this plugin has been renamed to `flexible_include` because it no longer just includes absolute file names.
|
7
|
+
Originally called `include_absolute`, this plugin has been renamed to `flexible_include` because it no longer just includes absolute file names.
|
8
|
+
|
9
|
+
This plugin is available as a [Ruby gem](https://rubygems.org/gems/jekyll_flexible_include).
|
10
|
+
More information is available on my website about [my Jekyll plugins](https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html).
|
11
|
+
|
12
|
+
This plugin supports 4 types of includes:
|
8
13
|
|
9
14
|
### Include Types
|
10
15
|
|
@@ -27,6 +32,10 @@ is specified with a value other than <code>false</code>.
|
|
27
32
|
Note that the [square brackets] merely indicate an optional parameter and are not intended to be literally written.
|
28
33
|
|
29
34
|
|
35
|
+
### Additional Information
|
36
|
+
More information is available on my web site about [my Jekyll plugins](https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html).
|
37
|
+
|
38
|
+
|
30
39
|
## Installation
|
31
40
|
|
32
41
|
Add the following to `Gemfile`, inside the `jekyll_plugins` group:
|
@@ -36,6 +45,21 @@ group :jekyll_plugins do
|
|
36
45
|
end
|
37
46
|
```
|
38
47
|
|
48
|
+
Also add it to `_config.yml`:
|
49
|
+
```yaml
|
50
|
+
plugins:
|
51
|
+
- flexible_include
|
52
|
+
```
|
53
|
+
|
54
|
+
And then execute:
|
55
|
+
|
56
|
+
$ bundle install
|
57
|
+
|
58
|
+
Or install it yourself as:
|
59
|
+
|
60
|
+
$ gem install jekyll_flexible_include
|
61
|
+
|
62
|
+
|
39
63
|
## Examples
|
40
64
|
|
41
65
|
1. Include files without parameters; all four types of includes are shown.
|
@@ -53,6 +77,11 @@ end
|
|
53
77
|
{% flexible_include '~/folder/under/home/directory/foo.html' do_not_escape='true' %}
|
54
78
|
```
|
55
79
|
|
80
|
+
## Additional Information
|
81
|
+
More information is available on
|
82
|
+
[Mike Slinn’s website](https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html).
|
83
|
+
|
84
|
+
|
56
85
|
## GitHub Pages
|
57
86
|
GitHub Pages only allows [these plugins](https://pages.github.com/versions/).
|
58
87
|
That means `flexible_include` will not work on GitHub Pages.
|
@@ -75,9 +104,48 @@ If the plugin does not work:
|
|
75
104
|
|
76
105
|
## Development
|
77
106
|
|
78
|
-
After checking out the repo, run `bin/setup` to install dependencies.
|
107
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
108
|
+
|
109
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
110
|
+
|
111
|
+
### Build and Install Locally
|
112
|
+
To build and install this gem onto your local machine, run:
|
113
|
+
```shell
|
114
|
+
$ rake install:local
|
115
|
+
```
|
116
|
+
|
117
|
+
The following also does the same thing:
|
118
|
+
```shell
|
119
|
+
$ bundle exec rake install
|
120
|
+
```
|
121
|
+
|
122
|
+
Examine the newly built gem:
|
123
|
+
```shell
|
124
|
+
$ gem info jekyll_flexible_include
|
125
|
+
|
126
|
+
*** LOCAL GEMS ***
|
127
|
+
|
128
|
+
jekyll_flexible_include (1.0.0)
|
129
|
+
Author: Mike Slinn
|
130
|
+
Homepage:
|
131
|
+
https://github.com/mslinn/jekyll_flexible_include
|
132
|
+
License: MIT
|
133
|
+
Installed at: /home/mslinn/.gems
|
134
|
+
|
135
|
+
Generates Jekyll logger with colored output.
|
136
|
+
```
|
137
|
+
|
79
138
|
|
80
|
-
|
139
|
+
### Build and Push to RubyGems
|
140
|
+
To release a new version,
|
141
|
+
1. Update the version number in `version.rb`.
|
142
|
+
2. Commit all changes to git; if you don't the next step might fail with an unexplainable error message.
|
143
|
+
3. Run the following:
|
144
|
+
```shell
|
145
|
+
$ bundle exec rake release
|
146
|
+
```
|
147
|
+
The above creates a git tag for the version, commits the created tag,
|
148
|
+
and pushes the new `.gem` file to [RubyGems.org](https://rubygems.org).
|
81
149
|
|
82
150
|
|
83
151
|
## Contributing
|
@@ -89,4 +157,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
89
157
|
|
90
158
|
## License
|
91
159
|
|
92
|
-
[MIT](
|
160
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/flexible_include/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
github = "https://github.com/mslinn/jekyll_flexible_include_plugin"
|
7
|
+
|
8
|
+
spec.authors = ["Mike Slinn"]
|
9
|
+
spec.bindir = "exe"
|
10
|
+
spec.description = <<~END_OF_DESC
|
11
|
+
Jekyll's built-in include tag only supports including files within the _includes folder.
|
12
|
+
This plugin supports 4 types of includes: absolute filenames,
|
13
|
+
filenames relative to the top-level directory of the Jekyll web site,
|
14
|
+
filenames relative to the user home directory,
|
15
|
+
and executable filenames on the PATH.
|
16
|
+
END_OF_DESC
|
17
|
+
spec.email = ["mslinn@mslinn.com"]
|
18
|
+
spec.files = Dir[".rubocop.yml", "LICENSE.*", "Rakefile", "{lib,spec}/**/*", "*.gemspec", "*.md"]
|
19
|
+
spec.homepage = "https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#flexibleInclude"
|
20
|
+
spec.license = "MIT"
|
21
|
+
spec.metadata = {
|
22
|
+
"allowed_push_host" => "https://rubygems.org",
|
23
|
+
"bug_tracker_uri" => "#{github}/issues",
|
24
|
+
"changelog_uri" => "#{github}/CHANGELOG.md",
|
25
|
+
"homepage_uri" => spec.homepage,
|
26
|
+
"source_code_uri" => github,
|
27
|
+
}
|
28
|
+
spec.name = "jekyll_flexible_include"
|
29
|
+
spec.post_install_message = <<~END_MESSAGE
|
30
|
+
|
31
|
+
Thanks for installing #{spec.name}!
|
32
|
+
|
33
|
+
END_MESSAGE
|
34
|
+
spec.require_paths = ["lib"]
|
35
|
+
spec.required_ruby_version = ">= 2.6.0"
|
36
|
+
spec.summary = "Jekyll plugin supports various ways to include content into the generated site."
|
37
|
+
spec.test_files = spec.files.grep(%r!^(test|spec|features)/!)
|
38
|
+
spec.version = JekyllFlexibleIncludePlugin::VERSION
|
39
|
+
|
40
|
+
spec.add_dependency "jekyll", ">= 3.5.0"
|
41
|
+
spec.add_dependency "jekyll_plugin_logger", '~> 2.0.0'
|
42
|
+
|
43
|
+
spec.add_development_dependency "debase"
|
44
|
+
# spec.add_development_dependency "rubocop-jekyll"
|
45
|
+
# spec.add_development_dependency "rubocop-rake"
|
46
|
+
# spec.add_development_dependency "rubocop-rspec"
|
47
|
+
spec.add_development_dependency "ruby-debug-ide"
|
48
|
+
end
|
@@ -0,0 +1,218 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "jekyll"
|
4
|
+
require "jekyll_plugin_logger"
|
5
|
+
require_relative "flexible_include/version"
|
6
|
+
|
7
|
+
module JekyllFlexibleIncludeName
|
8
|
+
PLUGIN_NAME = "flexible_include"
|
9
|
+
end
|
10
|
+
|
11
|
+
class FlexibleIncludeError < StandardError
|
12
|
+
attr_accessor :path
|
13
|
+
|
14
|
+
def initialize(msg, path)
|
15
|
+
super
|
16
|
+
@path = path
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class FlexibleInclude < Liquid::Tag
|
21
|
+
VALID_SYNTAX = %r!
|
22
|
+
([\w-]+)\s*=\s*
|
23
|
+
(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w.-]+))
|
24
|
+
!x.freeze
|
25
|
+
VARIABLE_SYNTAX = %r!
|
26
|
+
(?<variable>[^{]*(\{\{\s*[\w\-.]+\s*(\|.*)?\}\}[^\s{}]*)+)
|
27
|
+
(?<params>.*)
|
28
|
+
!mx.freeze
|
29
|
+
|
30
|
+
FULL_VALID_SYNTAX = %r!\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z!.freeze
|
31
|
+
VALID_FILENAME_CHARS = %r!^[\w/\.-]+$!.freeze
|
32
|
+
|
33
|
+
def initialize(tag_name, markup, parse_context)
|
34
|
+
super
|
35
|
+
@logger = PluginMetaLogger.instance.new_logger(self)
|
36
|
+
matched = markup.strip.match(VARIABLE_SYNTAX)
|
37
|
+
if matched
|
38
|
+
@file = matched["variable"].strip
|
39
|
+
@params = matched["params"].strip
|
40
|
+
else
|
41
|
+
@file, @params = markup.strip.split(%r!\s+!, 2)
|
42
|
+
end
|
43
|
+
@markup = markup
|
44
|
+
@logger.debug("initialize: @markup=#{@markup}")
|
45
|
+
@parse_context = parse_context
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param context [Liquid::Context]
|
49
|
+
def render(context) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
50
|
+
markup = @markup
|
51
|
+
@logger.debug { "markup='#{markup}'" }
|
52
|
+
markup = sanitize_parameter(markup)
|
53
|
+
markup = expand_env(markup)
|
54
|
+
path = markup
|
55
|
+
if /\A\//.match(markup) # Is the file absolute?
|
56
|
+
@logger.debug { "Absolute path=#{path}, markup=#{markup}" }
|
57
|
+
elsif /\A~/.match(markup) # Relative path to user's home directory?
|
58
|
+
@logger.debug { "Relative start markup=#{markup}, path=#{path}" }
|
59
|
+
markup.slice! "~/"
|
60
|
+
path = File.join(ENV['HOME'], markup)
|
61
|
+
@logger.debug { "Relative end markup=#{markup}, path=#{path}" }
|
62
|
+
elsif /\A\!/.match(markup) # Run command and return response
|
63
|
+
markup.slice! "!"
|
64
|
+
@logger.debug { "Execute markup=#{markup}" }
|
65
|
+
contents = run(markup)
|
66
|
+
else # The file is relative or it was passed as a parameter to an include and was not noticed before, e.g. @file='{{include.file}}'
|
67
|
+
@logger.debug { "Catchall start @file=#{@file}, markup=#{markup}, path=#{path}" }
|
68
|
+
file = render_variable(context)
|
69
|
+
markup = file if file
|
70
|
+
markup = expand_env(markup)
|
71
|
+
markup = sanitize_parameter(markup)
|
72
|
+
if /\A\//.match(markup) # Absolute path
|
73
|
+
path = markup
|
74
|
+
elsif /\A\!/.match(markup)
|
75
|
+
markup.slice! "!"
|
76
|
+
@logger.debug { "Execute markup=#{markup}" }
|
77
|
+
contents = run(markup)
|
78
|
+
elsif /\A~/.match(markup) # Relative path to user's home directory?
|
79
|
+
markup.slice! "~/"
|
80
|
+
path = File.join(ENV['HOME'], markup)
|
81
|
+
else # Relative path
|
82
|
+
site = context.registers[:site]
|
83
|
+
source = File.expand_path(site.config['source']) # website root directory
|
84
|
+
path = File.join(source, markup) # Fully qualified path of include file from relative path
|
85
|
+
end
|
86
|
+
@logger.debug { "Catchall end markup=#{markup}, path=#{path}" }
|
87
|
+
end
|
88
|
+
render_completion(context, path, contents)
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def escape_html?(context)
|
94
|
+
do_not_escape = false
|
95
|
+
if @params
|
96
|
+
context["include"] = parse_params(context)
|
97
|
+
@logger.debug { "context['include']['do_not_escape'] = #{context['include']['do_not_escape']}" }
|
98
|
+
do_not_escape = context['include'].fetch('do_not_escape', 'false')
|
99
|
+
@logger.debug { "do_not_escape=#{do_not_escape}" }
|
100
|
+
@logger.debug { "do_not_escape=='false' = #{do_not_escape=='false'}" }
|
101
|
+
end
|
102
|
+
do_not_escape
|
103
|
+
end
|
104
|
+
|
105
|
+
def escape_html(string)
|
106
|
+
string.gsub("{", "{").gsub("}", "}").gsub("<", "<")
|
107
|
+
end
|
108
|
+
|
109
|
+
def expand_env(str)
|
110
|
+
str.gsub(/\$([a-zA-Z_][a-zA-Z0-9_]*)|\${\g<1>}|%\g<1>%/) { ENV[$1] }
|
111
|
+
end
|
112
|
+
|
113
|
+
# Grab file read opts in the context
|
114
|
+
def file_read_opts(context)
|
115
|
+
context.registers[:site].file_read_opts
|
116
|
+
end
|
117
|
+
|
118
|
+
def parse_params(context)
|
119
|
+
params = {}
|
120
|
+
markup = @params
|
121
|
+
|
122
|
+
while (match = VALID_SYNTAX.match(markup))
|
123
|
+
markup = markup[match.end(0)..-1]
|
124
|
+
|
125
|
+
value = if match[2]
|
126
|
+
match[2].gsub(%r!\\"!, '"')
|
127
|
+
elsif match[3]
|
128
|
+
match[3].gsub(%r!\\'!, "'")
|
129
|
+
elsif match[4]
|
130
|
+
context[match[4]]
|
131
|
+
end
|
132
|
+
|
133
|
+
params[match[1]] = value
|
134
|
+
end
|
135
|
+
params
|
136
|
+
end
|
137
|
+
|
138
|
+
def read_file(file)
|
139
|
+
File.read(file)
|
140
|
+
end
|
141
|
+
|
142
|
+
def realpath_prefixed_with?(path, dir)
|
143
|
+
File.exist?(path) && File.realpath(path).start_with?(dir)
|
144
|
+
rescue StandardError
|
145
|
+
false
|
146
|
+
end
|
147
|
+
|
148
|
+
def render_completion(context, path, contents)
|
149
|
+
begin
|
150
|
+
contents = read_file(path) unless contents
|
151
|
+
rescue StandardError => e
|
152
|
+
puts "flexible_include.rb error: #{e.message}".red
|
153
|
+
$stderr.reopen(IO::NULL)
|
154
|
+
$stdout.reopen(IO::NULL)
|
155
|
+
exit
|
156
|
+
end
|
157
|
+
escaped_contents = escape_html?(context) ? escape_html(contents) : contents
|
158
|
+
context.stack do # Temporarily push a new local scope onto the variable stack
|
159
|
+
begin
|
160
|
+
partial = Liquid::Template.parse(escaped_contents) # Type Liquid::Template
|
161
|
+
rescue StandardError => e
|
162
|
+
puts "flexible_include.rb error: #{e.message}".red
|
163
|
+
$stderr.reopen(IO::NULL)
|
164
|
+
$stdout.reopen(IO::NULL)
|
165
|
+
exit
|
166
|
+
end
|
167
|
+
|
168
|
+
begin
|
169
|
+
partial.render!(context)
|
170
|
+
rescue Liquid::Error => e
|
171
|
+
e.template_name = path
|
172
|
+
e.markup_context = "included " if e.markup_context.nil?
|
173
|
+
raise e
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# @return setvalue of 'file' variable if defined
|
179
|
+
def render_variable(context)
|
180
|
+
if @file.match VARIABLE_SYNTAX
|
181
|
+
partial = context.registers[:site]
|
182
|
+
.liquid_renderer
|
183
|
+
.file("(variable)")
|
184
|
+
.parse(@file)
|
185
|
+
partial.render!(context)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def run(cmd)
|
190
|
+
%x[ #{cmd} ].chomp
|
191
|
+
end
|
192
|
+
|
193
|
+
# strip leading and trailing quotes if present
|
194
|
+
def sanitize_parameter(parameter)
|
195
|
+
parameter.strip.gsub(/\A'|'\Z/, '').strip if parameter
|
196
|
+
end
|
197
|
+
|
198
|
+
def valid_include_file?(path, dir, safe)
|
199
|
+
!outside_site_source?(path, dir, safe) && File.file?(path)
|
200
|
+
end
|
201
|
+
|
202
|
+
def outside_site_source?(path, dir, safe)
|
203
|
+
safe && !realpath_prefixed_with?(path, dir)
|
204
|
+
end
|
205
|
+
|
206
|
+
def could_not_locate_message(file, includes_dirs, safe)
|
207
|
+
message = "Could not locate the included file '#{file}' in any of "\
|
208
|
+
"#{includes_dirs}. Ensure it exists in one of those directories and"
|
209
|
+
message + if safe
|
210
|
+
" is not a symlink as those are not allowed in safe mode."
|
211
|
+
else
|
212
|
+
", if it is a symlink, does not point outside your site source."
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
PluginMetaLogger.instance.info { "Loaded #{JekyllFlexibleIncludeName::PLUGIN_NAME} v#{JekyllFlexibleIncludePlugin::VERSION} plugin." }
|
218
|
+
Liquid::Template.register_tag('flexible_include', FlexibleInclude)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll_flexible_include
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Slinn
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.5.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: jekyll_plugin_logger
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
33
|
+
version: 2.0.0
|
34
|
+
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 2.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: debase
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,104 +52,6 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: jekyll
|
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'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: pry
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rake
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rspec
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rubocop
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rubocop-jekyll
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rubocop-rake
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
55
|
- !ruby/object:Gem::Dependency
|
154
56
|
name: ruby-debug-ide
|
155
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,34 +72,32 @@ description: |
|
|
170
72
|
filenames relative to the top-level directory of the Jekyll web site,
|
171
73
|
filenames relative to the user home directory,
|
172
74
|
and executable filenames on the PATH.
|
173
|
-
email:
|
75
|
+
email:
|
76
|
+
- mslinn@mslinn.com
|
174
77
|
executables: []
|
175
78
|
extensions: []
|
176
79
|
extra_rdoc_files: []
|
177
80
|
files:
|
178
|
-
- ".editorconfig"
|
179
81
|
- ".rubocop.yml"
|
180
|
-
- ".vscode/launch.json"
|
181
|
-
- ".vscode/settings.json"
|
182
82
|
- CHANGELOG.md
|
183
|
-
- Gemfile
|
184
|
-
- Gemfile.lock
|
185
|
-
- LICENSE
|
186
83
|
- README.md
|
187
84
|
- Rakefile
|
188
|
-
-
|
189
|
-
- lib/
|
190
|
-
- lib/
|
191
|
-
|
192
|
-
homepage: https://github.com/mslinn/jekyll_flexible_include_plugin
|
85
|
+
- jekyll_flexible_include_plugin.gemspec
|
86
|
+
- lib/flexible_include.rb
|
87
|
+
- lib/flexible_include/version.rb
|
88
|
+
homepage: https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#flexibleInclude
|
193
89
|
licenses:
|
194
90
|
- MIT
|
195
91
|
metadata:
|
196
|
-
allowed_push_host: https://rubygems.org
|
197
|
-
|
198
|
-
source_code_uri: https://github.com/mslinn/jekyll_flexible_include_plugin
|
92
|
+
allowed_push_host: https://rubygems.org
|
93
|
+
bug_tracker_uri: https://github.com/mslinn/jekyll_flexible_include_plugin/issues
|
199
94
|
changelog_uri: https://github.com/mslinn/jekyll_flexible_include_plugin/CHANGELOG.md
|
200
|
-
|
95
|
+
homepage_uri: https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#flexibleInclude
|
96
|
+
source_code_uri: https://github.com/mslinn/jekyll_flexible_include_plugin
|
97
|
+
post_install_message: |2+
|
98
|
+
|
99
|
+
Thanks for installing jekyll_flexible_include!
|
100
|
+
|
201
101
|
rdoc_options: []
|
202
102
|
require_paths:
|
203
103
|
- lib
|
@@ -212,9 +112,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
112
|
- !ruby/object:Gem::Version
|
213
113
|
version: '0'
|
214
114
|
requirements: []
|
215
|
-
rubygems_version: 3.
|
115
|
+
rubygems_version: 3.1.4
|
216
116
|
signing_key:
|
217
117
|
specification_version: 4
|
218
|
-
summary:
|
118
|
+
summary: Jekyll plugin supports various ways to include content into the generated
|
219
119
|
site.
|
220
120
|
test_files: []
|
data/.editorconfig
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# This file is for unifying the coding style for different editors and IDEs
|
2
|
-
# editorconfig.org
|
3
|
-
|
4
|
-
# https://editorconfig.org/
|
5
|
-
root = true
|
6
|
-
|
7
|
-
[*]
|
8
|
-
charset = utf-8
|
9
|
-
indent_style = space
|
10
|
-
indent_size = 2
|
11
|
-
tab_width = 2
|
12
|
-
end_of_line = lf
|
13
|
-
trim_trailing_whitespace = true
|
14
|
-
insert_final_newline = true
|
15
|
-
|
16
|
-
[*.{java,jsp}]
|
17
|
-
indent_size = 4
|
18
|
-
tab_width = 4
|
19
|
-
insert_final_newline = false
|
20
|
-
|
21
|
-
[{*.{awk,bat,c,cpp,d,h,l,mk,re,skl,w32,y},Makefile*}]
|
22
|
-
indent_size = 4
|
23
|
-
indent_style = tab
|
24
|
-
|
25
|
-
[*.{dtd,html,inc,php,phpt,rng,wsdl,xml,xsd,xsl}]
|
26
|
-
indent_size = 4
|
27
|
-
indent_style = space
|
28
|
-
|
29
|
-
[*.md]
|
30
|
-
indent_style = space
|
31
|
-
max_line_length = 80
|
32
|
-
|
33
|
-
[COMMIT_EDITMSG]
|
34
|
-
indent_size = 4
|
35
|
-
indent_style = space
|
36
|
-
max_line_length = 80
|
37
|
-
|
38
|
-
[*.patch]
|
39
|
-
trim_trailing_whitespace = false
|
data/.vscode/launch.json
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
{
|
2
|
-
// Use IntelliSense to learn about possible attributes.
|
3
|
-
// Hover to view descriptions of existing attributes.
|
4
|
-
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
5
|
-
"version": "0.2.0",
|
6
|
-
"configurations": [
|
7
|
-
{
|
8
|
-
"cwd": "${workspaceRoot}",
|
9
|
-
"name": "Attach rdebug-ide",
|
10
|
-
"request": "attach",
|
11
|
-
"remoteHost": "localhost",
|
12
|
-
"remotePort": "1234",
|
13
|
-
"remoteWorkspaceRoot": "/",
|
14
|
-
"restart": true,
|
15
|
-
"showDebuggerOutput": true,
|
16
|
-
"type": "Ruby",
|
17
|
-
},
|
18
|
-
{
|
19
|
-
"cwd": "${workspaceRoot}",
|
20
|
-
"debuggerPort": "1234",
|
21
|
-
"name": "Debug Jekyll",
|
22
|
-
"program": "/usr/local/bin/jekyll",
|
23
|
-
"args": [
|
24
|
-
"serve",
|
25
|
-
"--livereload_port", "35721",
|
26
|
-
"--force_polling",
|
27
|
-
"--host", "0.0.0.0",
|
28
|
-
"--port", "4001",
|
29
|
-
"--future",
|
30
|
-
"--incremental",
|
31
|
-
"--livereload",
|
32
|
-
"--drafts",
|
33
|
-
"--unpublished"
|
34
|
-
],
|
35
|
-
"request": "launch",
|
36
|
-
"restart": true,
|
37
|
-
"showDebuggerOutput": true,
|
38
|
-
"stopOnEntry": true,
|
39
|
-
"type": "Ruby",
|
40
|
-
},
|
41
|
-
{
|
42
|
-
"name": "Debug Local Ruby",
|
43
|
-
"type": "Ruby",
|
44
|
-
"request": "launch",
|
45
|
-
"program": "${workspaceRoot}/main.rb"
|
46
|
-
},
|
47
|
-
{
|
48
|
-
"args": [
|
49
|
-
"-I",
|
50
|
-
"${workspaceRoot}",
|
51
|
-
"${file}"
|
52
|
-
],
|
53
|
-
"cwd": "${workspaceRoot}",
|
54
|
-
"name": "RSpec - active spec file only",
|
55
|
-
"program": "/home/mslinn/.gems/bin/rspec",
|
56
|
-
"showDebuggerOutput": false,
|
57
|
-
"request": "launch",
|
58
|
-
"type": "Ruby",
|
59
|
-
"useBundler": true,
|
60
|
-
},
|
61
|
-
{
|
62
|
-
"args": [
|
63
|
-
"-I",
|
64
|
-
"${workspaceRoot}"
|
65
|
-
],
|
66
|
-
"cwd": "${workspaceRoot}",
|
67
|
-
"name": "RSpec - all",
|
68
|
-
"program": "/home/mslinn/.gems/bin/rspec",
|
69
|
-
"request": "launch",
|
70
|
-
"showDebuggerOutput": false,
|
71
|
-
"type": "Ruby",
|
72
|
-
"useBundler": true,
|
73
|
-
}
|
74
|
-
]
|
75
|
-
}
|
data/.vscode/settings.json
DELETED
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,131 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
jekyll_flexible_include (2.0.2)
|
5
|
-
jekyll (>= 3.5.0)
|
6
|
-
|
7
|
-
GEM
|
8
|
-
remote: https://rubygems.org/
|
9
|
-
specs:
|
10
|
-
addressable (2.8.0)
|
11
|
-
public_suffix (>= 2.0.2, < 5.0)
|
12
|
-
ast (2.4.2)
|
13
|
-
coderay (1.1.3)
|
14
|
-
colorator (1.1.0)
|
15
|
-
concurrent-ruby (1.1.9)
|
16
|
-
debase (0.2.4.1)
|
17
|
-
debase-ruby_core_source (>= 0.10.2)
|
18
|
-
debase-ruby_core_source (0.10.14)
|
19
|
-
diff-lcs (1.5.0)
|
20
|
-
em-websocket (0.5.3)
|
21
|
-
eventmachine (>= 0.12.9)
|
22
|
-
http_parser.rb (~> 0)
|
23
|
-
eventmachine (1.2.7)
|
24
|
-
ffi (1.15.5)
|
25
|
-
forwardable-extended (2.6.0)
|
26
|
-
http_parser.rb (0.8.0)
|
27
|
-
i18n (0.9.5)
|
28
|
-
concurrent-ruby (~> 1.0)
|
29
|
-
jekyll (3.9.1)
|
30
|
-
addressable (~> 2.4)
|
31
|
-
colorator (~> 1.0)
|
32
|
-
em-websocket (~> 0.5)
|
33
|
-
i18n (~> 0.7)
|
34
|
-
jekyll-sass-converter (~> 1.0)
|
35
|
-
jekyll-watch (~> 2.0)
|
36
|
-
kramdown (>= 1.17, < 3)
|
37
|
-
liquid (~> 4.0)
|
38
|
-
mercenary (~> 0.3.3)
|
39
|
-
pathutil (~> 0.9)
|
40
|
-
rouge (>= 1.7, < 4)
|
41
|
-
safe_yaml (~> 1.0)
|
42
|
-
jekyll-sass-converter (1.5.2)
|
43
|
-
sass (~> 3.4)
|
44
|
-
jekyll-watch (2.2.1)
|
45
|
-
listen (~> 3.0)
|
46
|
-
kramdown (2.3.1)
|
47
|
-
rexml
|
48
|
-
liquid (4.0.3)
|
49
|
-
listen (3.7.1)
|
50
|
-
rb-fsevent (~> 0.10, >= 0.10.3)
|
51
|
-
rb-inotify (~> 0.9, >= 0.9.10)
|
52
|
-
mercenary (0.3.6)
|
53
|
-
method_source (1.0.0)
|
54
|
-
parallel (1.21.0)
|
55
|
-
parser (3.1.1.0)
|
56
|
-
ast (~> 2.4.1)
|
57
|
-
pathutil (0.16.2)
|
58
|
-
forwardable-extended (~> 2.6)
|
59
|
-
pry (0.14.1)
|
60
|
-
coderay (~> 1.1)
|
61
|
-
method_source (~> 1.0)
|
62
|
-
public_suffix (4.0.6)
|
63
|
-
rainbow (3.1.1)
|
64
|
-
rake (13.0.6)
|
65
|
-
rb-fsevent (0.11.1)
|
66
|
-
rb-inotify (0.10.1)
|
67
|
-
ffi (~> 1.0)
|
68
|
-
regexp_parser (2.2.1)
|
69
|
-
rexml (3.2.5)
|
70
|
-
rouge (3.28.0)
|
71
|
-
rspec (3.11.0)
|
72
|
-
rspec-core (~> 3.11.0)
|
73
|
-
rspec-expectations (~> 3.11.0)
|
74
|
-
rspec-mocks (~> 3.11.0)
|
75
|
-
rspec-core (3.11.0)
|
76
|
-
rspec-support (~> 3.11.0)
|
77
|
-
rspec-expectations (3.11.0)
|
78
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
79
|
-
rspec-support (~> 3.11.0)
|
80
|
-
rspec-mocks (3.11.0)
|
81
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
82
|
-
rspec-support (~> 3.11.0)
|
83
|
-
rspec-support (3.11.0)
|
84
|
-
rubocop (1.18.4)
|
85
|
-
parallel (~> 1.10)
|
86
|
-
parser (>= 3.0.0.0)
|
87
|
-
rainbow (>= 2.2.2, < 4.0)
|
88
|
-
regexp_parser (>= 1.8, < 3.0)
|
89
|
-
rexml
|
90
|
-
rubocop-ast (>= 1.8.0, < 2.0)
|
91
|
-
ruby-progressbar (~> 1.7)
|
92
|
-
unicode-display_width (>= 1.4.0, < 3.0)
|
93
|
-
rubocop-ast (1.16.0)
|
94
|
-
parser (>= 3.1.1.0)
|
95
|
-
rubocop-jekyll (0.12.0)
|
96
|
-
rubocop (~> 1.18.0)
|
97
|
-
rubocop-performance (~> 1.2)
|
98
|
-
rubocop-performance (1.13.3)
|
99
|
-
rubocop (>= 1.7.0, < 2.0)
|
100
|
-
rubocop-ast (>= 0.4.0)
|
101
|
-
rubocop-rake (0.6.0)
|
102
|
-
rubocop (~> 1.0)
|
103
|
-
ruby-debug-ide (0.7.3)
|
104
|
-
rake (>= 0.8.1)
|
105
|
-
ruby-progressbar (1.11.0)
|
106
|
-
safe_yaml (1.0.5)
|
107
|
-
sass (3.7.4)
|
108
|
-
sass-listen (~> 4.0.0)
|
109
|
-
sass-listen (4.0.0)
|
110
|
-
rb-fsevent (~> 0.9, >= 0.9.4)
|
111
|
-
rb-inotify (~> 0.9, >= 0.9.7)
|
112
|
-
unicode-display_width (2.1.0)
|
113
|
-
|
114
|
-
PLATFORMS
|
115
|
-
x86_64-linux
|
116
|
-
|
117
|
-
DEPENDENCIES
|
118
|
-
bundler
|
119
|
-
debase
|
120
|
-
jekyll
|
121
|
-
jekyll_flexible_include!
|
122
|
-
pry
|
123
|
-
rake (~> 13.0)
|
124
|
-
rspec
|
125
|
-
rubocop
|
126
|
-
rubocop-jekyll
|
127
|
-
rubocop-rake
|
128
|
-
ruby-debug-ide
|
129
|
-
|
130
|
-
BUNDLED WITH
|
131
|
-
2.3.7
|
data/LICENSE
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2019 Tan Nhu, Maarten Brakkee
|
4
|
-
Copyright (c) 2022 Mike Slinn
|
5
|
-
|
6
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
of this software and associated documentation files (the "Software"), to deal
|
8
|
-
in the Software without restriction, including without limitation the rights
|
9
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
copies of the Software, and to permit persons to whom the Software is
|
11
|
-
furnished to do so, subject to the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be included in
|
14
|
-
all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
THE SOFTWARE.
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "lib/jekyll_flexible_include/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'jekyll_flexible_include'
|
7
|
-
spec.version = JekyllFlexibleIncludePlugin::VERSION
|
8
|
-
spec.authors = ['Mike Slinn']
|
9
|
-
spec.email = 'mslinn@mslinn.com'
|
10
|
-
|
11
|
-
spec.summary = "This Jekyll plugin supports various ways to include content into the generated site."
|
12
|
-
spec.description = <<~END_OF_DESC
|
13
|
-
Jekyll's built-in include tag only supports including files within the _includes folder.
|
14
|
-
This plugin supports 4 types of includes: absolute filenames,
|
15
|
-
filenames relative to the top-level directory of the Jekyll web site,
|
16
|
-
filenames relative to the user home directory,
|
17
|
-
and executable filenames on the PATH.
|
18
|
-
END_OF_DESC
|
19
|
-
spec.homepage = "https://github.com/mslinn/jekyll_flexible_include_plugin"
|
20
|
-
spec.license = "MIT"
|
21
|
-
spec.required_ruby_version = ">= 2.6.0"
|
22
|
-
|
23
|
-
spec.metadata["allowed_push_host"] = "https://rubygems.org/"
|
24
|
-
|
25
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
26
|
-
spec.metadata["source_code_uri"] = "https://github.com/mslinn/jekyll_flexible_include_plugin"
|
27
|
-
spec.metadata["changelog_uri"] = "https://github.com/mslinn/jekyll_flexible_include_plugin/CHANGELOG.md"
|
28
|
-
|
29
|
-
# Specify which files should be added to the gem when it is released.
|
30
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
31
|
-
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
32
|
-
`git ls-files -z`.split("\x0").reject do |f|
|
33
|
-
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
34
|
-
end
|
35
|
-
end
|
36
|
-
spec.bindir = "exe"
|
37
|
-
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
38
|
-
spec.require_paths = ["lib"]
|
39
|
-
|
40
|
-
spec.post_install_message = "Thanks for installing jekyll_flexible_include!"
|
41
|
-
|
42
|
-
spec.add_runtime_dependency 'jekyll', '>= 3.5.0'
|
43
|
-
|
44
|
-
spec.add_development_dependency 'bundler'
|
45
|
-
spec.add_development_dependency 'debase'
|
46
|
-
spec.add_development_dependency 'jekyll'
|
47
|
-
spec.add_development_dependency 'pry'
|
48
|
-
spec.add_development_dependency 'rake'
|
49
|
-
spec.add_development_dependency 'rspec'
|
50
|
-
spec.add_development_dependency 'rubocop'
|
51
|
-
spec.add_development_dependency 'rubocop-jekyll'
|
52
|
-
spec.add_development_dependency 'rubocop-rake'
|
53
|
-
spec.add_development_dependency 'ruby-debug-ide'
|
54
|
-
end
|
@@ -1,182 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "jekyll_flexible_include/version"
|
4
|
-
|
5
|
-
module Jekyll
|
6
|
-
module Tags
|
7
|
-
class FlexibleIncludeError < StandardError
|
8
|
-
attr_accessor :path
|
9
|
-
|
10
|
-
def initialize(msg, path)
|
11
|
-
super(msg)
|
12
|
-
@path = path
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
class FlexibleInclude < Liquid::Tag
|
17
|
-
VALID_SYNTAX = %r!
|
18
|
-
([\w-]+)\s*=\s*
|
19
|
-
(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))
|
20
|
-
!x
|
21
|
-
VARIABLE_SYNTAX = %r!
|
22
|
-
(?<variable>[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)
|
23
|
-
(?<params>.*)
|
24
|
-
!mx
|
25
|
-
|
26
|
-
FULL_VALID_SYNTAX = %r!\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z!
|
27
|
-
VALID_FILENAME_CHARS = %r!^[\w/\.-]+$!
|
28
|
-
|
29
|
-
def initialize(tag_name, markup, tokens)
|
30
|
-
super
|
31
|
-
matched = markup.strip.match(VARIABLE_SYNTAX)
|
32
|
-
if matched
|
33
|
-
@file = matched["variable"].strip
|
34
|
-
@params = matched["params"].strip
|
35
|
-
else
|
36
|
-
@file, @params = markup.strip.split(%r!\s+!, 2)
|
37
|
-
end
|
38
|
-
validate_params if @params
|
39
|
-
@tag_name = tag_name
|
40
|
-
end
|
41
|
-
|
42
|
-
def syntax_example
|
43
|
-
"{% #{@tag_name} 'file.ext' optional_param_1='value' optional_param_n='value' %}"
|
44
|
-
end
|
45
|
-
|
46
|
-
def parse_params(context)
|
47
|
-
params = {}
|
48
|
-
markup = @params
|
49
|
-
|
50
|
-
while (match = VALID_SYNTAX.match(markup))
|
51
|
-
markup = markup[match.end(0)..-1]
|
52
|
-
|
53
|
-
value = if match[2]
|
54
|
-
match[2].gsub(%r!\\"!, '"')
|
55
|
-
elsif match[3]
|
56
|
-
match[3].gsub(%r!\\'!, "'")
|
57
|
-
elsif match[4]
|
58
|
-
context[match[4]]
|
59
|
-
end
|
60
|
-
|
61
|
-
params[match[1]] = value
|
62
|
-
end
|
63
|
-
params
|
64
|
-
end
|
65
|
-
|
66
|
-
def validate_params
|
67
|
-
unless @params.match FULL_VALID_SYNTAX
|
68
|
-
raise ArgumentError, <<~MSG
|
69
|
-
Invalid syntax for the flexible_include tag:
|
70
|
-
|
71
|
-
#{@params}
|
72
|
-
|
73
|
-
Valid syntax:
|
74
|
-
|
75
|
-
#{syntax_example}
|
76
|
-
|
77
|
-
MSG
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# See https://gist.github.com/steakknife/4606598
|
82
|
-
def expand_env_vars(str)
|
83
|
-
str.gsub(/\$([a-zA-Z_]+[a-zA-Z0-9_]*)|\$\{(.+)\}/) { ENV[Regexp.last_match(1) || egexp.last_match(2)] }
|
84
|
-
end
|
85
|
-
|
86
|
-
# Grab file read opts in the context
|
87
|
-
def file_read_opts(context)
|
88
|
-
context.registers[:site].file_read_opts
|
89
|
-
end
|
90
|
-
|
91
|
-
# Render the variable if required
|
92
|
-
def render_variable(context)
|
93
|
-
if @file.match VARIABLE_SYNTAX
|
94
|
-
partial = context.registers[:site]
|
95
|
-
.liquid_renderer
|
96
|
-
.file("(variable)")
|
97
|
-
.parse(@file)
|
98
|
-
partial.render!(context)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def render(context) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
103
|
-
file = render_variable(context) || @file
|
104
|
-
# strip leading and trailing quotes, and expand environment variables
|
105
|
-
file = expand_env_vars(file.gsub(/\A'|'\Z/, ''))
|
106
|
-
path = file
|
107
|
-
case file
|
108
|
-
when %r{\A/} # Is the file absolute?
|
109
|
-
# puts "********** render path=#{path}, file=#{file} *************"
|
110
|
-
when /\A~/ # Is the file relative to user's home directory?
|
111
|
-
# puts "********** render original file=#{file}, path=#{path} *************"
|
112
|
-
file.slice! "~/"
|
113
|
-
path = File.join(ENV['HOME'], file)
|
114
|
-
# puts "********** render path=#{path}, file=#{file} *************"
|
115
|
-
when /\A!/ # Is the file on the PATH?
|
116
|
-
# puts "********** render original file=#{file}, path=#{path} *************"
|
117
|
-
file.slice! "!"
|
118
|
-
path = File.which(file)
|
119
|
-
Jekyll.logger.error "Flexible_include error: #{file} was not found on the PATH, output was not included" unless path
|
120
|
-
# puts "********** render path=#{path}, file=#{file} *************"
|
121
|
-
else # The file is relative
|
122
|
-
source = File.expand_path(context.registers[:site].config['source']) # website root directory
|
123
|
-
path = File.join(source, file) # Fully qualified path of include file
|
124
|
-
# puts "********** render file=#{file}, path=#{path}, source=#{source} *************"
|
125
|
-
end
|
126
|
-
return unless path
|
127
|
-
|
128
|
-
begin
|
129
|
-
escaped_contents = read_file(path, context).gsub("{", "{").gsub("}", "}").gsub("<", "<")
|
130
|
-
# puts escaped_contents
|
131
|
-
partial = Liquid::Template.parse(escaped_contents)
|
132
|
-
rescue StandardError => e
|
133
|
-
abort "flexible_include.rb: #{e.message}"
|
134
|
-
end
|
135
|
-
|
136
|
-
context.stack do
|
137
|
-
context["include"] = parse_params(context) if @params
|
138
|
-
begin
|
139
|
-
partial.render!(context)
|
140
|
-
rescue Liquid::Error => e
|
141
|
-
e.template_name = path
|
142
|
-
e.markup_context = "included " if e.markup_context.nil?
|
143
|
-
raise e
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def valid_include_file?(path, dir, safe)
|
149
|
-
!outside_site_source?(path, dir, safe) && File.file?(path)
|
150
|
-
end
|
151
|
-
|
152
|
-
def outside_site_source?(path, dir, safe)
|
153
|
-
safe && !realpath_prefixed_with?(path, dir)
|
154
|
-
end
|
155
|
-
|
156
|
-
def realpath_prefixed_with?(path, dir)
|
157
|
-
File.exist?(path) && File.realpath(path).start_with?(dir)
|
158
|
-
rescue StandardError
|
159
|
-
false
|
160
|
-
end
|
161
|
-
|
162
|
-
# This method allows to modify the file content by inheriting from the class.
|
163
|
-
def read_file(file, context)
|
164
|
-
File.read(file, **file_read_opts(context))
|
165
|
-
end
|
166
|
-
|
167
|
-
private
|
168
|
-
|
169
|
-
def could_not_locate_message(file, includes_dirs, safe)
|
170
|
-
message = "Could not locate the included file '#{file}' in any of "\
|
171
|
-
"#{includes_dirs}. Ensure it exists in one of those directories and"
|
172
|
-
message + if safe
|
173
|
-
" is not a symlink as those are not allowed in safe mode."
|
174
|
-
else
|
175
|
-
", if it is a symlink, does not point outside your site source."
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
Liquid::Template.register_tag("flexible_include", Jekyll::Tags::FlexibleInclude)
|