jekyll 4.2.1 → 4.3.2

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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +474 -350
  3. data/LICENSE +21 -21
  4. data/README.markdown +83 -86
  5. data/exe/jekyll +57 -57
  6. data/lib/blank_template/_config.yml +3 -3
  7. data/lib/blank_template/_layouts/default.html +12 -12
  8. data/lib/blank_template/_sass/{main.scss → base.scss} +9 -9
  9. data/lib/blank_template/assets/css/main.scss +4 -4
  10. data/lib/blank_template/index.md +8 -8
  11. data/lib/jekyll/cache.rb +186 -190
  12. data/lib/jekyll/cleaner.rb +111 -111
  13. data/lib/jekyll/collection.rb +310 -309
  14. data/lib/jekyll/command.rb +105 -105
  15. data/lib/jekyll/commands/build.rb +82 -93
  16. data/lib/jekyll/commands/clean.rb +44 -45
  17. data/lib/jekyll/commands/doctor.rb +177 -177
  18. data/lib/jekyll/commands/help.rb +34 -34
  19. data/lib/jekyll/commands/new.rb +168 -169
  20. data/lib/jekyll/commands/new_theme.rb +39 -40
  21. data/lib/jekyll/commands/serve/live_reload_reactor.rb +119 -122
  22. data/lib/jekyll/commands/serve/livereload_assets/livereload.js +1183 -1183
  23. data/lib/jekyll/commands/serve/mime_types_charset.json +71 -0
  24. data/lib/jekyll/commands/serve/servlet.rb +206 -202
  25. data/lib/jekyll/commands/serve/websockets.rb +81 -81
  26. data/lib/jekyll/commands/serve.rb +367 -362
  27. data/lib/jekyll/configuration.rb +313 -313
  28. data/lib/jekyll/converter.rb +54 -54
  29. data/lib/jekyll/converters/identity.rb +41 -41
  30. data/lib/jekyll/converters/markdown/kramdown_parser.rb +197 -199
  31. data/lib/jekyll/converters/markdown.rb +113 -113
  32. data/lib/jekyll/converters/smartypants.rb +70 -70
  33. data/lib/jekyll/convertible.rb +257 -257
  34. data/lib/jekyll/deprecator.rb +50 -50
  35. data/lib/jekyll/document.rb +543 -544
  36. data/lib/jekyll/drops/collection_drop.rb +20 -20
  37. data/lib/jekyll/drops/document_drop.rb +74 -70
  38. data/lib/jekyll/drops/drop.rb +293 -293
  39. data/lib/jekyll/drops/excerpt_drop.rb +23 -19
  40. data/lib/jekyll/drops/jekyll_drop.rb +32 -32
  41. data/lib/jekyll/drops/site_drop.rb +66 -66
  42. data/lib/jekyll/drops/static_file_drop.rb +14 -14
  43. data/lib/jekyll/drops/theme_drop.rb +36 -0
  44. data/lib/jekyll/drops/unified_payload_drop.rb +30 -26
  45. data/lib/jekyll/drops/url_drop.rb +140 -140
  46. data/lib/jekyll/entry_filter.rb +117 -121
  47. data/lib/jekyll/errors.rb +20 -20
  48. data/lib/jekyll/excerpt.rb +200 -201
  49. data/lib/jekyll/external.rb +75 -79
  50. data/lib/jekyll/filters/date_filters.rb +110 -110
  51. data/lib/jekyll/filters/grouping_filters.rb +64 -64
  52. data/lib/jekyll/filters/url_filters.rb +98 -98
  53. data/lib/jekyll/filters.rb +532 -535
  54. data/lib/jekyll/frontmatter_defaults.rb +238 -240
  55. data/lib/jekyll/generator.rb +5 -5
  56. data/lib/jekyll/hooks.rb +107 -107
  57. data/lib/jekyll/inclusion.rb +32 -32
  58. data/lib/jekyll/layout.rb +55 -67
  59. data/lib/jekyll/liquid_extensions.rb +22 -22
  60. data/lib/jekyll/liquid_renderer/file.rb +77 -77
  61. data/lib/jekyll/liquid_renderer/table.rb +45 -55
  62. data/lib/jekyll/liquid_renderer.rb +80 -80
  63. data/lib/jekyll/log_adapter.rb +151 -151
  64. data/lib/jekyll/mime.types +939 -866
  65. data/lib/jekyll/page.rb +215 -217
  66. data/lib/jekyll/page_excerpt.rb +25 -25
  67. data/lib/jekyll/page_without_a_file.rb +14 -14
  68. data/lib/jekyll/path_manager.rb +74 -74
  69. data/lib/jekyll/plugin.rb +92 -92
  70. data/lib/jekyll/plugin_manager.rb +123 -115
  71. data/lib/jekyll/profiler.rb +51 -58
  72. data/lib/jekyll/publisher.rb +23 -23
  73. data/lib/jekyll/reader.rb +209 -192
  74. data/lib/jekyll/readers/collection_reader.rb +23 -23
  75. data/lib/jekyll/readers/data_reader.rb +113 -79
  76. data/lib/jekyll/readers/layout_reader.rb +62 -62
  77. data/lib/jekyll/readers/page_reader.rb +25 -25
  78. data/lib/jekyll/readers/post_reader.rb +85 -85
  79. data/lib/jekyll/readers/static_file_reader.rb +25 -25
  80. data/lib/jekyll/readers/theme_assets_reader.rb +52 -52
  81. data/lib/jekyll/regenerator.rb +195 -195
  82. data/lib/jekyll/related_posts.rb +52 -52
  83. data/lib/jekyll/renderer.rb +263 -265
  84. data/lib/jekyll/site.rb +576 -551
  85. data/lib/jekyll/static_file.rb +205 -208
  86. data/lib/jekyll/stevenson.rb +60 -60
  87. data/lib/jekyll/tags/highlight.rb +114 -110
  88. data/lib/jekyll/tags/include.rb +275 -275
  89. data/lib/jekyll/tags/link.rb +42 -42
  90. data/lib/jekyll/tags/post_url.rb +106 -106
  91. data/lib/jekyll/theme.rb +90 -86
  92. data/lib/jekyll/theme_builder.rb +121 -121
  93. data/lib/jekyll/url.rb +167 -167
  94. data/lib/jekyll/utils/ansi.rb +57 -57
  95. data/lib/jekyll/utils/exec.rb +26 -26
  96. data/lib/jekyll/utils/internet.rb +37 -37
  97. data/lib/jekyll/utils/platforms.rb +67 -67
  98. data/lib/jekyll/utils/thread_event.rb +31 -31
  99. data/lib/jekyll/utils/win_tz.rb +46 -75
  100. data/lib/jekyll/utils.rb +371 -367
  101. data/lib/jekyll/version.rb +5 -5
  102. data/lib/jekyll.rb +195 -195
  103. data/lib/site_template/.gitignore +5 -5
  104. data/lib/site_template/404.html +25 -25
  105. data/lib/site_template/_config.yml +55 -55
  106. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +29 -29
  107. data/lib/site_template/about.markdown +18 -18
  108. data/lib/site_template/index.markdown +6 -6
  109. data/lib/theme_template/CODE_OF_CONDUCT.md.erb +74 -74
  110. data/lib/theme_template/Gemfile +4 -4
  111. data/lib/theme_template/LICENSE.txt.erb +21 -21
  112. data/lib/theme_template/README.md.erb +50 -52
  113. data/lib/theme_template/_layouts/default.html +1 -1
  114. data/lib/theme_template/_layouts/page.html +5 -5
  115. data/lib/theme_template/_layouts/post.html +5 -5
  116. data/lib/theme_template/example/_config.yml.erb +1 -1
  117. data/lib/theme_template/example/_post.md +12 -12
  118. data/lib/theme_template/example/index.html +14 -14
  119. data/lib/theme_template/example/style.scss +7 -7
  120. data/lib/theme_template/gitignore.erb +6 -6
  121. data/lib/theme_template/theme.gemspec.erb +16 -16
  122. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -149
  123. data/rubocop/jekyll/no_p_allowed.rb +23 -23
  124. data/rubocop/jekyll/no_puts_allowed.rb +23 -23
  125. data/rubocop/jekyll.rb +5 -5
  126. metadata +64 -18
@@ -1,240 +1,238 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- # This class handles custom defaults for YAML frontmatter settings.
5
- # These are set in _config.yml and apply both to internal use (e.g. layout)
6
- # and the data available to liquid.
7
- #
8
- # It is exposed via the frontmatter_defaults method on the site class.
9
- class FrontmatterDefaults
10
- # Initializes a new instance.
11
- def initialize(site)
12
- @site = site
13
- end
14
-
15
- def reset
16
- @glob_cache = {} if @glob_cache
17
- end
18
-
19
- def update_deprecated_types(set)
20
- return set unless set.key?("scope") && set["scope"].key?("type")
21
-
22
- set["scope"]["type"] =
23
- case set["scope"]["type"]
24
- when "page"
25
- Deprecator.defaults_deprecate_type("page", "pages")
26
- "pages"
27
- when "post"
28
- Deprecator.defaults_deprecate_type("post", "posts")
29
- "posts"
30
- when "draft"
31
- Deprecator.defaults_deprecate_type("draft", "drafts")
32
- "drafts"
33
- else
34
- set["scope"]["type"]
35
- end
36
-
37
- set
38
- end
39
-
40
- def ensure_time!(set)
41
- return set unless set.key?("values") && set["values"].key?("date")
42
- return set if set["values"]["date"].is_a?(Time)
43
-
44
- set["values"]["date"] = Utils.parse_date(
45
- set["values"]["date"],
46
- "An invalid date format was found in a front-matter default set: #{set}"
47
- )
48
- set
49
- end
50
-
51
- # Finds a default value for a given setting, filtered by path and type
52
- #
53
- # path - the path (relative to the source) of the page,
54
- # post or :draft the default is used in
55
- # type - a symbol indicating whether a :page,
56
- # a :post or a :draft calls this method
57
- #
58
- # Returns the default value or nil if none was found
59
- def find(path, type, setting)
60
- value = nil
61
- old_scope = nil
62
-
63
- matching_sets(path, type).each do |set|
64
- if set["values"].key?(setting) && has_precedence?(old_scope, set["scope"])
65
- value = set["values"][setting]
66
- old_scope = set["scope"]
67
- end
68
- end
69
- value
70
- end
71
-
72
- # Collects a hash with all default values for a page or post
73
- #
74
- # path - the relative path of the page or post
75
- # type - a symbol indicating the type (:post, :page or :draft)
76
- #
77
- # Returns a hash with all default values (an empty hash if there are none)
78
- def all(path, type)
79
- defaults = {}
80
- old_scope = nil
81
- matching_sets(path, type).each do |set|
82
- if has_precedence?(old_scope, set["scope"])
83
- defaults = Utils.deep_merge_hashes(defaults, set["values"])
84
- old_scope = set["scope"]
85
- else
86
- defaults = Utils.deep_merge_hashes(set["values"], defaults)
87
- end
88
- end
89
- defaults
90
- end
91
-
92
- private
93
-
94
- # Checks if a given default setting scope matches the given path and type
95
- #
96
- # scope - the hash indicating the scope, as defined in _config.yml
97
- # path - the path to check for
98
- # type - the type (:post, :page or :draft) to check for
99
- #
100
- # Returns true if the scope applies to the given type and path
101
- def applies?(scope, path, type)
102
- applies_type?(scope, type) && applies_path?(scope, path)
103
- end
104
-
105
- def applies_path?(scope, path)
106
- rel_scope_path = scope["path"]
107
- return true if !rel_scope_path.is_a?(String) || rel_scope_path.empty?
108
-
109
- sanitized_path = sanitize_path(path)
110
-
111
- if rel_scope_path.include?("*")
112
- glob_scope(sanitized_path, rel_scope_path)
113
- else
114
- path_is_subpath?(sanitized_path, strip_collections_dir(rel_scope_path))
115
- end
116
- end
117
-
118
- def glob_scope(sanitized_path, rel_scope_path)
119
- site_source = Pathname.new(@site.source)
120
- abs_scope_path = site_source.join(rel_scope_path).to_s
121
-
122
- glob_cache(abs_scope_path).each do |scope_path|
123
- scope_path = Pathname.new(scope_path).relative_path_from(site_source).to_s
124
- scope_path = strip_collections_dir(scope_path)
125
- Jekyll.logger.debug "Globbed Scope Path:", scope_path
126
- return true if path_is_subpath?(sanitized_path, scope_path)
127
- end
128
- false
129
- end
130
-
131
- def glob_cache(path)
132
- @glob_cache ||= {}
133
- @glob_cache[path] ||= Dir.glob(path)
134
- end
135
-
136
- def path_is_subpath?(path, parent_path)
137
- path.start_with?(parent_path)
138
- end
139
-
140
- def strip_collections_dir(path)
141
- collections_dir = @site.config["collections_dir"]
142
- slashed_coll_dir = collections_dir.empty? ? "/" : "#{collections_dir}/"
143
- return path if collections_dir.empty? || !path.to_s.start_with?(slashed_coll_dir)
144
-
145
- path.sub(slashed_coll_dir, "")
146
- end
147
-
148
- # Determines whether the scope applies to type.
149
- # The scope applies to the type if:
150
- # 1. no 'type' is specified
151
- # 2. the 'type' in the scope is the same as the type asked about
152
- #
153
- # scope - the Hash defaults set being asked about application
154
- # type - the type of the document being processed / asked about
155
- # its defaults.
156
- #
157
- # Returns true if either of the above conditions are satisfied,
158
- # otherwise returns false
159
- def applies_type?(scope, type)
160
- !scope.key?("type") || type&.to_sym.eql?(scope["type"].to_sym)
161
- end
162
-
163
- # Checks if a given set of default values is valid
164
- #
165
- # set - the default value hash, as defined in _config.yml
166
- #
167
- # Returns true if the set is valid and can be used in this class
168
- def valid?(set)
169
- set.is_a?(Hash) && set["values"].is_a?(Hash)
170
- end
171
-
172
- # Determines if a new scope has precedence over an old one
173
- #
174
- # old_scope - the old scope hash, or nil if there's none
175
- # new_scope - the new scope hash
176
- #
177
- # Returns true if the new scope has precedence over the older
178
- # rubocop: disable Naming/PredicateName
179
- def has_precedence?(old_scope, new_scope)
180
- return true if old_scope.nil?
181
-
182
- new_path = sanitize_path(new_scope["path"])
183
- old_path = sanitize_path(old_scope["path"])
184
-
185
- if new_path.length != old_path.length
186
- new_path.length >= old_path.length
187
- elsif new_scope.key?("type")
188
- true
189
- else
190
- !old_scope.key? "type"
191
- end
192
- end
193
- # rubocop: enable Naming/PredicateName
194
-
195
- # Collects a list of sets that match the given path and type
196
- #
197
- # Returns an array of hashes
198
- def matching_sets(path, type)
199
- @matched_set_cache ||= {}
200
- @matched_set_cache[path] ||= {}
201
- @matched_set_cache[path][type] ||= begin
202
- valid_sets.select do |set|
203
- !set.key?("scope") || applies?(set["scope"], path, type)
204
- end
205
- end
206
- end
207
-
208
- # Returns a list of valid sets
209
- #
210
- # This is not cached to allow plugins to modify the configuration
211
- # and have their changes take effect
212
- #
213
- # Returns an array of hashes
214
- def valid_sets
215
- sets = @site.config["defaults"]
216
- return [] unless sets.is_a?(Array)
217
-
218
- sets.map do |set|
219
- if valid?(set)
220
- ensure_time!(update_deprecated_types(set))
221
- else
222
- Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:"
223
- Jekyll.logger.warn set.to_s
224
- nil
225
- end
226
- end.tap(&:compact!)
227
- end
228
-
229
- # Sanitizes the given path by removing a leading slash
230
- def sanitize_path(path)
231
- if path.nil? || path.empty?
232
- ""
233
- elsif path.start_with?("/")
234
- path.gsub(%r!\A/|(?<=[^/])\z!, "")
235
- else
236
- path
237
- end
238
- end
239
- end
240
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ # This class handles custom defaults for YAML frontmatter settings.
5
+ # These are set in _config.yml and apply both to internal use (e.g. layout)
6
+ # and the data available to liquid.
7
+ #
8
+ # It is exposed via the frontmatter_defaults method on the site class.
9
+ class FrontmatterDefaults
10
+ # Initializes a new instance.
11
+ def initialize(site)
12
+ @site = site
13
+ end
14
+
15
+ def reset
16
+ @glob_cache = {} if @glob_cache
17
+ end
18
+
19
+ def update_deprecated_types(set)
20
+ return set unless set.key?("scope") && set["scope"].key?("type")
21
+
22
+ set["scope"]["type"] =
23
+ case set["scope"]["type"]
24
+ when "page"
25
+ Deprecator.defaults_deprecate_type("page", "pages")
26
+ "pages"
27
+ when "post"
28
+ Deprecator.defaults_deprecate_type("post", "posts")
29
+ "posts"
30
+ when "draft"
31
+ Deprecator.defaults_deprecate_type("draft", "drafts")
32
+ "drafts"
33
+ else
34
+ set["scope"]["type"]
35
+ end
36
+
37
+ set
38
+ end
39
+
40
+ def ensure_time!(set)
41
+ return set unless set.key?("values") && set["values"].key?("date")
42
+ return set if set["values"]["date"].is_a?(Time)
43
+
44
+ set["values"]["date"] = Utils.parse_date(
45
+ set["values"]["date"],
46
+ "An invalid date format was found in a front-matter default set: #{set}"
47
+ )
48
+ set
49
+ end
50
+
51
+ # Finds a default value for a given setting, filtered by path and type
52
+ #
53
+ # path - the path (relative to the source) of the page,
54
+ # post or :draft the default is used in
55
+ # type - a symbol indicating whether a :page,
56
+ # a :post or a :draft calls this method
57
+ #
58
+ # Returns the default value or nil if none was found
59
+ def find(path, type, setting)
60
+ value = nil
61
+ old_scope = nil
62
+
63
+ matching_sets(path, type).each do |set|
64
+ if set["values"].key?(setting) && has_precedence?(old_scope, set["scope"])
65
+ value = set["values"][setting]
66
+ old_scope = set["scope"]
67
+ end
68
+ end
69
+ value
70
+ end
71
+
72
+ # Collects a hash with all default values for a page or post
73
+ #
74
+ # path - the relative path of the page or post
75
+ # type - a symbol indicating the type (:post, :page or :draft)
76
+ #
77
+ # Returns a hash with all default values (an empty hash if there are none)
78
+ def all(path, type)
79
+ defaults = {}
80
+ old_scope = nil
81
+ matching_sets(path, type).each do |set|
82
+ if has_precedence?(old_scope, set["scope"])
83
+ defaults = Utils.deep_merge_hashes(defaults, set["values"])
84
+ old_scope = set["scope"]
85
+ else
86
+ defaults = Utils.deep_merge_hashes(set["values"], defaults)
87
+ end
88
+ end
89
+ defaults
90
+ end
91
+
92
+ private
93
+
94
+ # Checks if a given default setting scope matches the given path and type
95
+ #
96
+ # scope - the hash indicating the scope, as defined in _config.yml
97
+ # path - the path to check for
98
+ # type - the type (:post, :page or :draft) to check for
99
+ #
100
+ # Returns true if the scope applies to the given type and path
101
+ def applies?(scope, path, type)
102
+ applies_type?(scope, type) && applies_path?(scope, path)
103
+ end
104
+
105
+ def applies_path?(scope, path)
106
+ rel_scope_path = scope["path"]
107
+ return true if !rel_scope_path.is_a?(String) || rel_scope_path.empty?
108
+
109
+ sanitized_path = sanitize_path(path)
110
+
111
+ if rel_scope_path.include?("*")
112
+ glob_scope(sanitized_path, rel_scope_path)
113
+ else
114
+ path_is_subpath?(sanitized_path, strip_collections_dir(rel_scope_path))
115
+ end
116
+ end
117
+
118
+ def glob_scope(sanitized_path, rel_scope_path)
119
+ site_source = Pathname.new(@site.source)
120
+ abs_scope_path = site_source.join(rel_scope_path).to_s
121
+
122
+ glob_cache(abs_scope_path).each do |scope_path|
123
+ scope_path = Pathname.new(scope_path).relative_path_from(site_source).to_s
124
+ scope_path = strip_collections_dir(scope_path)
125
+ Jekyll.logger.debug "Globbed Scope Path:", scope_path
126
+ return true if path_is_subpath?(sanitized_path, scope_path)
127
+ end
128
+ false
129
+ end
130
+
131
+ def glob_cache(path)
132
+ @glob_cache ||= {}
133
+ @glob_cache[path] ||= Dir.glob(path)
134
+ end
135
+
136
+ def path_is_subpath?(path, parent_path)
137
+ path.start_with?(parent_path)
138
+ end
139
+
140
+ def strip_collections_dir(path)
141
+ collections_dir = @site.config["collections_dir"]
142
+ slashed_coll_dir = collections_dir.empty? ? "/" : "#{collections_dir}/"
143
+ return path if collections_dir.empty? || !path.to_s.start_with?(slashed_coll_dir)
144
+
145
+ path.sub(slashed_coll_dir, "")
146
+ end
147
+
148
+ # Determines whether the scope applies to type.
149
+ # The scope applies to the type if:
150
+ # 1. no 'type' is specified
151
+ # 2. the 'type' in the scope is the same as the type asked about
152
+ #
153
+ # scope - the Hash defaults set being asked about application
154
+ # type - the type of the document being processed / asked about
155
+ # its defaults.
156
+ #
157
+ # Returns true if either of the above conditions are satisfied,
158
+ # otherwise returns false
159
+ def applies_type?(scope, type)
160
+ !scope.key?("type") || type&.to_sym.eql?(scope["type"].to_sym)
161
+ end
162
+
163
+ # Checks if a given set of default values is valid
164
+ #
165
+ # set - the default value hash, as defined in _config.yml
166
+ #
167
+ # Returns true if the set is valid and can be used in this class
168
+ def valid?(set)
169
+ set.is_a?(Hash) && set["values"].is_a?(Hash)
170
+ end
171
+
172
+ # Determines if a new scope has precedence over an old one
173
+ #
174
+ # old_scope - the old scope hash, or nil if there's none
175
+ # new_scope - the new scope hash
176
+ #
177
+ # Returns true if the new scope has precedence over the older
178
+ # rubocop: disable Naming/PredicateName
179
+ def has_precedence?(old_scope, new_scope)
180
+ return true if old_scope.nil?
181
+
182
+ new_path = sanitize_path(new_scope["path"])
183
+ old_path = sanitize_path(old_scope["path"])
184
+
185
+ if new_path.length != old_path.length
186
+ new_path.length >= old_path.length
187
+ elsif new_scope.key?("type")
188
+ true
189
+ else
190
+ !old_scope.key? "type"
191
+ end
192
+ end
193
+ # rubocop: enable Naming/PredicateName
194
+
195
+ # Collects a list of sets that match the given path and type
196
+ #
197
+ # Returns an array of hashes
198
+ def matching_sets(path, type)
199
+ @matched_set_cache ||= {}
200
+ @matched_set_cache[path] ||= {}
201
+ @matched_set_cache[path][type] ||= valid_sets.select do |set|
202
+ !set.key?("scope") || applies?(set["scope"], path, type)
203
+ end
204
+ end
205
+
206
+ # Returns a list of valid sets
207
+ #
208
+ # This is not cached to allow plugins to modify the configuration
209
+ # and have their changes take effect
210
+ #
211
+ # Returns an array of hashes
212
+ def valid_sets
213
+ sets = @site.config["defaults"]
214
+ return [] unless sets.is_a?(Array)
215
+
216
+ sets.map do |set|
217
+ if valid?(set)
218
+ ensure_time!(update_deprecated_types(set))
219
+ else
220
+ Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:"
221
+ Jekyll.logger.warn set.to_s
222
+ nil
223
+ end
224
+ end.tap(&:compact!)
225
+ end
226
+
227
+ # Sanitizes the given path by removing a leading slash
228
+ def sanitize_path(path)
229
+ if path.nil? || path.empty?
230
+ ""
231
+ elsif path.start_with?("/")
232
+ path.gsub(%r!\A/|(?<=[^/])\z!, "")
233
+ else
234
+ path
235
+ end
236
+ end
237
+ end
238
+ end
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- Generator = Class.new(Plugin)
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ Generator = Class.new(Plugin)
5
+ end