bridgetown-core 0.12.1 → 0.13.0
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.
- checksums.yaml +4 -4
- data/bin/bridgetown +15 -15
- data/bridgetown-core.gemspec +1 -0
- data/lib/bridgetown-core.rb +7 -1
- data/lib/bridgetown-core/commands/build.rb +1 -1
- data/lib/bridgetown-core/commands/console.rb +3 -2
- data/lib/bridgetown-core/commands/doctor.rb +0 -9
- data/lib/bridgetown-core/commands/serve.rb +5 -7
- data/lib/bridgetown-core/configuration.rb +96 -99
- data/lib/bridgetown-core/drops/bridgetown_drop.rb +6 -1
- data/lib/bridgetown-core/drops/site_drop.rb +0 -1
- data/lib/bridgetown-core/liquid_renderer.rb +1 -0
- data/lib/bridgetown-core/liquid_renderer/file_system.rb +3 -1
- data/lib/bridgetown-core/readers/data_reader.rb +10 -0
- data/lib/bridgetown-core/renderer.rb +25 -16
- data/lib/bridgetown-core/site.rb +14 -0
- data/lib/bridgetown-core/static_file.rb +1 -5
- data/lib/bridgetown-core/utils.rb +1 -0
- data/lib/bridgetown-core/utils/ruby_exec.rb +69 -0
- data/lib/bridgetown-core/version.rb +2 -2
- data/lib/site_template/src/favicon.ico +0 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5434399f502bf037e77a019dfda4b2deae10b6a532349ec21b32977a224ca448
|
4
|
+
data.tar.gz: cae6a4eb2d435bfd0e85f18320e76a90619c872ccf69f44c9ac2e13e987e1fe7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5344308e24f519099a33af769a1c5dd908d1fd54f10aaec4c81f4254c9ff772787f1a2e4b9f0d488a21167cc98c6a1c526df1fd2e7d6ee4e86cf33afc4efe2bd
|
7
|
+
data.tar.gz: f2eedc957c8782b03e08f0834b88981e40f6539ac65899096bcfc1c1e4ed196b4046859530d5e281dee2b1455ac4e01e7b8a63dfdf29e3ad36e8725d1ed00f64
|
data/bin/bridgetown
CHANGED
@@ -13,7 +13,7 @@ Bridgetown::PluginManager.require_from_bundler
|
|
13
13
|
Bridgetown::Deprecator.process(ARGV)
|
14
14
|
|
15
15
|
Mercenary.program(:bridgetown) do |p|
|
16
|
-
p.version Bridgetown::VERSION
|
16
|
+
p.version "#{Bridgetown::VERSION.magenta} \"#{Bridgetown::CODE_NAME.yellow}\""
|
17
17
|
p.description "Bridgetown is a Webpack-aware, Ruby-powered static site generator for the modern Jamstack era"
|
18
18
|
p.syntax "bridgetown <subcommand> [options]"
|
19
19
|
|
@@ -23,24 +23,24 @@ Mercenary.program(:bridgetown) do |p|
|
|
23
23
|
# if you do bridgetown build --help — ouch!
|
24
24
|
p.option "source", "-s", "--source [DIR]", "Source directory (defaults to src)"
|
25
25
|
p.option "destination", "-d", "--destination [DIR]",
|
26
|
-
|
26
|
+
"Destination directory (defaults to output)"
|
27
27
|
p.option "plugins_dir", "-p", "--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]", Array,
|
28
|
-
|
28
|
+
"Plugins directory (defaults to plugins)"
|
29
29
|
p.option "layouts_dir", "--layouts DIR", String,
|
30
|
-
|
30
|
+
"Layouts directory (defaults to src/_layouts)"
|
31
31
|
p.option "profile", "--profile", "Generate a Liquid rendering profile"
|
32
32
|
|
33
|
-
# TODO: this is not the way to bring in extra command gems!
|
34
|
-
# Bridgetown::External.require_if_present(Bridgetown::External.blessed_gems) do |g, ver_constraint|
|
35
|
-
# cmd = g.split("-").last
|
36
|
-
# p.command(cmd.to_sym) do |c|
|
37
|
-
# c.syntax cmd
|
38
|
-
# c.action do
|
39
|
-
# Bridgetown.logger.abort_with "You must install the '#{g}' gem" \
|
40
|
-
# " version #{ver_constraint} to use the 'bridgetown #{cmd}' command."
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
# end
|
33
|
+
# TODO: this is not the way to bring in extra command gems!
|
34
|
+
# Bridgetown::External.require_if_present(Bridgetown::External.blessed_gems) do |g, ver_constraint|
|
35
|
+
# cmd = g.split("-").last
|
36
|
+
# p.command(cmd.to_sym) do |c|
|
37
|
+
# c.syntax cmd
|
38
|
+
# c.action do
|
39
|
+
# Bridgetown.logger.abort_with "You must install the '#{g}' gem" \
|
40
|
+
# " version #{ver_constraint} to use the 'bridgetown #{cmd}' command."
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
# end
|
44
44
|
|
45
45
|
Bridgetown::Command.subclasses.each { |c| c.init_with_program(p) }
|
46
46
|
|
data/bridgetown-core.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
|
34
34
|
s.add_runtime_dependency("addressable", "~> 2.4")
|
35
35
|
s.add_runtime_dependency("colorator", "~> 1.0")
|
36
|
+
s.add_runtime_dependency("faraday", "~> 1.0")
|
36
37
|
s.add_runtime_dependency("i18n", "~> 1.0")
|
37
38
|
s.add_runtime_dependency("kramdown", "~> 2.1")
|
38
39
|
s.add_runtime_dependency("kramdown-parser-gfm", "~> 1.0")
|
data/lib/bridgetown-core.rb
CHANGED
@@ -36,9 +36,14 @@ require "liquid"
|
|
36
36
|
require "kramdown"
|
37
37
|
require "colorator"
|
38
38
|
require "i18n"
|
39
|
+
require "faraday"
|
39
40
|
|
40
41
|
SafeYAML::OPTIONS[:suppress_warnings] = true
|
41
42
|
|
43
|
+
# Create our little String subclass for Ruby Front Matter
|
44
|
+
class Rb < String; end
|
45
|
+
SafeYAML::OPTIONS[:whitelisted_tags] = ["!ruby/string:Rb"]
|
46
|
+
|
42
47
|
module Bridgetown
|
43
48
|
# internal requires
|
44
49
|
autoload :Cleaner, "bridgetown-core/cleaner"
|
@@ -101,9 +106,10 @@ module Bridgetown
|
|
101
106
|
# Public: Tells you which Bridgetown environment you are building in so
|
102
107
|
# you can skip tasks if you need to.
|
103
108
|
|
104
|
-
def
|
109
|
+
def environment
|
105
110
|
ENV["BRIDGETOWN_ENV"] || "development"
|
106
111
|
end
|
112
|
+
alias_method :env, :environment
|
107
113
|
|
108
114
|
# Public: Generate a Bridgetown configuration Hash by merging the default
|
109
115
|
# options with anything in bridgetown.config.yml, and adding the given
|
@@ -87,7 +87,6 @@ module Bridgetown
|
|
87
87
|
"run Bridgetown with --no-watch."
|
88
88
|
end
|
89
89
|
|
90
|
-
# External.require_with_graceful_fail "bridgetown-watch"
|
91
90
|
Bridgetown::Watcher.watch(@site, options)
|
92
91
|
end
|
93
92
|
|
@@ -100,6 +99,7 @@ module Bridgetown
|
|
100
99
|
source = File.expand_path(options["source"])
|
101
100
|
destination = File.expand_path(options["destination"])
|
102
101
|
plugins_dir = File.expand_path(options["plugins_dir"])
|
102
|
+
Bridgetown.logger.info "Environment:", Bridgetown.environment.cyan
|
103
103
|
Bridgetown.logger.info "Source:", source
|
104
104
|
Bridgetown.logger.info "Destination:", destination
|
105
105
|
Bridgetown.logger.info "Custom Plugins:", plugins_dir if Dir.exist?(plugins_dir)
|
@@ -24,9 +24,10 @@ module Bridgetown
|
|
24
24
|
# TODO: is there a way to add a unit test for this command?
|
25
25
|
# rubocop:disable Style/GlobalVars, Metrics/AbcSize, Metrics/MethodLength
|
26
26
|
def process(options)
|
27
|
-
Bridgetown.logger.info "Starting:", "Bridgetown v#{Bridgetown::VERSION}" \
|
28
|
-
" (codename \"#{Bridgetown::CODE_NAME}\")" \
|
27
|
+
Bridgetown.logger.info "Starting:", "Bridgetown v#{Bridgetown::VERSION.magenta}" \
|
28
|
+
" (codename \"#{Bridgetown::CODE_NAME.yellow}\")" \
|
29
29
|
" console…"
|
30
|
+
Bridgetown.logger.info "Environment:", Bridgetown.environment.cyan
|
30
31
|
site = Bridgetown::Site.new(configuration_from_options(options))
|
31
32
|
site.reset
|
32
33
|
site.read
|
@@ -34,7 +34,6 @@ module Bridgetown
|
|
34
34
|
def healthy?(site)
|
35
35
|
[
|
36
36
|
fsnotify_buggy?(site),
|
37
|
-
!deprecated_relative_permalinks(site),
|
38
37
|
!conflicting_urls(site),
|
39
38
|
!urls_only_differ_by_case(site),
|
40
39
|
proper_site_url?(site),
|
@@ -56,14 +55,6 @@ module Bridgetown
|
|
56
55
|
false
|
57
56
|
end
|
58
57
|
|
59
|
-
def deprecated_relative_permalinks(site)
|
60
|
-
if site.config["relative_permalinks"]
|
61
|
-
Bridgetown::Deprecator.deprecation_message "Your site still uses relative permalinks," \
|
62
|
-
" which was removed in Bridgetown v0.1"
|
63
|
-
true
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
58
|
def conflicting_urls(site)
|
68
59
|
conflicting_urls = false
|
69
60
|
urls = {}
|
@@ -60,7 +60,7 @@ module Bridgetown
|
|
60
60
|
|
61
61
|
# TODO: this prints the configuration file log message out-of-order
|
62
62
|
config = configuration_from_options(opts)
|
63
|
-
config["url"] = default_url(config) if Bridgetown.
|
63
|
+
config["url"] = default_url(config) if Bridgetown.environment == "development"
|
64
64
|
|
65
65
|
process_with_graceful_fail(cmd, config, Build, Serve)
|
66
66
|
end
|
@@ -69,12 +69,11 @@ module Bridgetown
|
|
69
69
|
|
70
70
|
#
|
71
71
|
|
72
|
-
def process(
|
73
|
-
|
74
|
-
destination = opts["destination"]
|
72
|
+
def process(config)
|
73
|
+
destination = config["destination"]
|
75
74
|
setup(destination)
|
76
75
|
|
77
|
-
start_up_webrick(
|
76
|
+
start_up_webrick(config, destination)
|
78
77
|
end
|
79
78
|
|
80
79
|
def shutdown
|
@@ -157,8 +156,7 @@ module Bridgetown
|
|
157
156
|
baseurl: baseurl ? "#{baseurl}/" : "")
|
158
157
|
end
|
159
158
|
|
160
|
-
def default_url(
|
161
|
-
config = configuration_from_options(opts)
|
159
|
+
def default_url(config)
|
162
160
|
format_url(
|
163
161
|
config["ssl_cert"] && config["ssl_key"],
|
164
162
|
config["host"] == "127.0.0.1" ? "localhost" : config["host"],
|
@@ -1,66 +1,70 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Bridgetown
|
4
|
+
# TODO: refactor this whole object! Already had to fix obscure
|
5
|
+
# bugs just making minor changes, and all the indirection is
|
6
|
+
# quite hard to decipher. -JW
|
4
7
|
class Configuration < Hash
|
5
8
|
# Default options. Overridden by values in bridgetown.config.yml.
|
6
9
|
# Strings rather than symbols are used for compatibility with YAML.
|
7
10
|
DEFAULTS = {
|
8
11
|
# Where things are
|
9
|
-
"root_dir"
|
10
|
-
"plugins_dir"
|
11
|
-
"source"
|
12
|
-
"destination"
|
13
|
-
"collections_dir"
|
14
|
-
"cache_dir"
|
15
|
-
"layouts_dir"
|
16
|
-
"data_dir"
|
17
|
-
"components_dir"
|
18
|
-
"includes_dir"
|
19
|
-
"collections"
|
12
|
+
"root_dir" => Dir.pwd,
|
13
|
+
"plugins_dir" => "plugins",
|
14
|
+
"source" => File.join(Dir.pwd, "src"),
|
15
|
+
"destination" => File.join(Dir.pwd, "output"),
|
16
|
+
"collections_dir" => "",
|
17
|
+
"cache_dir" => ".bridgetown-cache",
|
18
|
+
"layouts_dir" => "_layouts",
|
19
|
+
"data_dir" => "_data",
|
20
|
+
"components_dir" => "_components",
|
21
|
+
"includes_dir" => "_includes",
|
22
|
+
"collections" => {},
|
20
23
|
|
21
24
|
# Handling Reading
|
22
|
-
"include"
|
23
|
-
"exclude"
|
24
|
-
"keep_files"
|
25
|
-
"encoding"
|
26
|
-
"markdown_ext"
|
27
|
-
"strict_front_matter"
|
28
|
-
"slugify_categories"
|
25
|
+
"include" => [".htaccess", "_redirects", ".well-known"],
|
26
|
+
"exclude" => [],
|
27
|
+
"keep_files" => [".git", ".svn", "_bridgetown"],
|
28
|
+
"encoding" => "utf-8",
|
29
|
+
"markdown_ext" => "markdown,mkdown,mkdn,mkd,md",
|
30
|
+
"strict_front_matter" => false,
|
31
|
+
"slugify_categories" => true,
|
29
32
|
|
30
33
|
# Filtering Content
|
31
|
-
"limit_posts"
|
32
|
-
"future"
|
33
|
-
"unpublished"
|
34
|
+
"limit_posts" => 0,
|
35
|
+
"future" => false,
|
36
|
+
"unpublished" => false,
|
37
|
+
"ruby_in_front_matter" => true, # requires BRIDGETOWN_RUBY_IN_FRONT_MATTER == "true"
|
34
38
|
|
35
39
|
# Conversion
|
36
|
-
"markdown"
|
37
|
-
"highlighter"
|
38
|
-
"lsi"
|
39
|
-
"excerpt_separator"
|
40
|
-
"incremental"
|
40
|
+
"markdown" => "kramdown",
|
41
|
+
"highlighter" => "rouge",
|
42
|
+
"lsi" => false,
|
43
|
+
"excerpt_separator" => "\n\n",
|
44
|
+
"incremental" => false,
|
41
45
|
|
42
46
|
# Serving
|
43
|
-
"detach"
|
44
|
-
"port"
|
45
|
-
"host"
|
46
|
-
"baseurl"
|
47
|
-
"show_dir_listing"
|
47
|
+
"detach" => false, # default to not detaching the server
|
48
|
+
"port" => "4000",
|
49
|
+
"host" => "127.0.0.1",
|
50
|
+
"baseurl" => nil, # this mounts at /, i.e. no subdirectory
|
51
|
+
"show_dir_listing" => false,
|
48
52
|
|
49
53
|
# Output Configuration
|
50
|
-
"permalink"
|
51
|
-
"timezone"
|
54
|
+
"permalink" => "date",
|
55
|
+
"timezone" => nil, # use the local timezone
|
52
56
|
|
53
|
-
"quiet"
|
54
|
-
"verbose"
|
55
|
-
"defaults"
|
57
|
+
"quiet" => false,
|
58
|
+
"verbose" => false,
|
59
|
+
"defaults" => [],
|
56
60
|
|
57
|
-
"liquid"
|
61
|
+
"liquid" => {
|
58
62
|
"error_mode" => "warn",
|
59
63
|
"strict_filters" => false,
|
60
64
|
"strict_variables" => false,
|
61
65
|
},
|
62
66
|
|
63
|
-
"kramdown"
|
67
|
+
"kramdown" => {
|
64
68
|
"auto_ids" => true,
|
65
69
|
"toc_levels" => (1..6).to_a,
|
66
70
|
"entity_output" => "as_char",
|
@@ -88,7 +92,10 @@ module Bridgetown
|
|
88
92
|
# Returns a Configuration filled with defaults.
|
89
93
|
def from(user_config)
|
90
94
|
Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys)
|
91
|
-
.
|
95
|
+
.merge_environment_specific_options!
|
96
|
+
.add_default_collections
|
97
|
+
.add_default_excludes
|
98
|
+
.check_include_exclude
|
92
99
|
end
|
93
100
|
end
|
94
101
|
|
@@ -178,31 +185,6 @@ module Bridgetown
|
|
178
185
|
Array(config_files)
|
179
186
|
end
|
180
187
|
|
181
|
-
# Public: Read configuration and return merged Hash
|
182
|
-
#
|
183
|
-
# file - the path to the YAML file to be read in
|
184
|
-
#
|
185
|
-
# Returns this configuration, overridden by the values in the file
|
186
|
-
def read_config_file(file)
|
187
|
-
file = File.expand_path(file)
|
188
|
-
next_config = safe_load_file(file)
|
189
|
-
|
190
|
-
unless next_config.is_a?(Hash)
|
191
|
-
raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow
|
192
|
-
end
|
193
|
-
|
194
|
-
Bridgetown.logger.info "Configuration file:", file
|
195
|
-
next_config
|
196
|
-
rescue SystemCallError
|
197
|
-
if @default_config_file ||= nil
|
198
|
-
Bridgetown.logger.warn "Configuration file:", "none"
|
199
|
-
{}
|
200
|
-
else
|
201
|
-
Bridgetown.logger.error "Fatal:", "The configuration file '#{file}' could not be found."
|
202
|
-
raise LoadError, "The Configuration file '#{file}' could not be found."
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
188
|
# Public: Read in a list of configuration files and merge with this hash
|
207
189
|
#
|
208
190
|
# files - the list of configuration file paths
|
@@ -210,14 +192,14 @@ module Bridgetown
|
|
210
192
|
# Returns the full configuration, with the defaults overridden by the values in the
|
211
193
|
# configuration files
|
212
194
|
def read_config_files(files)
|
213
|
-
|
195
|
+
config = self
|
214
196
|
|
215
197
|
begin
|
216
198
|
files.each do |config_file|
|
217
199
|
next if config_file.nil? || config_file.empty?
|
218
200
|
|
219
201
|
new_config = read_config_file(config_file)
|
220
|
-
|
202
|
+
config = Utils.deep_merge_hashes(self, new_config)
|
221
203
|
end
|
222
204
|
rescue ArgumentError => e
|
223
205
|
Bridgetown.logger.warn "WARNING:", "Error reading configuration. Using defaults" \
|
@@ -225,52 +207,64 @@ module Bridgetown
|
|
225
207
|
warn e
|
226
208
|
end
|
227
209
|
|
228
|
-
|
210
|
+
config
|
229
211
|
end
|
230
212
|
|
231
|
-
# Public:
|
213
|
+
# Public: Read configuration and return merged Hash
|
232
214
|
#
|
233
|
-
#
|
215
|
+
# file - the path to the YAML file to be read in
|
234
216
|
#
|
235
|
-
# Returns
|
236
|
-
def
|
237
|
-
|
238
|
-
|
217
|
+
# Returns this configuration, overridden by the values in the file
|
218
|
+
def read_config_file(file)
|
219
|
+
file = File.expand_path(file)
|
220
|
+
next_config = safe_load_file(file)
|
239
221
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
def validate
|
244
|
-
config = clone
|
222
|
+
unless next_config.is_a?(Hash)
|
223
|
+
raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow
|
224
|
+
end
|
245
225
|
|
246
|
-
|
226
|
+
Bridgetown.logger.info "Configuration file:", file
|
227
|
+
next_config
|
228
|
+
rescue SystemCallError
|
229
|
+
if @default_config_file ||= nil
|
230
|
+
Bridgetown.logger.warn "Configuration file:", "none"
|
231
|
+
{}
|
232
|
+
else
|
233
|
+
Bridgetown.logger.error "Fatal:", "The configuration file '#{file}' could not be found."
|
234
|
+
raise LoadError, "The Configuration file '#{file}' could not be found."
|
235
|
+
end
|
236
|
+
end
|
247
237
|
|
248
|
-
|
238
|
+
# Merge in environment-specific options, if present
|
239
|
+
def merge_environment_specific_options!
|
240
|
+
self[Bridgetown.environment]&.each_key do |k|
|
241
|
+
self[k] = self[Bridgetown.environment][k]
|
242
|
+
end
|
243
|
+
delete(Bridgetown.environment)
|
244
|
+
self
|
249
245
|
end
|
250
246
|
|
251
247
|
def add_default_collections
|
252
|
-
config = clone
|
253
|
-
|
254
248
|
# It defaults to `{}`, so this is only if someone sets it to null manually.
|
255
|
-
return
|
249
|
+
return self if self["collections"].nil?
|
256
250
|
|
257
251
|
# Ensure we have a hash.
|
258
|
-
if
|
259
|
-
|
252
|
+
if self["collections"].is_a?(Array)
|
253
|
+
self["collections"] = self["collections"].each_with_object({}) do |collection, hash|
|
260
254
|
hash[collection] = {}
|
261
255
|
end
|
262
256
|
end
|
263
257
|
|
264
|
-
|
265
|
-
{ "posts" => {} },
|
258
|
+
self["collections"] = Utils.deep_merge_hashes(
|
259
|
+
{ "posts" => {} }, self["collections"]
|
266
260
|
).tap do |collections|
|
267
261
|
collections["posts"]["output"] = true
|
268
|
-
if
|
269
|
-
collections["posts"]["permalink"] ||= style_to_permalink(
|
262
|
+
if self["permalink"]
|
263
|
+
collections["posts"]["permalink"] ||= style_to_permalink(self["permalink"])
|
270
264
|
end
|
271
265
|
end
|
272
266
|
|
273
|
-
|
267
|
+
self
|
274
268
|
end
|
275
269
|
|
276
270
|
DEFAULT_EXCLUDES = %w(
|
@@ -281,14 +275,16 @@ module Bridgetown
|
|
281
275
|
).freeze
|
282
276
|
|
283
277
|
def add_default_excludes
|
284
|
-
|
285
|
-
return config if config["exclude"].nil?
|
278
|
+
return self if self["exclude"].nil?
|
286
279
|
|
287
|
-
|
288
|
-
|
280
|
+
self["exclude"].concat(DEFAULT_EXCLUDES).uniq!
|
281
|
+
self
|
289
282
|
end
|
290
283
|
|
291
|
-
|
284
|
+
def should_execute_inline_ruby?
|
285
|
+
ENV["BRIDGETOWN_RUBY_IN_FRONT_MATTER"] == "true" &&
|
286
|
+
self["ruby_in_front_matter"]
|
287
|
+
end
|
292
288
|
|
293
289
|
# rubocop:disable Metrics/CyclomaticComplexity #
|
294
290
|
def style_to_permalink(permalink_style)
|
@@ -311,14 +307,15 @@ module Bridgetown
|
|
311
307
|
end
|
312
308
|
# rubocop:enable Metrics/CyclomaticComplexity #
|
313
309
|
|
314
|
-
def check_include_exclude
|
310
|
+
def check_include_exclude
|
315
311
|
%w(include exclude).each do |option|
|
316
|
-
next unless
|
317
|
-
next if
|
312
|
+
next unless key?(option)
|
313
|
+
next if self[option].is_a?(Array)
|
318
314
|
|
319
315
|
raise Bridgetown::Errors::InvalidConfigurationError,
|
320
|
-
"'#{option}' should be set as an array, but was: #{
|
316
|
+
"'#{option}' should be set as an array, but was: #{self[option].inspect}."
|
321
317
|
end
|
318
|
+
self
|
322
319
|
end
|
323
320
|
end
|
324
321
|
end
|
@@ -13,13 +13,18 @@ module Bridgetown
|
|
13
13
|
Bridgetown::VERSION
|
14
14
|
end
|
15
15
|
|
16
|
+
def code_name
|
17
|
+
Bridgetown::CODE_NAME
|
18
|
+
end
|
19
|
+
|
16
20
|
def environment
|
17
|
-
Bridgetown.
|
21
|
+
Bridgetown.environment
|
18
22
|
end
|
19
23
|
|
20
24
|
def to_h
|
21
25
|
@to_h ||= {
|
22
26
|
"version" => version,
|
27
|
+
"code_name" => code_name,
|
23
28
|
"environment" => environment,
|
24
29
|
}
|
25
30
|
end
|
@@ -17,6 +17,7 @@ module Bridgetown
|
|
17
17
|
Liquid::Template.file_system = LiquidRenderer::FileSystem.new(
|
18
18
|
@site.components_load_paths, "%s.liquid"
|
19
19
|
)
|
20
|
+
Liquid::Template.file_system.site = site
|
20
21
|
|
21
22
|
Liquid::Template.error_mode = @site.config["liquid"]["error_mode"].to_sym
|
22
23
|
reset
|
@@ -3,6 +3,8 @@
|
|
3
3
|
module Bridgetown
|
4
4
|
class LiquidRenderer
|
5
5
|
class FileSystem < Liquid::LocalFileSystem
|
6
|
+
attr_accessor :site
|
7
|
+
|
6
8
|
def read_template_file(template_path)
|
7
9
|
load_paths = root
|
8
10
|
found_paths = []
|
@@ -29,7 +31,7 @@ module Bridgetown
|
|
29
31
|
raise Liquid::FileSystemError, "No such template '#{template_path}'" if found_paths.empty?
|
30
32
|
|
31
33
|
# Last path in the list wins
|
32
|
-
::File.read(found_paths.last)
|
34
|
+
::File.read(found_paths.last, site.file_read_opts)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -18,6 +18,7 @@ module Bridgetown
|
|
18
18
|
def read(dir)
|
19
19
|
base = site.in_source_dir(dir)
|
20
20
|
read_data_to(base, @content)
|
21
|
+
merge_environment_specific_metadata!
|
21
22
|
@content
|
22
23
|
end
|
23
24
|
|
@@ -67,6 +68,15 @@ module Bridgetown
|
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
71
|
+
def merge_environment_specific_metadata!
|
72
|
+
if @content["site_metadata"]
|
73
|
+
@content["site_metadata"][Bridgetown.environment]&.each_key do |k|
|
74
|
+
@content["site_metadata"][k] = @content["site_metadata"][Bridgetown.environment][k]
|
75
|
+
end
|
76
|
+
@content["site_metadata"].delete(Bridgetown.environment)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
70
80
|
def sanitize_filename(name)
|
71
81
|
name.gsub(%r![^\w\s-]+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "")
|
72
82
|
.gsub(%r!\s+!, "_")
|
@@ -74,6 +74,8 @@ module Bridgetown
|
|
74
74
|
strict_variables: liquid_options["strict_variables"],
|
75
75
|
}
|
76
76
|
|
77
|
+
execute_inline_ruby!
|
78
|
+
|
77
79
|
output = document.content
|
78
80
|
if document.render_with_liquid?
|
79
81
|
Bridgetown.logger.debug "Rendering Liquid:", document.relative_path
|
@@ -91,25 +93,15 @@ module Bridgetown
|
|
91
93
|
|
92
94
|
output
|
93
95
|
end
|
94
|
-
# rubocop: enable Metrics/AbcSize
|
95
96
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
converters.reduce(content) do |output, converter|
|
101
|
-
begin
|
102
|
-
converter.convert output
|
103
|
-
rescue StandardError => e
|
104
|
-
Bridgetown.logger.error "Conversion error:",
|
105
|
-
"#{converter.class} encountered an error while "\
|
106
|
-
"converting '#{document.relative_path}':"
|
107
|
-
Bridgetown.logger.error("", e.to_s)
|
108
|
-
raise e
|
109
|
-
end
|
110
|
-
end
|
97
|
+
def execute_inline_ruby!
|
98
|
+
return unless site.config.should_execute_inline_ruby?
|
99
|
+
|
100
|
+
Bridgetown::Utils::RubyExec.search_data_for_ruby_code(document, self)
|
111
101
|
end
|
112
102
|
|
103
|
+
# rubocop: enable Metrics/AbcSize
|
104
|
+
|
113
105
|
# Render the given content with the payload and info
|
114
106
|
#
|
115
107
|
# content -
|
@@ -133,6 +125,23 @@ module Bridgetown
|
|
133
125
|
end
|
134
126
|
# rubocop: enable Lint/RescueException
|
135
127
|
|
128
|
+
# Convert the document using the converters which match this renderer's document.
|
129
|
+
#
|
130
|
+
# Returns String the converted content.
|
131
|
+
def convert(content)
|
132
|
+
converters.reduce(content) do |output, converter|
|
133
|
+
begin
|
134
|
+
converter.convert output
|
135
|
+
rescue StandardError => e
|
136
|
+
Bridgetown.logger.error "Conversion error:",
|
137
|
+
"#{converter.class} encountered an error while "\
|
138
|
+
"converting '#{document.relative_path}':"
|
139
|
+
Bridgetown.logger.error("", e.to_s)
|
140
|
+
raise e
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
136
145
|
# Checks if the layout specified in the document actually exists
|
137
146
|
#
|
138
147
|
# layout - the layout to check
|
data/lib/bridgetown-core/site.rb
CHANGED
@@ -192,6 +192,8 @@ module Bridgetown
|
|
192
192
|
|
193
193
|
Bridgetown::Hooks.trigger :site, :pre_render, self, payload
|
194
194
|
|
195
|
+
execute_inline_ruby_for_layouts!
|
196
|
+
|
195
197
|
render_docs(payload)
|
196
198
|
render_pages(payload)
|
197
199
|
|
@@ -262,6 +264,10 @@ module Bridgetown
|
|
262
264
|
@site_data ||= (config["data"] || data)
|
263
265
|
end
|
264
266
|
|
267
|
+
def metadata
|
268
|
+
data["site_metadata"] || {}
|
269
|
+
end
|
270
|
+
|
265
271
|
# The Hash payload containing site-wide data.
|
266
272
|
#
|
267
273
|
# Returns the Hash: { "site" => data } where data is a Hash with keys:
|
@@ -461,6 +467,14 @@ module Bridgetown
|
|
461
467
|
self.file_read_opts = Bridgetown::Utils.merged_file_read_opts(self, {})
|
462
468
|
end
|
463
469
|
|
470
|
+
def execute_inline_ruby_for_layouts!
|
471
|
+
return unless config.should_execute_inline_ruby?
|
472
|
+
|
473
|
+
layouts.each_value do |layout|
|
474
|
+
Bridgetown::Utils::RubyExec.search_data_for_ruby_code(layout, self)
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
464
478
|
def render_docs(payload)
|
465
479
|
collections.each_value do |collection|
|
466
480
|
collection.docs.each do |document|
|
@@ -186,11 +186,7 @@ module Bridgetown
|
|
186
186
|
private
|
187
187
|
|
188
188
|
def copy_file(dest_path)
|
189
|
-
|
190
|
-
FileUtils.cp(path, dest_path)
|
191
|
-
else
|
192
|
-
FileUtils.copy_entry(path, dest_path)
|
193
|
-
end
|
189
|
+
FileUtils.copy_entry(path, dest_path)
|
194
190
|
|
195
191
|
unless File.symlink?(dest_path)
|
196
192
|
File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path)
|
@@ -6,6 +6,7 @@ module Bridgetown
|
|
6
6
|
autoload :Ansi, "bridgetown-core/utils/ansi"
|
7
7
|
autoload :Exec, "bridgetown-core/utils/exec"
|
8
8
|
autoload :Internet, "bridgetown-core/utils/internet"
|
9
|
+
autoload :RubyExec, "bridgetown-core/utils/ruby_exec"
|
9
10
|
autoload :Platforms, "bridgetown-core/utils/platforms"
|
10
11
|
autoload :ThreadEvent, "bridgetown-core/utils/thread_event"
|
11
12
|
autoload :WinTZ, "bridgetown-core/utils/win_tz"
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bridgetown
|
4
|
+
module Utils
|
5
|
+
module RubyExec
|
6
|
+
extend self
|
7
|
+
|
8
|
+
# rubocop:disable Metrics/AbcSize
|
9
|
+
def search_data_for_ruby_code(convertible, renderer)
|
10
|
+
return if convertible.data.empty?
|
11
|
+
|
12
|
+
# Iterate using `keys` here so inline Ruby script can add new data keys
|
13
|
+
# if necessary without an error
|
14
|
+
data_keys = convertible.data.keys
|
15
|
+
data_keys.each do |k|
|
16
|
+
v = convertible.data[k]
|
17
|
+
next unless v.is_a?(Rb) || v.is_a?(Hash)
|
18
|
+
|
19
|
+
if v.is_a?(Hash)
|
20
|
+
v.each do |nested_k, nested_v|
|
21
|
+
next unless nested_v.is_a?(Rb)
|
22
|
+
|
23
|
+
Bridgetown.logger.warn("Executing inline Ruby…", convertible.relative_path)
|
24
|
+
convertible.data[k][nested_k] = run(nested_v, convertible, renderer)
|
25
|
+
Bridgetown.logger.warn("Inline Ruby completed!", convertible.relative_path)
|
26
|
+
end
|
27
|
+
else
|
28
|
+
Bridgetown.logger.warn("Executing inline Ruby…", convertible.relative_path)
|
29
|
+
convertible.data[k] = run(v, convertible, renderer)
|
30
|
+
Bridgetown.logger.warn("Inline Ruby completed!", convertible.relative_path)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
# rubocop:enable Metrics/AbcSize
|
35
|
+
|
36
|
+
# Sets up a new context in which to eval Ruby coming from front matter.
|
37
|
+
#
|
38
|
+
# ruby_code - a string of code
|
39
|
+
# convertible - the Document/Page/Layout with the Ruby front matter
|
40
|
+
# renderer - the Renderer instance that's processing the document (optional)
|
41
|
+
#
|
42
|
+
# Returns the transformed output of the code
|
43
|
+
def run(ruby_code, convertible, renderer)
|
44
|
+
return unless ruby_code.is_a?(Rb)
|
45
|
+
|
46
|
+
klass = Class.new
|
47
|
+
obj = klass.new
|
48
|
+
|
49
|
+
if convertible.is_a?(Layout)
|
50
|
+
klass.attr_accessor :layout, :site, :data
|
51
|
+
obj.layout = convertible
|
52
|
+
else
|
53
|
+
klass.attr_accessor :document, :page, :renderer, :site, :data
|
54
|
+
obj.document = obj.page = convertible
|
55
|
+
obj.renderer = renderer
|
56
|
+
end
|
57
|
+
obj.site = convertible.site
|
58
|
+
obj.data = convertible.data
|
59
|
+
|
60
|
+
# This is where the magic happens! DON'T BE EVIL!!! ;-)
|
61
|
+
output = obj.instance_eval(ruby_code)
|
62
|
+
|
63
|
+
output = Bridgetown::Utils.stringify_hash_keys(output) if output.is_a?(Hash)
|
64
|
+
|
65
|
+
output
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bridgetown-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bridgetown Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: i18n
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -272,6 +286,7 @@ files:
|
|
272
286
|
- lib/bridgetown-core/utils/exec.rb
|
273
287
|
- lib/bridgetown-core/utils/internet.rb
|
274
288
|
- lib/bridgetown-core/utils/platforms.rb
|
289
|
+
- lib/bridgetown-core/utils/ruby_exec.rb
|
275
290
|
- lib/bridgetown-core/utils/thread_event.rb
|
276
291
|
- lib/bridgetown-core/utils/win_tz.rb
|
277
292
|
- lib/bridgetown-core/version.rb
|
@@ -294,6 +309,7 @@ files:
|
|
294
309
|
- lib/site_template/src/_layouts/post.html
|
295
310
|
- lib/site_template/src/_posts/0000-00-00-welcome-to-bridgetown.md.erb
|
296
311
|
- lib/site_template/src/about.md
|
312
|
+
- lib/site_template/src/favicon.ico
|
297
313
|
- lib/site_template/src/index.md
|
298
314
|
- lib/site_template/start.js
|
299
315
|
- lib/site_template/sync.js
|