jekyll 3.2.0.pre.beta1 → 3.2.0.pre.beta2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of jekyll might be problematic. Click here for more details.

Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +17 -95
  3. data/README.markdown +6 -4
  4. data/{bin → exe}/jekyll +18 -14
  5. data/lib/jekyll.rb +79 -76
  6. data/lib/jekyll/collection.rb +32 -16
  7. data/lib/jekyll/command.rb +17 -13
  8. data/lib/jekyll/commands/build.rb +7 -2
  9. data/lib/jekyll/commands/doctor.rb +3 -1
  10. data/lib/jekyll/commands/new.rb +3 -0
  11. data/lib/jekyll/commands/new_theme.rb +7 -4
  12. data/lib/jekyll/commands/serve.rb +2 -0
  13. data/lib/jekyll/commands/serve/servlet.rb +2 -2
  14. data/lib/jekyll/configuration.rb +187 -125
  15. data/lib/jekyll/converters/markdown.rb +19 -9
  16. data/lib/jekyll/converters/markdown/kramdown_parser.rb +12 -5
  17. data/lib/jekyll/converters/markdown/rdiscount_parser.rb +4 -4
  18. data/lib/jekyll/converters/markdown/redcarpet_parser.rb +90 -84
  19. data/lib/jekyll/convertible.rb +34 -21
  20. data/lib/jekyll/deprecator.rb +11 -6
  21. data/lib/jekyll/document.rb +52 -50
  22. data/lib/jekyll/drops/document_drop.rb +40 -5
  23. data/lib/jekyll/drops/drop.rb +49 -10
  24. data/lib/jekyll/drops/excerpt_drop.rb +15 -0
  25. data/lib/jekyll/drops/jekyll_drop.rb +12 -0
  26. data/lib/jekyll/drops/site_drop.rb +4 -2
  27. data/lib/jekyll/drops/url_drop.rb +4 -4
  28. data/lib/jekyll/entry_filter.rb +9 -6
  29. data/lib/jekyll/errors.rb +4 -3
  30. data/lib/jekyll/excerpt.rb +4 -6
  31. data/lib/jekyll/external.rb +4 -4
  32. data/lib/jekyll/filters.rb +67 -34
  33. data/lib/jekyll/frontmatter_defaults.rb +45 -38
  34. data/lib/jekyll/hooks.rb +21 -21
  35. data/lib/jekyll/layout.rb +3 -1
  36. data/lib/jekyll/liquid_renderer.rb +7 -3
  37. data/lib/jekyll/liquid_renderer/file.rb +1 -1
  38. data/lib/jekyll/liquid_renderer/table.rb +11 -11
  39. data/lib/jekyll/log_adapter.rb +2 -2
  40. data/lib/jekyll/page.rb +10 -10
  41. data/lib/jekyll/plugin.rb +5 -5
  42. data/lib/jekyll/plugin_manager.rb +12 -8
  43. data/lib/jekyll/publisher.rb +1 -1
  44. data/lib/jekyll/reader.rb +11 -7
  45. data/lib/jekyll/readers/data_reader.rb +9 -9
  46. data/lib/jekyll/readers/layout_reader.rb +7 -7
  47. data/lib/jekyll/readers/page_reader.rb +3 -1
  48. data/lib/jekyll/readers/post_reader.rb +9 -10
  49. data/lib/jekyll/readers/static_file_reader.rb +3 -1
  50. data/lib/jekyll/regenerator.rb +50 -28
  51. data/lib/jekyll/related_posts.rb +1 -1
  52. data/lib/jekyll/renderer.rb +29 -20
  53. data/lib/jekyll/site.rb +92 -50
  54. data/lib/jekyll/static_file.rb +33 -26
  55. data/lib/jekyll/stevenson.rb +6 -5
  56. data/lib/jekyll/tags/highlight.rb +50 -35
  57. data/lib/jekyll/tags/include.rb +42 -31
  58. data/lib/jekyll/tags/link.rb +11 -4
  59. data/lib/jekyll/tags/post_url.rb +8 -7
  60. data/lib/jekyll/theme.rb +4 -3
  61. data/lib/jekyll/theme_builder.rb +18 -6
  62. data/lib/jekyll/url.rb +21 -14
  63. data/lib/jekyll/utils.rb +57 -28
  64. data/lib/jekyll/utils/ansi.rb +9 -9
  65. data/lib/jekyll/utils/platforms.rb +2 -2
  66. data/lib/jekyll/version.rb +1 -1
  67. data/lib/site_template/_config.yml +2 -0
  68. data/lib/site_template/css/main.scss +3 -17
  69. data/lib/theme_template/_layouts/default.html +1 -0
  70. data/lib/theme_template/_layouts/page.html +5 -0
  71. data/lib/theme_template/_layouts/post.html +5 -0
  72. data/lib/theme_template/example/_post.md +1 -2
  73. data/lib/theme_template/example/index.html +2 -2
  74. data/lib/theme_template/gitignore.erb +4 -0
  75. data/lib/theme_template/theme.gemspec.erb +2 -6
  76. metadata +10 -18
  77. data/lib/site_template/_includes/footer.html +0 -38
  78. data/lib/site_template/_includes/head.html +0 -12
  79. data/lib/site_template/_includes/header.html +0 -27
  80. data/lib/site_template/_includes/icon-github.html +0 -1
  81. data/lib/site_template/_includes/icon-github.svg +0 -1
  82. data/lib/site_template/_includes/icon-twitter.html +0 -1
  83. data/lib/site_template/_includes/icon-twitter.svg +0 -1
  84. data/lib/site_template/_layouts/default.html +0 -20
  85. data/lib/site_template/_layouts/page.html +0 -14
  86. data/lib/site_template/_layouts/post.html +0 -15
  87. data/lib/site_template/_sass/_base.scss +0 -200
  88. data/lib/site_template/_sass/_layout.scss +0 -242
  89. data/lib/site_template/_sass/_syntax-highlighting.scss +0 -71
@@ -9,23 +9,33 @@ module Jekyll
9
9
  return if @setup ||= false
10
10
  unless (@parser = get_processor)
11
11
  Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"]
12
- Jekyll.logger.info "", "Custom processors are not loaded in safe mode" if @config["safe"]
13
- Jekyll.logger.error "", "Available processors are: #{valid_processors.join(", ")}"
12
+ if @config["safe"]
13
+ Jekyll.logger.info "", "Custom processors are not loaded in safe mode"
14
+ end
15
+ Jekyll.logger.error(
16
+ "",
17
+ "Available processors are: #{valid_processors.join(", ")}"
18
+ )
14
19
  raise Errors::FatalException, "Bailing out; invalid Markdown processor."
15
20
  end
16
21
 
17
22
  @setup = true
18
23
  end
19
24
 
25
+ # Rubocop does not allow reader methods to have names starting with `get_`
26
+ # To ensure compatibility, this check has been disabled on this method
27
+ #
28
+ # rubocop:disable Style/AccessorMethodName
20
29
  def get_processor
21
30
  case @config["markdown"].downcase
22
31
  when "redcarpet" then return RedcarpetParser.new(@config)
23
32
  when "kramdown" then return KramdownParser.new(@config)
24
33
  when "rdiscount" then return RDiscountParser.new(@config)
25
34
  else
26
- get_custom_processor
35
+ custom_processor
27
36
  end
28
37
  end
38
+ # rubocop:enable Style/AccessorMethodName
29
39
 
30
40
  # Public: Provides you with a list of processors, the ones we
31
41
  # support internally and the ones that you have provided to us (if you
@@ -41,13 +51,13 @@ module Jekyll
41
51
 
42
52
  def third_party_processors
43
53
  self.class.constants - \
44
- %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map(
45
- &:to_sym
46
- )
54
+ %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map(
55
+ &:to_sym
56
+ )
47
57
  end
48
58
 
49
59
  def extname_list
50
- @extname_list ||= @config['markdown_ext'].split(',').map do |e|
60
+ @extname_list ||= @config["markdown_ext"].split(",").map do |e|
51
61
  ".#{e.downcase}"
52
62
  end
53
63
  end
@@ -66,7 +76,7 @@ module Jekyll
66
76
  end
67
77
 
68
78
  private
69
- def get_custom_processor
79
+ def custom_processor
70
80
  converter_name = @config["markdown"]
71
81
  if custom_class_allowed?(converter_name)
72
82
  self.class.const_get(converter_name).new(@config)
@@ -83,7 +93,7 @@ module Jekyll
83
93
 
84
94
  private
85
95
  def custom_class_allowed?(parser_name)
86
- parser_name !~ /[^A-Za-z0-9_]/ && self.class.constants.include?(
96
+ parser_name !~ %r![^A-Za-z0-9_]! && self.class.constants.include?(
87
97
  parser_name.to_sym
88
98
  )
89
99
  end
@@ -24,7 +24,8 @@ module Jekyll
24
24
 
25
25
  # Setup and normalize the configuration:
26
26
  # * Create Kramdown if it doesn't exist.
27
- # * Set syntax_highlighter, detecting enable_coderay and merging highlighter if none.
27
+ # * Set syntax_highlighter, detecting enable_coderay and merging
28
+ # highlighter if none.
28
29
  # * Merge kramdown[coderay] into syntax_highlighter_opts stripping coderay_.
29
30
  # * Make sure `syntax_highlighter_opts` exists.
30
31
 
@@ -52,7 +53,9 @@ module Jekyll
52
53
  end
53
54
  end
54
55
 
55
- # config[kramdown][syntax_higlighter] > config[kramdown][enable_coderay] > config[highlighter]
56
+ # config[kramdown][syntax_higlighter] >
57
+ # config[kramdown][enable_coderay] >
58
+ # config[highlighter]
56
59
  # Where `enable_coderay` is now deprecated because Kramdown
57
60
  # supports Rouge now too.
58
61
 
@@ -68,8 +71,10 @@ module Jekyll
68
71
 
69
72
  @highlighter = begin
70
73
  if @config.key?("enable_coderay") && @config["enable_coderay"]
71
- Jekyll::Deprecator.deprecation_message "You are using 'enable_coderay', " \
74
+ Jekyll::Deprecator.deprecation_message(
75
+ "You are using 'enable_coderay', " \
72
76
  "use syntax_highlighter: coderay in your configuration file."
77
+ )
73
78
 
74
79
  "coderay"
75
80
  else
@@ -81,7 +86,7 @@ module Jekyll
81
86
  private
82
87
  def strip_coderay_prefix(hash)
83
88
  hash.each_with_object({}) do |(key, val), hsh|
84
- cleaned_key = key.gsub(/\Acoderay_/, "")
89
+ cleaned_key = key.gsub(%r!\Acoderay_!, "")
85
90
 
86
91
  if key != cleaned_key
87
92
  Jekyll::Deprecator.deprecation_message(
@@ -100,8 +105,10 @@ module Jekyll
100
105
  private
101
106
  def modernize_coderay_config
102
107
  if highlighter == "coderay"
103
- Jekyll::Deprecator.deprecation_message "You are using 'kramdown.coderay' in your configuration, " \
108
+ Jekyll::Deprecator.deprecation_message(
109
+ "You are using 'kramdown.coderay' in your configuration, " \
104
110
  "please use 'syntax_highlighter_opts' instead."
111
+ )
105
112
 
106
113
  @config["syntax_highlighter_opts"] = begin
107
114
  strip_coderay_prefix(
@@ -5,14 +5,14 @@ module Jekyll
5
5
  def initialize(config)
6
6
  Jekyll::External.require_with_graceful_fail "rdiscount"
7
7
  @config = config
8
- @rdiscount_extensions = @config['rdiscount']['extensions'].map(&:to_sym)
8
+ @rdiscount_extensions = @config["rdiscount"]["extensions"].map(&:to_sym)
9
9
  end
10
10
 
11
11
  def convert(content)
12
12
  rd = RDiscount.new(content, *@rdiscount_extensions)
13
13
  html = rd.to_html
14
- if @config['rdiscount']['toc_token']
15
- html = replace_generated_toc(rd, html, @config['rdiscount']['toc_token'])
14
+ if @config["rdiscount"]["toc_token"]
15
+ html = replace_generated_toc(rd, html, @config["rdiscount"]["toc_token"])
16
16
  end
17
17
  html
18
18
  end
@@ -21,7 +21,7 @@ module Jekyll
21
21
  def replace_generated_toc(rd, html, toc_token)
22
22
  if rd.generate_toc && html.include?(toc_token)
23
23
  utf8_toc = rd.toc_content
24
- utf8_toc.force_encoding('utf-8') if utf8_toc.respond_to?(:force_encoding)
24
+ utf8_toc.force_encoding("utf-8") if utf8_toc.respond_to?(:force_encoding)
25
25
  html.gsub(toc_token, utf8_toc)
26
26
  else
27
27
  html
@@ -1,102 +1,108 @@
1
- module Jekyll
2
- module Converters
3
- class Markdown
4
- class RedcarpetParser
5
- module CommonMethods
6
- def add_code_tags(code, lang)
7
- code = code.to_s
8
- code = code.sub(/<pre>/, "<pre><code class=\"language-#{lang}\" data-lang=\"#{lang}\">")
9
- code = code.sub(/<\/pre>/, "</code></pre>")
10
- code
11
- end
12
- end
13
-
14
- module WithPygments
15
- include CommonMethods
16
- def block_code(code, lang)
17
- Jekyll::External.require_with_graceful_fail("pygments")
18
- lang = lang && lang.split.first || "text"
19
- add_code_tags(
20
- Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),
21
- lang
22
- )
23
- end
24
- end
1
+ class Jekyll::Converters::Markdown::RedcarpetParser
2
+ module CommonMethods
3
+ def add_code_tags(code, lang)
4
+ code = code.to_s
5
+ code = code.sub(
6
+ %r!<pre>!,
7
+ "<pre><code class=\"language-#{lang}\" data-lang=\"#{lang}\">"
8
+ )
9
+ code = code.sub(%r!</pre>!, "</code></pre>")
10
+ code
11
+ end
12
+ end
25
13
 
26
- module WithoutHighlighting
27
- require 'cgi'
14
+ module WithPygments
15
+ include CommonMethods
16
+ def block_code(code, lang)
17
+ Jekyll::External.require_with_graceful_fail("pygments")
18
+ lang = lang && lang.split.first || "text"
19
+ add_code_tags(
20
+ Pygments.highlight(
21
+ code,
22
+ {
23
+ :lexer => lang,
24
+ :options => { :encoding => "utf-8" }
25
+ }
26
+ ),
27
+ lang
28
+ )
29
+ end
30
+ end
28
31
 
29
- include CommonMethods
32
+ module WithoutHighlighting
33
+ require "cgi"
30
34
 
31
- def code_wrap(code)
32
- "<figure class=\"highlight\"><pre>#{CGI::escapeHTML(code)}</pre></figure>"
33
- end
35
+ include CommonMethods
34
36
 
35
- def block_code(code, lang)
36
- lang = lang && lang.split.first || "text"
37
- add_code_tags(code_wrap(code), lang)
38
- end
39
- end
37
+ def code_wrap(code)
38
+ "<figure class=\"highlight\"><pre>#{CGI.escapeHTML(code)}</pre></figure>"
39
+ end
40
40
 
41
- module WithRouge
42
- def block_code(code, lang)
43
- code = "<pre>#{super}</pre>"
41
+ def block_code(code, lang)
42
+ lang = lang && lang.split.first || "text"
43
+ add_code_tags(code_wrap(code), lang)
44
+ end
45
+ end
44
46
 
45
- output = "<div class=\"highlight\">"
46
- output << add_code_tags(code, lang)
47
- output << "</div>"
48
- end
47
+ module WithRouge
48
+ def block_code(code, lang)
49
+ code = "<pre>#{super}</pre>"
49
50
 
50
- protected
51
- def rouge_formatter(_lexer)
52
- Rouge::Formatters::HTML.new(:wrap => false)
53
- end
54
- end
51
+ output = "<div class=\"highlight\">"
52
+ output << add_code_tags(code, lang)
53
+ output << "</div>"
54
+ end
55
55
 
56
- def initialize(config)
57
- External.require_with_graceful_fail("redcarpet")
58
- @config = config
59
- @redcarpet_extensions = {}
60
- @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true }
56
+ protected
57
+ def rouge_formatter(_lexer)
58
+ Rouge::Formatters::HTML.new(:wrap => false)
59
+ end
60
+ end
61
61
 
62
- @renderer ||= class_with_proper_highlighter(@config['highlighter'])
63
- end
62
+ def initialize(config)
63
+ Jekyll::External.require_with_graceful_fail("redcarpet")
64
+ @config = config
65
+ @redcarpet_extensions = {}
66
+ @config["redcarpet"]["extensions"].each do |e|
67
+ @redcarpet_extensions[e.to_sym] = true
68
+ end
64
69
 
65
- def class_with_proper_highlighter(highlighter)
66
- case highlighter
67
- when "pygments"
68
- Class.new(Redcarpet::Render::HTML) do
69
- include WithPygments
70
- end
71
- when "rouge"
72
- Class.new(Redcarpet::Render::HTML) do
73
- Jekyll::External.require_with_graceful_fail(%w(
74
- rouge
75
- rouge/plugins/redcarpet
76
- ))
70
+ @renderer ||= class_with_proper_highlighter(@config["highlighter"])
71
+ end
77
72
 
78
- unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0")
79
- abort "Please install Rouge 1.3.0 or greater and try running Jekyll again."
80
- end
73
+ def class_with_proper_highlighter(highlighter)
74
+ Class.new(Redcarpet::Render::HTML) do
75
+ case highlighter
76
+ when "pygments"
77
+ include WithPygments
78
+ when "rouge"
79
+ Jekyll::External.require_with_graceful_fail(%w(
80
+ rouge rouge/plugins/redcarpet
81
+ ))
81
82
 
82
- include Rouge::Plugins::Redcarpet
83
- include CommonMethods
84
- include WithRouge
85
- end
86
- else
87
- Class.new(Redcarpet::Render::HTML) do
88
- include WithoutHighlighting
89
- end
90
- end
83
+ unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0")
84
+ abort "Please install Rouge 1.3.0 or greater and try running Jekyll again."
91
85
  end
92
86
 
93
- def convert(content)
94
- @redcarpet_extensions[:fenced_code_blocks] = !@redcarpet_extensions[:no_fenced_code_blocks]
95
- @renderer.send :include, Redcarpet::Render::SmartyPants if @redcarpet_extensions[:smart]
96
- markdown = Redcarpet::Markdown.new(@renderer.new(@redcarpet_extensions), @redcarpet_extensions)
97
- markdown.render(content)
98
- end
87
+ include Rouge::Plugins::Redcarpet
88
+ include CommonMethods
89
+ include WithRouge
90
+ else
91
+ include WithoutHighlighting
99
92
  end
100
93
  end
101
94
  end
95
+
96
+ def convert(content)
97
+ @redcarpet_extensions[:fenced_code_blocks] = \
98
+ !@redcarpet_extensions[:no_fenced_code_blocks]
99
+ if @redcarpet_extensions[:smart]
100
+ @renderer.send :include, Redcarpet::Render::SmartyPants
101
+ end
102
+ markdown = Redcarpet::Markdown.new(
103
+ @renderer.new(@redcarpet_extensions),
104
+ @redcarpet_extensions
105
+ )
106
+ markdown.render(content)
107
+ end
102
108
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'set'
3
+ require "set"
4
4
 
5
5
  # Convertible provides methods for converting a pagelike item
6
6
  # from a certain type of markup into actual content
@@ -20,12 +20,12 @@ module Jekyll
20
20
  module Convertible
21
21
  # Returns the contents as a String.
22
22
  def to_s
23
- content || ''
23
+ content || ""
24
24
  end
25
25
 
26
26
  # Whether the file is published or not, as indicated in YAML front-matter
27
27
  def published?
28
- !(data.key?('published') && data['published'] == false)
28
+ !(data.key?("published") && data["published"] == false)
29
29
  end
30
30
 
31
31
  # Read the YAML frontmatter.
@@ -47,7 +47,7 @@ module Jekyll
47
47
  end
48
48
  rescue SyntaxError => e
49
49
  Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}"
50
- rescue Exception => e
50
+ rescue => e
51
51
  Jekyll.logger.warn "Error reading file #{filename}: #{e.message}"
52
52
  end
53
53
 
@@ -61,12 +61,13 @@ module Jekyll
61
61
 
62
62
  def validate_data!(filename)
63
63
  unless self.data.is_a?(Hash)
64
- raise Errors::InvalidYAMLFrontMatterError, "Invalid YAML front matter in #{filename}"
64
+ raise Errors::InvalidYAMLFrontMatterError,
65
+ "Invalid YAML front matter in #{filename}"
65
66
  end
66
67
  end
67
68
 
68
69
  def validate_permalink!(filename)
69
- if self.data['permalink'] && self.data['permalink'].size == 0
70
+ if self.data["permalink"] && self.data["permalink"].empty?
70
71
  raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}"
71
72
  end
72
73
  end
@@ -79,7 +80,10 @@ module Jekyll
79
80
  begin
80
81
  converter.convert output
81
82
  rescue => e
82
- Jekyll.logger.error "Conversion error:", "#{converter.class} encountered an error while converting '#{path}':"
83
+ Jekyll.logger.error(
84
+ "Conversion error:",
85
+ "#{converter.class} encountered an error while converting '#{path}':"
86
+ )
83
87
  Jekyll.logger.error("", e.to_s)
84
88
  raise e
85
89
  end
@@ -112,12 +116,17 @@ module Jekyll
112
116
  def render_liquid(content, payload, info, path)
113
117
  site.liquid_renderer.file(path).parse(content).render!(payload, info)
114
118
  rescue Tags::IncludeTagError => e
115
- Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || self.path}"
119
+ Jekyll.logger.error(
120
+ "Liquid Exception:",
121
+ "#{e.message} in #{e.path}, included in #{path || self.path}"
122
+ )
116
123
  raise e
124
+ # rubocop: disable RescueException
117
125
  rescue Exception => e
118
126
  Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{path || self.path}"
119
127
  raise e
120
128
  end
129
+ # rubocop: enable RescueException
121
130
 
122
131
  # Convert this Convertible's data to a Hash suitable for use by Liquid.
123
132
  #
@@ -168,7 +177,7 @@ module Jekyll
168
177
  #
169
178
  # Returns true if extname == .coffee, false otherwise.
170
179
  def coffeescript_file?
171
- '.coffee'.eql?(ext)
180
+ ".coffee" == ext
172
181
  end
173
182
 
174
183
  # Determine whether the file should be rendered with Liquid.
@@ -205,14 +214,20 @@ module Jekyll
205
214
  # recursively render layouts
206
215
  layout = layouts[data["layout"]]
207
216
 
208
- Jekyll.logger.warn("Build Warning:", "Layout '#{data["layout"]}' requested in #{path} does not exist.") if invalid_layout? layout
217
+ Jekyll.logger.warn(
218
+ "Build Warning:",
219
+ "Layout '#{data["layout"]}' requested in #{path} does not exist."
220
+ ) if invalid_layout? layout
209
221
 
210
222
  used = Set.new([layout])
211
223
 
224
+ # Reset the payload layout data to ensure it starts fresh for each page.
225
+ payload["layout"] = nil
226
+
212
227
  while layout
213
228
  Jekyll.logger.debug "Rendering Layout:", path
214
229
  payload["content"] = output
215
- payload["layout"] = Utils.deep_merge_hashes(payload["layout"] || {}, layout.data)
230
+ payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
216
231
 
217
232
  self.output = render_liquid(layout.content,
218
233
  payload,
@@ -225,12 +240,9 @@ module Jekyll
225
240
  site.in_source_dir(layout.path)
226
241
  )
227
242
 
228
- if layout = layouts[layout.data["layout"]]
229
- if used.include?(layout)
230
- layout = nil # avoid recursive chain
231
- else
232
- used << layout
233
- end
243
+ if (layout = layouts[layout.data["layout"]])
244
+ break if used.include?(layout)
245
+ used << layout
234
246
  end
235
247
  end
236
248
  end
@@ -246,7 +258,10 @@ module Jekyll
246
258
 
247
259
  Jekyll.logger.debug "Pre-Render Hooks:", self.relative_path
248
260
  Jekyll::Hooks.trigger hook_owner, :pre_render, self, payload
249
- info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload["page"] } }
261
+ info = {
262
+ :filters => [Jekyll::Filters],
263
+ :registers => { :site => site, :page => payload["page"] }
264
+ }
250
265
 
251
266
  # render and transform content (this becomes the final content of the object)
252
267
  payload["highlighter_prefix"] = converters.first.highlighter_prefix
@@ -275,9 +290,7 @@ module Jekyll
275
290
  def write(dest)
276
291
  path = destination(dest)
277
292
  FileUtils.mkdir_p(File.dirname(path))
278
- File.open(path, 'wb') do |f|
279
- f.write(output)
280
- end
293
+ File.write(path, output, :mode => "wb")
281
294
  Jekyll::Hooks.trigger hook_owner, :post_write, self
282
295
  end
283
296