jekyll 3.9.5 → 4.0.0.pre.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +27 -50
  3. data/LICENSE +1 -1
  4. data/README.markdown +46 -17
  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/main.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 +183 -0
  11. data/lib/jekyll/cleaner.rb +2 -1
  12. data/lib/jekyll/collection.rb +78 -8
  13. data/lib/jekyll/command.rb +31 -6
  14. data/lib/jekyll/commands/build.rb +11 -20
  15. data/lib/jekyll/commands/clean.rb +2 -0
  16. data/lib/jekyll/commands/doctor.rb +15 -8
  17. data/lib/jekyll/commands/help.rb +1 -1
  18. data/lib/jekyll/commands/new.rb +37 -42
  19. data/lib/jekyll/commands/new_theme.rb +30 -28
  20. data/lib/jekyll/commands/serve/live_reload_reactor.rb +6 -10
  21. data/lib/jekyll/commands/serve/servlet.rb +15 -19
  22. data/lib/jekyll/commands/serve.rb +46 -86
  23. data/lib/jekyll/configuration.rb +26 -26
  24. data/lib/jekyll/converters/identity.rb +18 -0
  25. data/lib/jekyll/converters/markdown/kramdown_parser.rb +1 -10
  26. data/lib/jekyll/converters/markdown.rb +49 -40
  27. data/lib/jekyll/converters/smartypants.rb +34 -14
  28. data/lib/jekyll/convertible.rb +11 -13
  29. data/lib/jekyll/deprecator.rb +1 -3
  30. data/lib/jekyll/document.rb +44 -41
  31. data/lib/jekyll/drops/collection_drop.rb +2 -3
  32. data/lib/jekyll/drops/document_drop.rb +2 -1
  33. data/lib/jekyll/drops/drop.rb +3 -6
  34. data/lib/jekyll/drops/excerpt_drop.rb +4 -0
  35. data/lib/jekyll/drops/site_drop.rb +4 -13
  36. data/lib/jekyll/drops/unified_payload_drop.rb +1 -0
  37. data/lib/jekyll/drops/url_drop.rb +1 -0
  38. data/lib/jekyll/entry_filter.rb +2 -1
  39. data/lib/jekyll/excerpt.rb +45 -34
  40. data/lib/jekyll/external.rb +10 -5
  41. data/lib/jekyll/filters/date_filters.rb +6 -3
  42. data/lib/jekyll/filters/grouping_filters.rb +1 -2
  43. data/lib/jekyll/filters/url_filters.rb +6 -1
  44. data/lib/jekyll/filters.rb +72 -31
  45. data/lib/jekyll/frontmatter_defaults.rb +35 -19
  46. data/lib/jekyll/hooks.rb +2 -3
  47. data/lib/jekyll/liquid_extensions.rb +0 -2
  48. data/lib/jekyll/liquid_renderer/file.rb +14 -3
  49. data/lib/jekyll/liquid_renderer/table.rb +67 -65
  50. data/lib/jekyll/liquid_renderer.rb +13 -1
  51. data/lib/jekyll/log_adapter.rb +5 -1
  52. data/lib/jekyll/mime.types +80 -195
  53. data/lib/jekyll/page.rb +10 -26
  54. data/lib/jekyll/page_without_a_file.rb +0 -4
  55. data/lib/jekyll/plugin.rb +5 -11
  56. data/lib/jekyll/plugin_manager.rb +2 -0
  57. data/lib/jekyll/reader.rb +38 -8
  58. data/lib/jekyll/readers/data_reader.rb +5 -5
  59. data/lib/jekyll/readers/layout_reader.rb +2 -12
  60. data/lib/jekyll/readers/post_reader.rb +29 -17
  61. data/lib/jekyll/readers/static_file_reader.rb +1 -1
  62. data/lib/jekyll/readers/theme_assets_reader.rb +7 -5
  63. data/lib/jekyll/regenerator.rb +4 -12
  64. data/lib/jekyll/renderer.rb +14 -25
  65. data/lib/jekyll/site.rb +78 -34
  66. data/lib/jekyll/static_file.rb +47 -11
  67. data/lib/jekyll/stevenson.rb +7 -5
  68. data/lib/jekyll/tags/highlight.rb +22 -52
  69. data/lib/jekyll/tags/include.rb +27 -48
  70. data/lib/jekyll/tags/link.rb +11 -7
  71. data/lib/jekyll/tags/post_url.rb +17 -16
  72. data/lib/jekyll/theme.rb +12 -23
  73. data/lib/jekyll/theme_builder.rb +91 -89
  74. data/lib/jekyll/url.rb +3 -2
  75. data/lib/jekyll/utils/ansi.rb +1 -1
  76. data/lib/jekyll/utils/exec.rb +0 -1
  77. data/lib/jekyll/utils/internet.rb +2 -4
  78. data/lib/jekyll/utils/platforms.rb +8 -8
  79. data/lib/jekyll/utils/thread_event.rb +1 -5
  80. data/lib/jekyll/utils/win_tz.rb +47 -18
  81. data/lib/jekyll/utils.rb +5 -4
  82. data/lib/jekyll/version.rb +1 -1
  83. data/lib/jekyll.rb +5 -0
  84. data/lib/site_template/.gitignore +2 -0
  85. data/lib/site_template/404.html +1 -0
  86. data/lib/site_template/_config.yml +17 -5
  87. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +5 -1
  88. data/lib/theme_template/gitignore.erb +1 -0
  89. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -0
  90. metadata +75 -48
  91. data/lib/jekyll/commands/serve/mime_types_charset.json +0 -71
  92. data/lib/jekyll/converters/markdown/rdiscount_parser.rb +0 -37
  93. data/lib/jekyll/converters/markdown/redcarpet_parser.rb +0 -112
  94. data/lib/jekyll/utils/rouge.rb +0 -22
  95. /data/lib/site_template/{about.md → about.markdown} +0 -0
  96. /data/lib/site_template/{index.md → index.markdown} +0 -0
data/lib/jekyll/page.rb CHANGED
@@ -11,8 +11,6 @@ module Jekyll
11
11
 
12
12
  alias_method :extname, :ext
13
13
 
14
- FORWARD_SLASH = "/".freeze
15
-
16
14
  # Attributes for Liquid templates
17
15
  ATTRIBUTES_FOR_LIQUID = %w(
18
16
  content
@@ -52,7 +50,7 @@ module Jekyll
52
50
  read_yaml(File.join(base, dir), name)
53
51
 
54
52
  data.default_proc = proc do |_, key|
55
- site.frontmatter_defaults.find(File.join(dir, name), type, key)
53
+ site.frontmatter_defaults.find(relative_path, type, key)
56
54
  end
57
55
 
58
56
  Jekyll::Hooks.trigger :pages, :post_init, self
@@ -64,11 +62,11 @@ module Jekyll
64
62
  #
65
63
  # Returns the String destination directory.
66
64
  def dir
67
- if url.end_with?(FORWARD_SLASH)
65
+ if url.end_with?("/")
68
66
  url
69
67
  else
70
68
  url_dir = File.dirname(url)
71
- url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/"
69
+ url_dir.end_with?("/") ? url_dir : "#{url_dir}/"
72
70
  end
73
71
  end
74
72
 
@@ -97,11 +95,11 @@ module Jekyll
97
95
  #
98
96
  # Returns the String url.
99
97
  def url
100
- @url ||= URL.new({
98
+ @url ||= URL.new(
101
99
  :template => template,
102
100
  :placeholders => url_placeholders,
103
- :permalink => permalink,
104
- }).to_s
101
+ :permalink => permalink
102
+ ).to_s
105
103
  end
106
104
 
107
105
  # Returns a hash of URL placeholder names (as symbols) mapping to the
@@ -118,10 +116,11 @@ module Jekyll
118
116
  #
119
117
  # name - The String filename of the page file.
120
118
  #
119
+ # NOTE: `String#gsub` removes all trailing periods (in comparison to `String#chomp`)
121
120
  # Returns nothing.
122
121
  def process(name)
123
122
  self.ext = File.extname(name)
124
- self.basename = name[0..-ext.length - 1]
123
+ self.basename = name[0..-ext.length - 1].gsub(%r!\.*\z!, "")
125
124
  end
126
125
 
127
126
  # Add any necessary layouts to this post
@@ -146,7 +145,7 @@ module Jekyll
146
145
 
147
146
  # The path to the page source file, relative to the site source
148
147
  def relative_path
149
- File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r!\A\/!, "")
148
+ @relative_path ||= File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r!\A\/!, "")
150
149
  end
151
150
 
152
151
  # Obtain destination path.
@@ -163,7 +162,7 @@ module Jekyll
163
162
 
164
163
  # Returns the object as a debug String.
165
164
  def inspect
166
- "#<Jekyll::Page @name=#{name.inspect}>"
165
+ "#<#{self.class} @relative_path=#{relative_path.inspect}>"
167
166
  end
168
167
 
169
168
  # Returns the Boolean of whether this Page is HTML or not.
@@ -183,20 +182,5 @@ module Jekyll
183
182
  def write?
184
183
  true
185
184
  end
186
-
187
- # The Page excerpt_separator, from the YAML Front-Matter or site
188
- # default excerpt_separator value
189
- #
190
- # Returns the document excerpt_separator
191
- def excerpt_separator
192
- (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s
193
- end
194
-
195
- # Whether to generate an excerpt
196
- #
197
- # Returns true if the excerpt separator is configured.
198
- def generate_excerpt?
199
- !excerpt_separator.empty?
200
- end
201
185
  end
202
186
  end
@@ -10,9 +10,5 @@ module Jekyll
10
10
  def read_yaml(*)
11
11
  @data ||= {}
12
12
  end
13
-
14
- def inspect
15
- "#<Jekyll:PageWithoutAFile @name=#{name.inspect}>"
16
- end
17
13
  end
18
14
  end
data/lib/jekyll/plugin.rb CHANGED
@@ -13,7 +13,7 @@ module Jekyll
13
13
  #
14
14
 
15
15
  def self.inherited(const)
16
- return catch_inheritance(const) do |const_|
16
+ catch_inheritance(const) do |const_|
17
17
  catch_inheritance(const_)
18
18
  end
19
19
  end
@@ -23,9 +23,7 @@ module Jekyll
23
23
  def self.catch_inheritance(const)
24
24
  const.define_singleton_method :inherited do |const_|
25
25
  (@children ||= Set.new).add const_
26
- if block_given?
27
- yield const_
28
- end
26
+ yield const_ if block_given?
29
27
  end
30
28
  end
31
29
 
@@ -48,9 +46,7 @@ module Jekyll
48
46
  # Returns the Symbol priority.
49
47
  def self.priority(priority = nil)
50
48
  @priority ||= nil
51
- if priority && PRIORITIES.key?(priority)
52
- @priority = priority
53
- end
49
+ @priority = priority if priority && PRIORITIES.key?(priority)
54
50
  @priority || :normal
55
51
  end
56
52
 
@@ -62,9 +58,7 @@ module Jekyll
62
58
  #
63
59
  # Returns the safety Boolean.
64
60
  def self.safe(safe = nil)
65
- unless defined?(@safe) && safe.nil?
66
- @safe = safe
67
- end
61
+ @safe = safe unless defined?(@safe) && safe.nil?
68
62
  @safe || false
69
63
  end
70
64
 
@@ -74,7 +68,7 @@ module Jekyll
74
68
  #
75
69
  # Returns -1, 0, 1.
76
70
  def self.<=>(other)
77
- PRIORITIES[other.priority] <=> PRIORITIES[self.priority]
71
+ PRIORITIES[other.priority] <=> PRIORITIES[priority]
78
72
  end
79
73
 
80
74
  # Spaceship is priority [higher -> lower]
@@ -37,8 +37,10 @@ module Jekyll
37
37
  # Returns false only if no dependencies have been specified, otherwise nothing.
38
38
  def require_theme_deps
39
39
  return false unless site.theme.runtime_dependencies
40
+
40
41
  site.theme.runtime_dependencies.each do |dep|
41
42
  next if dep.name == "jekyll"
43
+
42
44
  External.require_with_graceful_fail(dep.name) if plugin_allowed?(dep.name)
43
45
  end
44
46
  end
data/lib/jekyll/reader.rb CHANGED
@@ -14,6 +14,7 @@ module Jekyll
14
14
  def read
15
15
  @site.layouts = LayoutReader.new(site).read
16
16
  read_directories
17
+ read_included_excludes
17
18
  sort_files!
18
19
  @site.data = DataReader.new(site).read(site.config["data_dir"])
19
20
  CollectionReader.new(site).read
@@ -39,13 +40,21 @@ module Jekyll
39
40
 
40
41
  return unless File.directory?(base)
41
42
 
43
+ dot_dirs = []
44
+ dot_pages = []
45
+ dot_static_files = []
46
+
42
47
  dot = Dir.chdir(base) { filter_entries(Dir.entries("."), base) }
43
- dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) }
44
- dot_files = (dot - dot_dirs)
45
- dot_pages = dot_files.select do |file|
46
- Utils.has_yaml_header?(@site.in_source_dir(base, file))
48
+ dot.each do |entry|
49
+ file_path = @site.in_source_dir(base, entry)
50
+ if File.directory?(file_path)
51
+ dot_dirs << entry
52
+ elsif Utils.has_yaml_header?(file_path)
53
+ dot_pages << entry
54
+ else
55
+ dot_static_files << entry
56
+ end
47
57
  end
48
- dot_static_files = dot_files - dot_pages
49
58
 
50
59
  retrieve_posts(dir)
51
60
  retrieve_dirs(base, dir, dot_dirs)
@@ -61,6 +70,7 @@ module Jekyll
61
70
  # Returns nothing.
62
71
  def retrieve_posts(dir)
63
72
  return if outside_configured_directory?(dir)
73
+
64
74
  site.posts.docs.concat(post_reader.read_posts(dir))
65
75
  site.posts.docs.concat(post_reader.read_drafts(dir)) if site.show_drafts
66
76
  end
@@ -76,9 +86,7 @@ module Jekyll
76
86
  dot_dirs.each do |file|
77
87
  dir_path = site.in_source_dir(dir, file)
78
88
  rel_path = File.join(dir, file)
79
- unless @site.dest.chomp("/") == dir_path
80
- @site.reader.read_directories(rel_path)
81
- end
89
+ @site.reader.read_directories(rel_path) unless @site.dest.chomp("/") == dir_path
82
90
  end
83
91
  end
84
92
 
@@ -126,6 +134,7 @@ module Jekyll
126
134
  def get_entries(dir, subfolder)
127
135
  base = site.in_source_dir(dir, subfolder)
128
136
  return [] unless File.exist?(base)
137
+
129
138
  entries = Dir.chdir(base) { filter_entries(Dir["**/*"], base) }
130
139
  entries.delete_if { |e| File.directory?(site.in_source_dir(base, e)) }
131
140
  end
@@ -150,5 +159,26 @@ module Jekyll
150
159
  def post_reader
151
160
  @post_reader ||= PostReader.new(site)
152
161
  end
162
+
163
+ def read_included_excludes
164
+ site.include.each do |entry|
165
+ next if entry == ".htaccess"
166
+
167
+ entry_path = site.in_source_dir(entry)
168
+ next if File.directory?(entry_path)
169
+
170
+ read_included_file(entry_path) if File.file?(entry_path)
171
+ end
172
+ end
173
+
174
+ def read_included_file(entry_path)
175
+ dir = File.dirname(entry_path).sub(site.source, "")
176
+ file = Array(File.basename(entry_path))
177
+ if Utils.has_yaml_header?(entry_path)
178
+ site.pages.concat(PageReader.new(site, dir).read(file))
179
+ else
180
+ site.static_files.concat(StaticFileReader.new(site, dir).read(file))
181
+ end
182
+ end
153
183
  end
154
184
  end
@@ -55,13 +55,13 @@ module Jekyll
55
55
  case File.extname(path).downcase
56
56
  when ".csv"
57
57
  CSV.read(path,
58
- :headers => true,
59
- :encoding => site.config["encoding"]).map(&:to_hash)
58
+ :headers => true,
59
+ :encoding => site.config["encoding"]).map(&:to_hash)
60
60
  when ".tsv"
61
61
  CSV.read(path,
62
- :col_sep => "\t",
63
- :headers => true,
64
- :encoding => site.config["encoding"]).map(&:to_hash)
62
+ :col_sep => "\t",
63
+ :headers => true,
64
+ :encoding => site.config["encoding"]).map(&:to_hash)
65
65
  else
66
66
  SafeYAML.load_file(path)
67
67
  end
@@ -23,7 +23,7 @@ module Jekyll
23
23
  end
24
24
 
25
25
  def layout_directory
26
- @layout_directory ||= (layout_directory_in_cwd || layout_directory_inside_source)
26
+ @layout_directory ||= site.in_source_dir(site.config["layouts_dir"])
27
27
  end
28
28
 
29
29
  def theme_layout_directory
@@ -54,18 +54,8 @@ module Jekyll
54
54
 
55
55
  def within(directory)
56
56
  return unless File.exist?(directory)
57
- Dir.chdir(directory) { yield }
58
- end
59
-
60
- def layout_directory_inside_source
61
- site.in_source_dir(site.config["layouts_dir"])
62
- end
63
57
 
64
- def layout_directory_in_cwd
65
- dir = Jekyll.sanitized_path(Dir.pwd, site.config["layouts_dir"])
66
- if File.directory?(dir) && !site.safe
67
- dir
68
- end
58
+ Dir.chdir(directory) { yield }
69
59
  end
70
60
  end
71
61
  end
@@ -34,19 +34,9 @@ module Jekyll
34
34
  #
35
35
  # Returns nothing.
36
36
  def read_publishable(dir, magic_dir, matcher)
37
- read_content(dir, magic_dir, matcher).tap { |docs| docs.each(&:read) }
38
- .select do |doc|
39
- if doc.content.valid_encoding?
40
- site.publisher.publish?(doc).tap do |will_publish|
41
- if !will_publish && site.publisher.hidden_in_the_future?(doc)
42
- Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date"
43
- end
44
- end
45
- else
46
- Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is not valid UTF-8"
47
- false
48
- end
49
- end
37
+ read_content(dir, magic_dir, matcher)
38
+ .tap { |docs| docs.each(&:read) }
39
+ .select { |doc| processable?(doc) }
50
40
  end
51
41
 
52
42
  # Read all the content files from <source>/<dir>/magic_dir
@@ -61,12 +51,34 @@ module Jekyll
61
51
  def read_content(dir, magic_dir, matcher)
62
52
  @site.reader.get_entries(dir, magic_dir).map do |entry|
63
53
  next unless entry =~ matcher
54
+
64
55
  path = @site.in_source_dir(File.join(dir, magic_dir, entry))
65
- Document.new(path, {
66
- :site => @site,
67
- :collection => @site.posts,
68
- })
56
+ Document.new(path,
57
+ :site => @site,
58
+ :collection => @site.posts)
69
59
  end.reject(&:nil?)
70
60
  end
61
+
62
+ private
63
+
64
+ def processable?(doc)
65
+ if doc.content.nil?
66
+ Jekyll.logger.debug "Skipping:", "Content in #{doc.relative_path} is nil"
67
+ false
68
+ elsif !doc.content.valid_encoding?
69
+ Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is not valid UTF-8"
70
+ false
71
+ else
72
+ publishable?(doc)
73
+ end
74
+ end
75
+
76
+ def publishable?(doc)
77
+ site.publisher.publish?(doc).tap do |will_publish|
78
+ if !will_publish && site.publisher.hidden_in_the_future?(doc)
79
+ Jekyll.logger.warn "Skipping:", "#{doc.relative_path} has a future date"
80
+ end
81
+ end
82
+ end
71
83
  end
72
84
  end
@@ -16,7 +16,7 @@ module Jekyll
16
16
  #
17
17
  # Returns an array of static files.
18
18
  def read(files)
19
- files.map do |file|
19
+ files.each do |file|
20
20
  @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file)
21
21
  end
22
22
  @unfiltered_content
@@ -8,10 +8,11 @@ module Jekyll
8
8
  end
9
9
 
10
10
  def read
11
- return unless site.theme && site.theme.assets_path
11
+ return unless site.theme&.assets_path
12
12
 
13
13
  Find.find(site.theme.assets_path) do |path|
14
14
  next if File.directory?(path)
15
+
15
16
  if File.symlink?(path)
16
17
  Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}"
17
18
  else
@@ -21,6 +22,7 @@ module Jekyll
21
22
  end
22
23
 
23
24
  private
25
+
24
26
  def read_theme_asset(path)
25
27
  base = site.theme.root
26
28
  dir = File.dirname(path.sub("#{site.theme.root}/", ""))
@@ -28,18 +30,18 @@ module Jekyll
28
30
 
29
31
  if Utils.has_yaml_header?(path)
30
32
  append_unless_exists site.pages,
31
- Jekyll::Page.new(site, base, dir, name)
33
+ Jekyll::Page.new(site, base, dir, name)
32
34
  else
33
35
  append_unless_exists site.static_files,
34
- Jekyll::StaticFile.new(site, base, "/#{dir}", name)
36
+ Jekyll::StaticFile.new(site, base, "/#{dir}", name)
35
37
  end
36
38
  end
37
39
 
38
40
  def append_unless_exists(haystack, new_item)
39
41
  if haystack.any? { |file| file.relative_path == new_item.relative_path }
40
42
  Jekyll.logger.debug "Theme:",
41
- "Ignoring #{new_item.relative_path} in theme due to existing file " \
42
- "with that path in site."
43
+ "Ignoring #{new_item.relative_path} in theme due to existing file " \
44
+ "with that path in site."
43
45
  return
44
46
  end
45
47
 
@@ -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))
@@ -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.
@@ -101,8 +102,8 @@ module Jekyll
101
102
  converter.convert output
102
103
  rescue StandardError => e
103
104
  Jekyll.logger.error "Conversion error:",
104
- "#{converter.class} encountered an error while "\
105
- "converting '#{document.relative_path}':"
105
+ "#{converter.class} encountered an error while "\
106
+ "converting '#{document.relative_path}':"
106
107
  Jekyll.logger.error("", e.to_s)
107
108
  raise e
108
109
  end
@@ -121,13 +122,13 @@ module Jekyll
121
122
  template = site.liquid_renderer.file(path).parse(content)
122
123
  template.warnings.each do |e|
123
124
  Jekyll.logger.warn "Liquid Warning:",
124
- LiquidRenderer.format_error(e, path || document.relative_path)
125
+ LiquidRenderer.format_error(e, path || document.relative_path)
125
126
  end
126
127
  template.render!(payload, info)
127
128
  # rubocop: disable RescueException
128
129
  rescue Exception => e
129
130
  Jekyll.logger.error "Liquid Exception:",
130
- LiquidRenderer.format_error(e, path || document.relative_path)
131
+ LiquidRenderer.format_error(e, path || document.relative_path)
131
132
  raise e
132
133
  end
133
134
  # rubocop: enable RescueException
@@ -158,19 +159,20 @@ module Jekyll
158
159
  output = render_layout(output, layout, info)
159
160
  add_regenerator_dependencies(layout)
160
161
 
161
- if (layout = site.layouts[layout.data["layout"]])
162
- break if used.include?(layout)
163
- used << layout
164
- end
162
+ next unless (layout = site.layouts[layout.data["layout"]])
163
+ break if used.include?(layout)
164
+
165
+ used << layout
165
166
  end
166
167
  output
167
168
  end
168
169
 
170
+ private
171
+
169
172
  # Checks if the layout specified in the document actually exists
170
173
  #
171
174
  # layout - the layout to check
172
175
  # Returns nothing
173
- private
174
176
  def validate_layout(layout)
175
177
  if invalid_layout?(layout)
176
178
  Jekyll.logger.warn(
@@ -187,7 +189,6 @@ module Jekyll
187
189
  # Render layout content into document.output
188
190
  #
189
191
  # Returns String rendered content
190
- private
191
192
  def render_layout(output, layout, info)
192
193
  payload["content"] = output
193
194
  payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
@@ -200,9 +201,9 @@ module Jekyll
200
201
  )
201
202
  end
202
203
 
203
- private
204
204
  def add_regenerator_dependencies(layout)
205
205
  return unless document.write?
206
+
206
207
  site.regenerator.add_dependency(
207
208
  site.in_source_dir(document.path),
208
209
  layout.path
@@ -212,18 +213,14 @@ module Jekyll
212
213
  # Set page content to payload and assign pager if document has one.
213
214
  #
214
215
  # Returns nothing
215
- private
216
216
  def assign_pages!
217
217
  payload["page"] = document.to_liquid
218
- payload["paginator"] = if document.respond_to?(:pager)
219
- document.pager.to_liquid
220
- end
218
+ payload["paginator"] = (document.pager.to_liquid if document.respond_to?(:pager))
221
219
  end
222
220
 
223
221
  # Set related posts to payload if document is a post.
224
222
  #
225
223
  # Returns nothing
226
- private
227
224
  def assign_current_document!
228
225
  payload["site"].current_document = document
229
226
  end
@@ -231,21 +228,16 @@ module Jekyll
231
228
  # Set highlighter prefix and suffix
232
229
  #
233
230
  # Returns nothing
234
- private
235
231
  def assign_highlighter_options!
236
232
  payload["highlighter_prefix"] = converters.first.highlighter_prefix
237
233
  payload["highlighter_suffix"] = converters.first.highlighter_suffix
238
234
  end
239
235
 
240
- private
241
236
  def assign_layout_data!
242
237
  layout = layouts[document.data["layout"]]
243
- if layout
244
- payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
245
- end
238
+ payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) if layout
246
239
  end
247
240
 
248
- private
249
241
  def permalink_ext
250
242
  document_permalink = document.permalink
251
243
  if document_permalink && !document_permalink.end_with?("/")
@@ -254,7 +246,6 @@ module Jekyll
254
246
  end
255
247
  end
256
248
 
257
- private
258
249
  def converter_output_ext
259
250
  if output_exts.size == 1
260
251
  output_exts.last
@@ -263,14 +254,12 @@ module Jekyll
263
254
  end
264
255
  end
265
256
 
266
- private
267
257
  def output_exts
268
258
  @output_exts ||= converters.map do |c|
269
259
  c.output_ext(document.extname)
270
260
  end.compact
271
261
  end
272
262
 
273
- private
274
263
  def liquid_options
275
264
  @liquid_options ||= site.config["liquid"]
276
265
  end