bunto 3.0.0 → 3.2.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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +124 -76
  3. data/README.markdown +49 -12
  4. data/{bin → exe}/bunto +18 -14
  5. data/lib/bunto.rb +83 -78
  6. data/lib/bunto/cleaner.rb +10 -8
  7. data/lib/bunto/collection.rb +33 -17
  8. data/lib/bunto/command.rb +19 -13
  9. data/lib/bunto/commands/build.rb +22 -14
  10. data/lib/bunto/commands/clean.rb +9 -8
  11. data/lib/bunto/commands/doctor.rb +10 -8
  12. data/lib/bunto/commands/help.rb +4 -3
  13. data/lib/bunto/commands/new.rb +30 -21
  14. data/lib/bunto/commands/new_theme.rb +36 -0
  15. data/lib/bunto/commands/serve.rb +26 -20
  16. data/lib/bunto/commands/serve/servlet.rb +4 -5
  17. data/lib/bunto/configuration.rb +187 -125
  18. data/lib/bunto/converters/markdown.rb +19 -9
  19. data/lib/bunto/converters/markdown/kramdown_parser.rb +12 -5
  20. data/lib/bunto/converters/markdown/rdiscount_parser.rb +4 -4
  21. data/lib/bunto/converters/markdown/redcarpet_parser.rb +90 -84
  22. data/lib/bunto/convertible.rb +38 -25
  23. data/lib/bunto/deprecator.rb +11 -6
  24. data/lib/bunto/desktop.ini +2 -0
  25. data/lib/bunto/document.rb +53 -51
  26. data/lib/bunto/drops/bunto_drop.rb +12 -0
  27. data/lib/bunto/drops/document_drop.rb +40 -5
  28. data/lib/bunto/drops/drop.rb +49 -10
  29. data/lib/bunto/drops/excerpt_drop.rb +15 -0
  30. data/lib/bunto/drops/site_drop.rb +4 -2
  31. data/lib/bunto/drops/url_drop.rb +4 -4
  32. data/lib/bunto/entry_filter.rb +64 -19
  33. data/lib/bunto/errors.rb +6 -3
  34. data/lib/bunto/excerpt.rb +4 -6
  35. data/lib/bunto/external.rb +4 -4
  36. data/lib/bunto/filters.rb +72 -39
  37. data/lib/bunto/frontmatter_defaults.rb +45 -38
  38. data/lib/bunto/hooks.rb +21 -21
  39. data/lib/bunto/layout.rb +4 -8
  40. data/lib/bunto/liquid_renderer.rb +14 -3
  41. data/lib/bunto/liquid_renderer/file.rb +5 -1
  42. data/lib/bunto/liquid_renderer/table.rb +11 -11
  43. data/lib/bunto/log_adapter.rb +2 -2
  44. data/lib/bunto/page.rb +10 -10
  45. data/lib/bunto/plugin.rb +5 -5
  46. data/lib/bunto/plugin_manager.rb +12 -8
  47. data/lib/bunto/publisher.rb +1 -1
  48. data/lib/bunto/reader.rb +11 -7
  49. data/lib/bunto/readers/data_reader.rb +9 -9
  50. data/lib/bunto/readers/layout_reader.rb +7 -7
  51. data/lib/bunto/readers/page_reader.rb +3 -1
  52. data/lib/bunto/readers/post_reader.rb +9 -10
  53. data/lib/bunto/readers/static_file_reader.rb +3 -1
  54. data/lib/bunto/regenerator.rb +50 -28
  55. data/lib/bunto/related_posts.rb +1 -1
  56. data/lib/bunto/renderer.rb +33 -23
  57. data/lib/bunto/site.rb +94 -51
  58. data/lib/bunto/static_file.rb +33 -26
  59. data/lib/bunto/stevenson.rb +6 -5
  60. data/lib/bunto/tags/highlight.rb +50 -35
  61. data/lib/bunto/tags/include.rb +42 -31
  62. data/lib/bunto/tags/link.rb +11 -4
  63. data/lib/bunto/tags/post_url.rb +8 -7
  64. data/lib/bunto/theme.rb +10 -8
  65. data/lib/bunto/theme_builder.rb +117 -0
  66. data/lib/bunto/url.rb +21 -14
  67. data/lib/bunto/utils.rb +57 -28
  68. data/lib/bunto/utils/ansi.rb +9 -9
  69. data/lib/bunto/utils/platforms.rb +2 -2
  70. data/lib/bunto/version.rb +1 -1
  71. data/lib/site_template/_config.yml +3 -1
  72. data/lib/site_template/_posts/0000-00-00-welcome-to-bunto.markdown.erb +3 -3
  73. data/lib/site_template/about.md +3 -3
  74. data/lib/site_template/css/main.scss +3 -17
  75. data/lib/theme_template/CODE_OF_CONDUCT.md.erb +74 -0
  76. data/lib/theme_template/Gemfile +2 -0
  77. data/lib/theme_template/LICENSE.txt.erb +21 -0
  78. data/lib/theme_template/README.md.erb +48 -0
  79. data/lib/theme_template/_layouts/default.html +1 -0
  80. data/lib/theme_template/_layouts/page.html +5 -0
  81. data/lib/theme_template/_layouts/post.html +5 -0
  82. data/lib/theme_template/example/_config.yml.erb +1 -0
  83. data/lib/theme_template/example/_post.md +12 -0
  84. data/lib/theme_template/example/index.html +14 -0
  85. data/lib/theme_template/example/style.scss +7 -0
  86. data/lib/theme_template/gitignore.erb +4 -0
  87. data/lib/theme_template/theme.gemspec.erb +18 -0
  88. metadata +40 -19
  89. data/lib/site_template/_includes/footer.html +0 -38
  90. data/lib/site_template/_includes/head.html +0 -12
  91. data/lib/site_template/_includes/header.html +0 -27
  92. data/lib/site_template/_includes/icon-github.html +0 -1
  93. data/lib/site_template/_includes/icon-github.svg +0 -1
  94. data/lib/site_template/_includes/icon-twitter.html +0 -1
  95. data/lib/site_template/_includes/icon-twitter.svg +0 -1
  96. data/lib/site_template/_layouts/default.html +0 -20
  97. data/lib/site_template/_layouts/page.html +0 -14
  98. data/lib/site_template/_layouts/post.html +0 -15
  99. data/lib/site_template/_sass/_base.scss +0 -200
  100. data/lib/site_template/_sass/_layout.scss +0 -242
  101. data/lib/site_template/_sass/_syntax-highlighting.scss +0 -71
@@ -1,12 +1,12 @@
1
1
  module Bunto
2
2
  class Plugin
3
3
  PRIORITIES = {
4
- :low => -10,
4
+ :low => -10,
5
5
  :highest => 100,
6
- :lowest => -100,
7
- :normal => 0,
8
- :high => 10
9
- }
6
+ :lowest => -100,
7
+ :normal => 0,
8
+ :high => 10
9
+ }.freeze
10
10
 
11
11
  #
12
12
 
@@ -24,7 +24,9 @@ module Bunto
24
24
  #
25
25
  # Returns nothing.
26
26
  def require_gems
27
- Bunto::External.require_with_graceful_fail(site.gems.select { |gem| plugin_allowed?(gem) })
27
+ Bunto::External.require_with_graceful_fail(
28
+ site.gems.select { |gem| plugin_allowed?(gem) }
29
+ )
28
30
  end
29
31
 
30
32
  def self.require_from_bundler
@@ -33,7 +35,8 @@ module Bunto
33
35
 
34
36
  Bundler.setup
35
37
  required_gems = Bundler.require(:bunto_plugins)
36
- Bunto.logger.debug("PluginManager:", "Required #{required_gems.map(&:name).join(', ')}")
38
+ message = "Required #{required_gems.map(&:name).join(", ")}"
39
+ Bunto.logger.debug("PluginManager:", message)
37
40
  ENV["BUNTO_NO_BUNDLER_REQUIRE"] = "true"
38
41
 
39
42
  true
@@ -57,7 +60,7 @@ module Bunto
57
60
  # Returns an array of strings, each string being the name of a gem name
58
61
  # that is allowed to be used.
59
62
  def whitelist
60
- @whitelist ||= Array[site.config['whitelist']].flatten
63
+ @whitelist ||= Array[site.config["whitelist"]].flatten
61
64
  end
62
65
 
63
66
  # Require all .rb files if safe mode is off
@@ -76,16 +79,17 @@ module Bunto
76
79
  #
77
80
  # Returns an Array of plugin search paths
78
81
  def plugins_path
79
- if site.config['plugins_dir'] == Bunto::Configuration::DEFAULTS['plugins_dir']
80
- [site.in_source_dir(site.config['plugins_dir'])]
82
+ if site.config["plugins_dir"].eql? Bunto::Configuration::DEFAULTS["plugins_dir"]
83
+ [site.in_source_dir(site.config["plugins_dir"])]
81
84
  else
82
- Array(site.config['plugins_dir']).map { |d| File.expand_path(d) }
85
+ Array(site.config["plugins_dir"]).map { |d| File.expand_path(d) }
83
86
  end
84
87
  end
85
88
 
86
89
  def deprecation_checks
87
- pagination_included = (site.config['gems'] || []).include?('bunto-paginate') || defined?(Bunto::Paginate)
88
- if site.config['paginate'] && !pagination_included
90
+ pagination_included = (site.config["gems"] || []).include?("bunto-paginate") ||
91
+ defined?(Bunto::Paginate)
92
+ if site.config["paginate"] && !pagination_included
89
93
  Bunto::Deprecator.deprecation_message "You appear to have pagination " \
90
94
  "turned on, but you haven't included the `bunto-paginate` gem. " \
91
95
  "Ensure you have `gems: [bunto-paginate]` in your configuration file."
@@ -15,7 +15,7 @@ module Bunto
15
15
  private
16
16
 
17
17
  def can_be_published?(thing)
18
- thing.data.fetch('published', true) || @site.unpublished
18
+ thing.data.fetch("published", true) || @site.unpublished
19
19
  end
20
20
  end
21
21
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- require 'csv'
2
+ require "csv"
3
3
 
4
4
  module Bunto
5
5
  class Reader
@@ -16,7 +16,7 @@ module Bunto
16
16
  @site.layouts = LayoutReader.new(site).read
17
17
  read_directories
18
18
  sort_files!
19
- @site.data = DataReader.new(site).read(site.config['data_dir'])
19
+ @site.data = DataReader.new(site).read(site.config["data_dir"])
20
20
  CollectionReader.new(site).read
21
21
  end
22
22
 
@@ -34,13 +34,15 @@ module Bunto
34
34
  # dir - The String relative path of the directory to read. Default: ''.
35
35
  #
36
36
  # Returns nothing.
37
- def read_directories(dir = '')
37
+ def read_directories(dir = "")
38
38
  base = site.in_source_dir(dir)
39
39
 
40
- dot = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) }
40
+ dot = Dir.chdir(base) { filter_entries(Dir.entries("."), base) }
41
41
  dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) }
42
42
  dot_files = (dot - dot_dirs)
43
- dot_pages = dot_files.select { |file| Utils.has_yaml_header?(@site.in_source_dir(base, file)) }
43
+ dot_pages = dot_files.select do |file|
44
+ Utils.has_yaml_header?(@site.in_source_dir(base, file))
45
+ end
44
46
  dot_static_files = dot_files - dot_pages
45
47
 
46
48
  retrieve_posts(dir)
@@ -71,7 +73,9 @@ module Bunto
71
73
  dot_dirs.map do |file|
72
74
  dir_path = site.in_source_dir(dir, file)
73
75
  rel_path = File.join(dir, file)
74
- @site.reader.read_directories(rel_path) unless @site.dest.sub(/\/$/, '') == dir_path
76
+ unless @site.dest.sub(%r!/$!, "") == dir_path
77
+ @site.reader.read_directories(rel_path)
78
+ end
75
79
  end
76
80
  end
77
81
 
@@ -119,7 +123,7 @@ module Bunto
119
123
  def get_entries(dir, subfolder)
120
124
  base = site.in_source_dir(dir, subfolder)
121
125
  return [] unless File.exist?(base)
122
- entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) }
126
+ entries = Dir.chdir(base) { filter_entries(Dir["**/*"], base) }
123
127
  entries.delete_if { |e| File.directory?(site.in_source_dir(base, e)) }
124
128
  end
125
129
  end
@@ -30,14 +30,14 @@ module Bunto
30
30
  return unless File.directory?(dir) && !@entry_filter.symlink?(dir)
31
31
 
32
32
  entries = Dir.chdir(dir) do
33
- Dir['*.{yaml,yml,json,csv}'] + Dir['*'].select { |fn| File.directory?(fn) }
33
+ Dir["*.{yaml,yml,json,csv}"] + Dir["*"].select { |fn| File.directory?(fn) }
34
34
  end
35
35
 
36
36
  entries.each do |entry|
37
37
  path = @site.in_source_dir(dir, entry)
38
38
  next if @entry_filter.symlink?(path)
39
39
 
40
- key = sanitize_filename(File.basename(entry, '.*'))
40
+ key = sanitize_filename(File.basename(entry, ".*"))
41
41
  if File.directory?(path)
42
42
  read_data_to(path, data[key] = {})
43
43
  else
@@ -51,20 +51,20 @@ module Bunto
51
51
  # Returns the contents of the data file.
52
52
  def read_data_file(path)
53
53
  case File.extname(path).downcase
54
- when '.csv'
54
+ when ".csv"
55
55
  CSV.read(path, {
56
- :headers => true,
57
- :encoding => site.config['encoding']
58
- }).map(&:to_hash)
56
+ :headers => true,
57
+ :encoding => site.config["encoding"]
58
+ }).map(&:to_hash)
59
59
  else
60
60
  SafeYAML.load_file(path)
61
61
  end
62
62
  end
63
63
 
64
64
  def sanitize_filename(name)
65
- name.gsub!(/[^\w\s-]+/, '')
66
- name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
67
- name.gsub(/\s+/, '_')
65
+ name.gsub!(%r![^\w\s-]+!, "")
66
+ name.gsub!(%r!(^|\b\s)\s+($|\s?\b)!, '\\1\\2')
67
+ name.gsub(%r!\s+!, "_")
68
68
  end
69
69
  end
70
70
  end
@@ -8,11 +8,13 @@ module Bunto
8
8
 
9
9
  def read
10
10
  layout_entries.each do |layout_file|
11
- @layouts[layout_name(layout_file)] = Layout.new(site, layout_directory, layout_file)
11
+ @layouts[layout_name(layout_file)] = \
12
+ Layout.new(site, layout_directory, layout_file)
12
13
  end
13
14
 
14
15
  theme_layout_entries.each do |layout_file|
15
- @layouts[layout_name(layout_file)] ||= Layout.new(site, theme_layout_directory, layout_file)
16
+ @layouts[layout_name(layout_file)] ||= \
17
+ Layout.new(site, theme_layout_directory, layout_file)
16
18
  end
17
19
 
18
20
  @layouts
@@ -39,7 +41,7 @@ module Bunto
39
41
  def entries_in(dir)
40
42
  entries = []
41
43
  within(dir) do
42
- entries = EntryFilter.new(site).filter(Dir['**/*.*'])
44
+ entries = EntryFilter.new(site).filter(Dir["**/*.*"])
43
45
  end
44
46
  entries
45
47
  end
@@ -54,15 +56,13 @@ module Bunto
54
56
  end
55
57
 
56
58
  def layout_directory_inside_source
57
- site.in_source_dir(site.config['layouts_dir'])
59
+ site.in_source_dir(site.config["layouts_dir"])
58
60
  end
59
61
 
60
62
  def layout_directory_in_cwd
61
- dir = Bunto.sanitized_path(Dir.pwd, site.config['layouts_dir'])
63
+ dir = Bunto.sanitized_path(Dir.pwd, site.config["layouts_dir"])
62
64
  if File.directory?(dir) && !site.safe
63
65
  dir
64
- else
65
- nil
66
66
  end
67
67
  end
68
68
  end
@@ -14,7 +14,9 @@ module Bunto
14
14
  #
15
15
  # Returns an array of static pages.
16
16
  def read(files)
17
- files.map { |page| @unfiltered_content << Page.new(@site, @site.source, @dir, page) }
17
+ files.map do |page|
18
+ @unfiltered_content << Page.new(@site, @site.source, @dir, page)
19
+ end
18
20
  @unfiltered_content.select { |page| site.publisher.publish?(page) }
19
21
  end
20
22
  end
@@ -12,7 +12,7 @@ module Bunto
12
12
  #
13
13
  # Returns nothing.
14
14
  def read_drafts(dir)
15
- read_publishable(dir, '_drafts', Document::DATELESS_FILENAME_MATCHER)
15
+ read_publishable(dir, "_drafts", Document::DATELESS_FILENAME_MATCHER)
16
16
  end
17
17
 
18
18
  # Read all the files in <source>/<dir>/_posts and create a new Document
@@ -22,7 +22,7 @@ module Bunto
22
22
  #
23
23
  # Returns nothing.
24
24
  def read_posts(dir)
25
- read_publishable(dir, '_posts', Document::DATE_FILENAME_MATCHER)
25
+ read_publishable(dir, "_posts", Document::DATE_FILENAME_MATCHER)
26
26
  end
27
27
 
28
28
  # Read all the files in <source>/<dir>/<magic_dir> and create a new
@@ -32,15 +32,14 @@ module Bunto
32
32
  #
33
33
  # Returns nothing.
34
34
  def read_publishable(dir, magic_dir, matcher)
35
- read_content(dir, magic_dir, matcher).tap do |docs|
36
- docs.each(&:read)
37
- end.select do |doc|
38
- site.publisher.publish?(doc).tap do |will_publish|
39
- if !will_publish && site.publisher.hidden_in_the_future?(doc)
40
- Bunto.logger.debug "Skipping:", "#{doc.relative_path} has a future date"
35
+ read_content(dir, magic_dir, matcher).tap { |docs| docs.each(&:read) }
36
+ .select do |doc|
37
+ site.publisher.publish?(doc).tap do |will_publish|
38
+ if !will_publish && site.publisher.hidden_in_the_future?(doc)
39
+ Bunto.logger.debug "Skipping:", "#{doc.relative_path} has a future date"
40
+ end
41
41
  end
42
42
  end
43
- end
44
43
  end
45
44
 
46
45
  # Read all the content files from <source>/<dir>/magic_dir
@@ -57,7 +56,7 @@ module Bunto
57
56
  next unless entry =~ matcher
58
57
  path = @site.in_source_dir(File.join(dir, magic_dir, entry))
59
58
  Document.new(path, {
60
- :site => @site,
59
+ :site => @site,
61
60
  :collection => @site.posts
62
61
  })
63
62
  end.reject(&:nil?)
@@ -14,7 +14,9 @@ module Bunto
14
14
  #
15
15
  # Returns an array of static files.
16
16
  def read(files)
17
- files.map { |file| @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file) }
17
+ files.map do |file|
18
+ @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file)
19
+ end
18
20
  @unfiltered_content
19
21
  end
20
22
  end
@@ -20,18 +20,14 @@ module Bunto
20
20
  def regenerate?(document)
21
21
  case document
22
22
  when Page
23
- document.asset_file? || document.data['regenerate'] ||
24
- source_modified_or_dest_missing?(
25
- site.in_source_dir(document.relative_path), document.destination(@site.dest)
26
- )
23
+ regenerate_page?(document)
27
24
  when Document
28
- !document.write? || document.data['regenerate'] ||
29
- source_modified_or_dest_missing?(
30
- document.path, document.destination(@site.dest)
31
- )
25
+ regenerate_document?(document)
32
26
  else
33
- source_path = document.respond_to?(:path) ? document.path : nil
34
- dest_path = document.respond_to?(:destination) ? document.destination(@site.dest) : nil
27
+ source_path = document.respond_to?(:path) ? document.path : nil
28
+ dest_path = if document.respond_to?(:destination)
29
+ document.destination(@site.dest)
30
+ end
35
31
  source_modified_or_dest_missing?(source_path, dest_path)
36
32
  end
37
33
  end
@@ -44,7 +40,7 @@ module Bunto
44
40
 
45
41
  metadata[path] = {
46
42
  "mtime" => File.mtime(path),
47
- "deps" => []
43
+ "deps" => []
48
44
  }
49
45
  cache[path] = true
50
46
  end
@@ -94,23 +90,14 @@ module Bunto
94
90
  return cache[path]
95
91
  end
96
92
 
97
- # Check path that exists in metadata
98
- data = metadata[path]
99
- if data
100
- data["deps"].each do |dependency|
101
- if modified?(dependency)
102
- return cache[dependency] = cache[path] = true
103
- end
104
- end
105
- if File.exist?(path) && data["mtime"].eql?(File.mtime(path))
106
- return cache[path] = false
107
- else
108
- return add(path)
109
- end
93
+ if metadata[path]
94
+ # If we have seen this file before,
95
+ # check if it or one of its dependencies has been modified
96
+ existing_file_modified?(path)
97
+ else
98
+ # If we have not seen this file before, add it to the metadata and regenerate it
99
+ add(path)
110
100
  end
111
-
112
- # Path does not exist in metadata, add it
113
- return add(path)
114
101
  end
115
102
 
116
103
  # Add a dependency of a path
@@ -139,7 +126,7 @@ module Bunto
139
126
  #
140
127
  # Returns the String path of the file.
141
128
  def metadata_file
142
- site.in_source_dir('.bunto-metadata')
129
+ site.in_source_dir(".bunto-metadata")
143
130
  end
144
131
 
145
132
  # Check if metadata has been disabled
@@ -173,5 +160,40 @@ module Bunto
173
160
  {}
174
161
  end
175
162
  end
163
+
164
+ private
165
+ def regenerate_page?(document)
166
+ document.asset_file? || document.data["regenerate"] ||
167
+ source_modified_or_dest_missing?(
168
+ site.in_source_dir(document.relative_path), document.destination(@site.dest)
169
+ )
170
+ end
171
+
172
+ private
173
+ def regenerate_document?(document)
174
+ !document.write? || document.data["regenerate"] ||
175
+ source_modified_or_dest_missing?(
176
+ document.path, document.destination(@site.dest)
177
+ )
178
+ end
179
+
180
+ private
181
+ def existing_file_modified?(path)
182
+ # If one of this file dependencies have been modified,
183
+ # set the regeneration bit for both the dependency and the file to true
184
+ metadata[path]["deps"].each do |dependency|
185
+ if modified?(dependency)
186
+ return cache[dependency] = cache[path] = true
187
+ end
188
+ end
189
+
190
+ if File.exist?(path) && metadata[path]["mtime"].eql?(File.mtime(path))
191
+ # If this file has not been modified, set the regeneration bit to false
192
+ cache[path] = false
193
+ else
194
+ # If it has been modified, set it to true
195
+ add(path)
196
+ end
197
+ end
176
198
  end
177
199
  end
@@ -9,7 +9,7 @@ module Bunto
9
9
  def initialize(post)
10
10
  @post = post
11
11
  @site = post.site
12
- Bunto::External.require_with_graceful_fail('classifier-reborn') if site.lsi
12
+ Bunto::External.require_with_graceful_fail("classifier-reborn") if site.lsi
13
13
  end
14
14
 
15
15
  def build
@@ -38,21 +38,21 @@ module Bunto
38
38
  payload["paginator"] = document.pager.to_liquid
39
39
  end
40
40
 
41
- if document.is_a?(Document) && document.collection.label == 'posts'
42
- payload['site']['related_posts'] = document.related_posts
41
+ if document.is_a?(Document) && document.collection.label == "posts"
42
+ payload["site"]["related_posts"] = document.related_posts
43
43
  else
44
- payload['site']['related_posts'] = nil
44
+ payload["site"]["related_posts"] = nil
45
45
  end
46
46
 
47
47
  # render and transform content (this becomes the final content of the object)
48
- payload['highlighter_prefix'] = converters.first.highlighter_prefix
49
- payload['highlighter_suffix'] = converters.first.highlighter_suffix
48
+ payload["highlighter_prefix"] = converters.first.highlighter_prefix
49
+ payload["highlighter_suffix"] = converters.first.highlighter_suffix
50
50
 
51
51
  Bunto.logger.debug "Pre-Render Hooks:", document.relative_path
52
52
  document.trigger_hooks(:pre_render, payload)
53
53
 
54
54
  info = {
55
- :registers => { :site => site, :page => payload['page'] }
55
+ :registers => { :site => site, :page => payload["page"] }
56
56
  }
57
57
 
58
58
  output = document.content
@@ -88,7 +88,9 @@ module Bunto
88
88
  begin
89
89
  converter.convert output
90
90
  rescue => e
91
- Bunto.logger.error "Conversion error:", "#{converter.class} encountered an error while converting '#{document.relative_path}':"
91
+ Bunto.logger.error "Conversion error:",
92
+ "#{converter.class} encountered an error while "\
93
+ "converting '#{document.relative_path}':"
92
94
  Bunto.logger.error("", e.to_s)
93
95
  raise e
94
96
  end
@@ -104,14 +106,19 @@ module Bunto
104
106
  #
105
107
  # Returns the content, rendered by Liquid.
106
108
  def render_liquid(content, payload, info, path = nil)
107
- site.liquid_renderer.file(path).parse(content).render!(payload, info)
108
- rescue Tags::IncludeTagError => e
109
- Bunto.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || document.relative_path}"
110
- raise e
109
+ template = site.liquid_renderer.file(path).parse(content)
110
+ template.warnings.each do |e|
111
+ Bunto.logger.warn "Liquid Warning:",
112
+ LiquidRenderer.format_error(e, path || document.relative_path)
113
+ end
114
+ template.render!(payload, info)
115
+ # rubocop: disable RescueException
111
116
  rescue Exception => e
112
- Bunto.logger.error "Liquid Exception:", "#{e.message} in #{path || document.relative_path}"
117
+ Bunto.logger.error "Liquid Exception:",
118
+ LiquidRenderer.format_error(e, path || document.relative_path)
113
119
  raise e
114
120
  end
121
+ # rubocop: enable RescueException
115
122
 
116
123
  # Checks if the layout specified in the document actually exists
117
124
  #
@@ -132,14 +139,20 @@ module Bunto
132
139
  output = content.dup
133
140
  layout = site.layouts[document.data["layout"]]
134
141
 
135
- Bunto.logger.warn("Build Warning:", "Layout '#{document.data["layout"]}' requested in #{document.relative_path} does not exist.") if invalid_layout? layout
142
+ Bunto.logger.warn(
143
+ "Build Warning:",
144
+ "Layout '#{document.data["layout"]}' requested in "\
145
+ "#{document.relative_path} does not exist."
146
+ ) if invalid_layout? layout
147
+
148
+ used = Set.new([layout])
136
149
 
137
- used = Set.new([layout])
150
+ # Reset the payload layout data to ensure it starts fresh for each page.
151
+ payload["layout"] = nil
138
152
 
139
153
  while layout
140
- payload['content'] = output
141
- payload['page'] = document.to_liquid
142
- payload['layout'] = Utils.deep_merge_hashes(payload['layout'] || {}, layout.data)
154
+ payload["content"] = output
155
+ payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
143
156
 
144
157
  output = render_liquid(
145
158
  layout.content,
@@ -154,12 +167,9 @@ module Bunto
154
167
  site.in_source_dir(layout.path)
155
168
  ) if document.write?
156
169
 
157
- if layout = site.layouts[layout.data["layout"]]
158
- if used.include?(layout)
159
- layout = nil # avoid recursive chain
160
- else
161
- used << layout
162
- end
170
+ if (layout = site.layouts[layout.data["layout"]])
171
+ break if used.include?(layout)
172
+ used << layout
163
173
  end
164
174
  end
165
175