jekyll 3.9.3 → 4.4.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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +511 -89
  3. data/LICENSE +1 -1
  4. data/README.markdown +48 -27
  5. data/lib/blank_template/_config.yml +3 -0
  6. data/lib/blank_template/_layouts/default.html +12 -0
  7. data/lib/blank_template/_sass/base.scss +9 -0
  8. data/lib/blank_template/assets/css/main.scss +4 -0
  9. data/lib/blank_template/index.md +8 -0
  10. data/lib/jekyll/cache.rb +186 -0
  11. data/lib/jekyll/cleaner.rb +8 -7
  12. data/lib/jekyll/collection.rb +84 -11
  13. data/lib/jekyll/command.rb +33 -6
  14. data/lib/jekyll/commands/build.rb +8 -28
  15. data/lib/jekyll/commands/clean.rb +3 -2
  16. data/lib/jekyll/commands/doctor.rb +46 -35
  17. data/lib/jekyll/commands/help.rb +1 -1
  18. data/lib/jekyll/commands/new.rb +44 -50
  19. data/lib/jekyll/commands/new_theme.rb +27 -28
  20. data/lib/jekyll/commands/serve/live_reload_reactor.rb +9 -16
  21. data/lib/jekyll/commands/serve/servlet.rb +21 -22
  22. data/lib/jekyll/commands/serve/websockets.rb +1 -1
  23. data/lib/jekyll/commands/serve.rb +75 -97
  24. data/lib/jekyll/configuration.rb +66 -158
  25. data/lib/jekyll/converters/identity.rb +18 -0
  26. data/lib/jekyll/converters/markdown/kramdown_parser.rb +83 -33
  27. data/lib/jekyll/converters/markdown.rb +49 -40
  28. data/lib/jekyll/converters/smartypants.rb +34 -14
  29. data/lib/jekyll/convertible.rb +36 -34
  30. data/lib/jekyll/deprecator.rb +2 -4
  31. data/lib/jekyll/document.rb +107 -72
  32. data/lib/jekyll/drops/collection_drop.rb +3 -4
  33. data/lib/jekyll/drops/document_drop.rb +9 -3
  34. data/lib/jekyll/drops/drop.rb +115 -33
  35. data/lib/jekyll/drops/excerpt_drop.rb +8 -0
  36. data/lib/jekyll/drops/site_drop.rb +9 -8
  37. data/lib/jekyll/drops/static_file_drop.rb +4 -4
  38. data/lib/jekyll/drops/theme_drop.rb +39 -0
  39. data/lib/jekyll/drops/unified_payload_drop.rb +7 -2
  40. data/lib/jekyll/drops/url_drop.rb +55 -3
  41. data/lib/jekyll/entry_filter.rb +42 -51
  42. data/lib/jekyll/excerpt.rb +48 -38
  43. data/lib/jekyll/external.rb +20 -19
  44. data/lib/jekyll/filters/date_filters.rb +6 -3
  45. data/lib/jekyll/filters/grouping_filters.rb +1 -2
  46. data/lib/jekyll/filters/url_filters.rb +50 -15
  47. data/lib/jekyll/filters.rb +211 -50
  48. data/lib/jekyll/frontmatter_defaults.rb +45 -36
  49. data/lib/jekyll/hooks.rb +26 -26
  50. data/lib/jekyll/inclusion.rb +32 -0
  51. data/lib/jekyll/layout.rb +12 -19
  52. data/lib/jekyll/liquid_extensions.rb +0 -2
  53. data/lib/jekyll/liquid_renderer/file.rb +24 -3
  54. data/lib/jekyll/liquid_renderer/table.rb +26 -77
  55. data/lib/jekyll/liquid_renderer.rb +31 -16
  56. data/lib/jekyll/log_adapter.rb +5 -1
  57. data/lib/jekyll/page.rb +51 -23
  58. data/lib/jekyll/page_excerpt.rb +25 -0
  59. data/lib/jekyll/page_without_a_file.rb +0 -4
  60. data/lib/jekyll/path_manager.rb +74 -0
  61. data/lib/jekyll/plugin.rb +5 -11
  62. data/lib/jekyll/plugin_manager.rb +15 -5
  63. data/lib/jekyll/profiler.rb +51 -0
  64. data/lib/jekyll/reader.rb +65 -10
  65. data/lib/jekyll/readers/collection_reader.rb +1 -0
  66. data/lib/jekyll/readers/data_reader.rb +48 -10
  67. data/lib/jekyll/readers/layout_reader.rb +3 -12
  68. data/lib/jekyll/readers/page_reader.rb +5 -5
  69. data/lib/jekyll/readers/post_reader.rb +32 -19
  70. data/lib/jekyll/readers/static_file_reader.rb +4 -4
  71. data/lib/jekyll/readers/theme_assets_reader.rb +8 -5
  72. data/lib/jekyll/regenerator.rb +4 -12
  73. data/lib/jekyll/related_posts.rb +1 -1
  74. data/lib/jekyll/renderer.rb +34 -49
  75. data/lib/jekyll/site.rb +151 -58
  76. data/lib/jekyll/static_file.rb +64 -28
  77. data/lib/jekyll/stevenson.rb +4 -8
  78. data/lib/jekyll/tags/highlight.rb +44 -57
  79. data/lib/jekyll/tags/include.rb +114 -80
  80. data/lib/jekyll/tags/link.rb +12 -7
  81. data/lib/jekyll/tags/post_url.rb +33 -30
  82. data/lib/jekyll/theme.rb +20 -18
  83. data/lib/jekyll/theme_builder.rb +91 -89
  84. data/lib/jekyll/url.rb +18 -10
  85. data/lib/jekyll/utils/ansi.rb +2 -2
  86. data/lib/jekyll/utils/exec.rb +0 -1
  87. data/lib/jekyll/utils/internet.rb +2 -4
  88. data/lib/jekyll/utils/platforms.rb +37 -52
  89. data/lib/jekyll/utils/thread_event.rb +1 -5
  90. data/lib/jekyll/utils.rb +29 -28
  91. data/lib/jekyll/version.rb +1 -1
  92. data/lib/jekyll.rb +9 -14
  93. data/lib/site_template/.gitignore +2 -0
  94. data/lib/site_template/404.html +2 -1
  95. data/lib/site_template/_config.yml +17 -5
  96. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +5 -1
  97. data/lib/theme_template/README.md.erb +1 -3
  98. data/lib/theme_template/gitignore.erb +1 -0
  99. data/lib/theme_template/theme.gemspec.erb +1 -4
  100. data/rubocop/jekyll/assert_equal_literal_actual.rb +150 -0
  101. data/rubocop/jekyll/no_p_allowed.rb +5 -6
  102. data/rubocop/jekyll/no_puts_allowed.rb +5 -6
  103. metadata +149 -37
  104. data/lib/jekyll/converters/markdown/rdiscount_parser.rb +0 -37
  105. data/lib/jekyll/converters/markdown/redcarpet_parser.rb +0 -112
  106. data/lib/jekyll/utils/rouge.rb +0 -22
  107. /data/lib/site_template/{about.md → about.markdown} +0 -0
  108. /data/lib/site_template/{index.md → index.markdown} +0 -0
@@ -21,6 +21,7 @@ module Jekyll
21
21
  # Returns a boolean.
22
22
  def regenerate?(document)
23
23
  return true if disabled
24
+
24
25
  case document
25
26
  when Page
26
27
  regenerate_page?(document)
@@ -28,9 +29,7 @@ module Jekyll
28
29
  regenerate_document?(document)
29
30
  else
30
31
  source_path = document.respond_to?(:path) ? document.path : nil
31
- dest_path = if document.respond_to?(:destination)
32
- document.destination(@site.dest)
33
- end
32
+ dest_path = document.destination(@site.dest) if document.respond_to?(:destination)
34
33
  source_modified_or_dest_missing?(source_path, dest_path)
35
34
  end
36
35
  end
@@ -89,9 +88,7 @@ module Jekyll
89
88
  return true if path.nil?
90
89
 
91
90
  # Check for path in cache
92
- if cache.key? path
93
- return cache[path]
94
- end
91
+ return cache[path] if cache.key? path
95
92
 
96
93
  if metadata[path]
97
94
  # If we have seen this file before,
@@ -165,7 +162,6 @@ module Jekyll
165
162
  end
166
163
  end
167
164
 
168
- private
169
165
  def regenerate_page?(document)
170
166
  document.asset_file? || document.data["regenerate"] ||
171
167
  source_modified_or_dest_missing?(
@@ -173,7 +169,6 @@ module Jekyll
173
169
  )
174
170
  end
175
171
 
176
- private
177
172
  def regenerate_document?(document)
178
173
  !document.write? || document.data["regenerate"] ||
179
174
  source_modified_or_dest_missing?(
@@ -181,14 +176,11 @@ module Jekyll
181
176
  )
182
177
  end
183
178
 
184
- private
185
179
  def existing_file_modified?(path)
186
180
  # If one of this file dependencies have been modified,
187
181
  # set the regeneration bit for both the dependency and the file to true
188
182
  metadata[path]["deps"].each do |dependency|
189
- if modified?(dependency)
190
- return cache[dependency] = cache[path] = true
191
- end
183
+ return cache[dependency] = cache[path] = true if modified?(dependency)
192
184
  end
193
185
 
194
186
  if File.exist?(path) && metadata[path]["mtime"].eql?(File.mtime(path))
@@ -46,7 +46,7 @@ module Jekyll
46
46
  end
47
47
 
48
48
  def most_recent_posts
49
- @most_recent_posts ||= (site.posts.docs.last(11).reverse - [post]).first(10)
49
+ @most_recent_posts ||= (site.posts.docs.last(11).reverse! - [post]).first(10)
50
50
  end
51
51
  end
52
52
  end
@@ -9,6 +9,7 @@ module Jekyll
9
9
  @site = site
10
10
  @document = document
11
11
  @payload = site_payload
12
+ @layouts = nil
12
13
  end
13
14
 
14
15
  # Fetches the payload used in Liquid rendering.
@@ -35,7 +36,7 @@ module Jekyll
35
36
  #
36
37
  # Returns Array of Converter instances.
37
38
  def converters
38
- @converters ||= site.converters.select { |c| c.matches(document.extname) }.sort
39
+ @converters ||= site.converters.select { |c| c.matches(document.extname) }.tap(&:sort!)
39
40
  end
40
41
 
41
42
  # Determine the extname the outputted file should have
@@ -65,7 +66,7 @@ module Jekyll
65
66
  # Render the document.
66
67
  #
67
68
  # Returns String rendered document output
68
- # rubocop: disable AbcSize
69
+ # rubocop: disable Metrics/AbcSize, Metrics/MethodLength
69
70
  def render_document
70
71
  info = {
71
72
  :registers => { :site => site, :page => payload["page"] },
@@ -83,6 +84,10 @@ module Jekyll
83
84
  output = convert(output.to_s)
84
85
  document.content = output
85
86
 
87
+ Jekyll.logger.debug "Post-Convert Hooks:", document.relative_path
88
+ document.trigger_hooks(:post_convert)
89
+ output = document.content
90
+
86
91
  if document.place_in_layout?
87
92
  Jekyll.logger.debug "Rendering Layout:", document.relative_path
88
93
  output = place_in_layouts(output, payload, info)
@@ -90,22 +95,20 @@ module Jekyll
90
95
 
91
96
  output
92
97
  end
93
- # rubocop: enable AbcSize
98
+ # rubocop: enable Metrics/AbcSize, Metrics/MethodLength
94
99
 
95
100
  # Convert the document using the converters which match this renderer's document.
96
101
  #
97
102
  # Returns String the converted content.
98
103
  def convert(content)
99
104
  converters.reduce(content) do |output, converter|
100
- begin
101
- converter.convert output
102
- rescue StandardError => e
103
- Jekyll.logger.error "Conversion error:",
104
- "#{converter.class} encountered an error while "\
105
- "converting '#{document.relative_path}':"
106
- Jekyll.logger.error("", e.to_s)
107
- raise e
108
- end
105
+ converter.convert output
106
+ rescue StandardError => e
107
+ Jekyll.logger.error "Conversion error:",
108
+ "#{converter.class} encountered an error while " \
109
+ "converting '#{document.relative_path}':"
110
+ Jekyll.logger.error("", e.to_s)
111
+ raise e
109
112
  end
110
113
  end
111
114
 
@@ -121,16 +124,16 @@ module Jekyll
121
124
  template = site.liquid_renderer.file(path).parse(content)
122
125
  template.warnings.each do |e|
123
126
  Jekyll.logger.warn "Liquid Warning:",
124
- LiquidRenderer.format_error(e, path || document.relative_path)
127
+ LiquidRenderer.format_error(e, path || document.relative_path)
125
128
  end
126
129
  template.render!(payload, info)
127
- # rubocop: disable RescueException
130
+ # rubocop: disable Lint/RescueException
128
131
  rescue Exception => e
129
132
  Jekyll.logger.error "Liquid Exception:",
130
- LiquidRenderer.format_error(e, path || document.relative_path)
133
+ LiquidRenderer.format_error(e, path || document.relative_path)
131
134
  raise e
132
135
  end
133
- # rubocop: enable RescueException
136
+ # rubocop: enable Lint/RescueException
134
137
 
135
138
  # Checks if the layout specified in the document actually exists
136
139
  #
@@ -158,36 +161,30 @@ module Jekyll
158
161
  output = render_layout(output, layout, info)
159
162
  add_regenerator_dependencies(layout)
160
163
 
161
- if (layout = site.layouts[layout.data["layout"]])
162
- break if used.include?(layout)
163
- used << layout
164
- end
164
+ next unless (layout = site.layouts[layout.data["layout"]])
165
+ break if used.include?(layout)
166
+
167
+ used << layout
165
168
  end
166
169
  output
167
170
  end
168
171
 
172
+ private
173
+
169
174
  # Checks if the layout specified in the document actually exists
170
175
  #
171
176
  # layout - the layout to check
172
177
  # Returns nothing
173
- private
174
178
  def validate_layout(layout)
175
- if invalid_layout?(layout)
176
- Jekyll.logger.warn(
177
- "Build Warning:",
178
- "Layout '#{document.data["layout"]}' requested "\
179
- "in #{document.relative_path} does not exist."
180
- )
181
- elsif !layout.nil?
182
- layout_source = layout.path.start_with?(site.source) ? :site : :theme
183
- Jekyll.logger.debug "Layout source:", layout_source
184
- end
179
+ return unless invalid_layout?(layout)
180
+
181
+ Jekyll.logger.warn "Build Warning:", "Layout '#{document.data["layout"]}' requested " \
182
+ "in #{document.relative_path} does not exist."
185
183
  end
186
184
 
187
185
  # Render layout content into document.output
188
186
  #
189
187
  # Returns String rendered content
190
- private
191
188
  def render_layout(output, layout, info)
192
189
  payload["content"] = output
193
190
  payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
@@ -196,13 +193,13 @@ module Jekyll
196
193
  layout.content,
197
194
  payload,
198
195
  info,
199
- layout.relative_path
196
+ layout.path
200
197
  )
201
198
  end
202
199
 
203
- private
204
200
  def add_regenerator_dependencies(layout)
205
201
  return unless document.write?
202
+
206
203
  site.regenerator.add_dependency(
207
204
  site.in_source_dir(document.path),
208
205
  layout.path
@@ -212,18 +209,14 @@ module Jekyll
212
209
  # Set page content to payload and assign pager if document has one.
213
210
  #
214
211
  # Returns nothing
215
- private
216
212
  def assign_pages!
217
213
  payload["page"] = document.to_liquid
218
- payload["paginator"] = if document.respond_to?(:pager)
219
- document.pager.to_liquid
220
- end
214
+ payload["paginator"] = (document.pager.to_liquid if document.respond_to?(:pager))
221
215
  end
222
216
 
223
217
  # Set related posts to payload if document is a post.
224
218
  #
225
219
  # Returns nothing
226
- private
227
220
  def assign_current_document!
228
221
  payload["site"].current_document = document
229
222
  end
@@ -231,21 +224,16 @@ module Jekyll
231
224
  # Set highlighter prefix and suffix
232
225
  #
233
226
  # Returns nothing
234
- private
235
227
  def assign_highlighter_options!
236
228
  payload["highlighter_prefix"] = converters.first.highlighter_prefix
237
229
  payload["highlighter_suffix"] = converters.first.highlighter_suffix
238
230
  end
239
231
 
240
- private
241
232
  def assign_layout_data!
242
233
  layout = layouts[document.data["layout"]]
243
- if layout
244
- payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
245
- end
234
+ payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) if layout
246
235
  end
247
236
 
248
- private
249
237
  def permalink_ext
250
238
  document_permalink = document.permalink
251
239
  if document_permalink && !document_permalink.end_with?("/")
@@ -254,7 +242,6 @@ module Jekyll
254
242
  end
255
243
  end
256
244
 
257
- private
258
245
  def converter_output_ext
259
246
  if output_exts.size == 1
260
247
  output_exts.last
@@ -263,14 +250,12 @@ module Jekyll
263
250
  end
264
251
  end
265
252
 
266
- private
267
253
  def output_exts
268
254
  @output_exts ||= converters.map do |c|
269
255
  c.output_ext(document.extname)
270
- end.compact
256
+ end.tap(&:compact!)
271
257
  end
272
258
 
273
- private
274
259
  def liquid_options
275
260
  @liquid_options ||= site.config["liquid"]
276
261
  end