bridgetown-core 0.21.2 → 1.0.0.alpha2
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/.rubocop.yml +35 -0
- data/Rakefile +5 -5
- data/bin/bridgetown +2 -0
- data/bridgetown-core.gemspec +3 -0
- data/lib/bridgetown-core/cache.rb +3 -5
- data/lib/bridgetown-core/cleaner.rb +2 -10
- data/lib/bridgetown-core/collection.rb +62 -86
- data/lib/bridgetown-core/commands/base.rb +62 -2
- data/lib/bridgetown-core/commands/build.rb +33 -12
- data/lib/bridgetown-core/commands/concerns/actions.rb +2 -2
- data/lib/bridgetown-core/commands/concerns/build_options.rb +3 -10
- data/lib/bridgetown-core/commands/concerns/configuration_overridable.rb +3 -1
- data/lib/bridgetown-core/commands/console.rb +3 -3
- data/lib/bridgetown-core/commands/doctor.rb +13 -11
- data/lib/bridgetown-core/commands/new.rb +14 -6
- data/lib/bridgetown-core/commands/plugins.rb +8 -11
- data/lib/bridgetown-core/commands/serve/servlet.rb +4 -4
- data/lib/bridgetown-core/commands/serve.rb +37 -37
- data/lib/bridgetown-core/commands/start.rb +106 -0
- data/lib/bridgetown-core/commands/webpack/webpack.defaults.js.erb +2 -2
- data/lib/bridgetown-core/commands/webpack.rb +1 -1
- data/lib/bridgetown-core/component.rb +1 -5
- data/lib/bridgetown-core/concerns/site/configurable.rb +1 -13
- data/lib/bridgetown-core/concerns/site/content.rb +17 -118
- data/lib/bridgetown-core/concerns/site/extensible.rb +3 -4
- data/lib/bridgetown-core/concerns/site/localizable.rb +3 -1
- data/lib/bridgetown-core/concerns/site/processable.rb +9 -20
- data/lib/bridgetown-core/concerns/site/renderable.rb +19 -30
- data/lib/bridgetown-core/concerns/site/ssr.rb +53 -0
- data/lib/bridgetown-core/concerns/site/writable.rb +6 -9
- data/lib/bridgetown-core/configuration.rb +19 -48
- data/lib/bridgetown-core/configurations/minitesting.rb +1 -1
- data/lib/bridgetown-core/configurations/turbo.rb +1 -1
- data/lib/bridgetown-core/converter.rb +1 -0
- data/lib/bridgetown-core/converters/erb_templates.rb +3 -2
- data/lib/bridgetown-core/converters/liquid_templates.rb +3 -2
- data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
- data/lib/bridgetown-core/converters/smartypants.rb +1 -0
- data/lib/bridgetown-core/current.rb +4 -0
- data/lib/bridgetown-core/drops/collection_drop.rb +1 -1
- data/lib/bridgetown-core/drops/drop.rb +4 -4
- data/lib/bridgetown-core/drops/generated_page_drop.rb +23 -0
- data/lib/bridgetown-core/drops/resource_drop.rb +3 -3
- data/lib/bridgetown-core/drops/site_drop.rb +3 -47
- data/lib/bridgetown-core/entry_filter.rb +1 -0
- data/lib/bridgetown-core/errors.rb +0 -2
- data/lib/bridgetown-core/filters/url_filters.rb +2 -0
- data/lib/bridgetown-core/filters.rb +11 -12
- data/lib/bridgetown-core/frontmatter_defaults.rb +52 -90
- data/lib/bridgetown-core/{page.rb → generated_page.rb} +34 -60
- data/lib/bridgetown-core/generators/prototype_generator.rb +49 -61
- data/lib/bridgetown-core/helpers.rb +8 -3
- data/lib/bridgetown-core/hooks.rb +2 -2
- data/lib/bridgetown-core/layout.rb +15 -4
- data/lib/bridgetown-core/liquid_renderer.rb +1 -3
- data/lib/bridgetown-core/log_adapter.rb +1 -1
- data/lib/bridgetown-core/log_writer.rb +7 -1
- data/lib/bridgetown-core/model/base.rb +12 -4
- data/lib/bridgetown-core/model/builder_origin.rb +23 -11
- data/lib/bridgetown-core/model/origin.rb +3 -0
- data/lib/bridgetown-core/model/plugin_origin.rb +34 -0
- data/lib/bridgetown-core/model/repo_origin.rb +1 -1
- data/lib/bridgetown-core/plugin_manager.rb +10 -10
- data/lib/bridgetown-core/publisher.rb +1 -1
- data/lib/bridgetown-core/rack/boot.rb +47 -0
- data/lib/bridgetown-core/rack/logger.rb +22 -0
- data/lib/bridgetown-core/rack/roda.rb +66 -0
- data/lib/bridgetown-core/rack/routes.rb +88 -0
- data/lib/bridgetown-core/rack/static_indexes.rb +30 -0
- data/lib/bridgetown-core/reader.rb +20 -47
- data/lib/bridgetown-core/readers/layout_reader.rb +2 -2
- data/lib/bridgetown-core/readers/plugin_content_reader.rb +8 -7
- data/lib/bridgetown-core/renderer.rb +2 -12
- data/lib/bridgetown-core/resource/base.rb +51 -27
- data/lib/bridgetown-core/resource/permalink_processor.rb +23 -12
- data/lib/bridgetown-core/resource/relations.rb +2 -3
- data/lib/bridgetown-core/resource/taxonomy_term.rb +1 -5
- data/lib/bridgetown-core/resource/transformer.rb +8 -6
- data/lib/bridgetown-core/ruby_template_view.rb +6 -8
- data/lib/bridgetown-core/site.rb +4 -8
- data/lib/bridgetown-core/static_file.rb +14 -21
- data/lib/bridgetown-core/tags/find.rb +6 -6
- data/lib/bridgetown-core/tags/highlight.rb +5 -5
- data/lib/bridgetown-core/tags/include.rb +22 -32
- data/lib/bridgetown-core/tags/link.rb +4 -0
- data/lib/bridgetown-core/tags/live_reload_dev_js.rb +13 -0
- data/lib/bridgetown-core/tags/post_url.rb +9 -14
- data/lib/bridgetown-core/tags/render_content.rb +2 -2
- data/lib/bridgetown-core/tasks/bridgetown_tasks.rake +54 -0
- data/lib/bridgetown-core/url.rb +5 -4
- data/lib/bridgetown-core/utils/aux.rb +57 -0
- data/lib/bridgetown-core/utils/ruby_exec.rb +3 -45
- data/lib/bridgetown-core/utils/ruby_front_matter.rb +22 -7
- data/lib/bridgetown-core/utils.rb +60 -33
- data/lib/bridgetown-core/version.rb +2 -2
- data/lib/bridgetown-core/watcher.rb +4 -6
- data/lib/bridgetown-core.rb +16 -23
- data/lib/site_template/Gemfile.erb +6 -2
- data/lib/site_template/README.md +6 -6
- data/lib/site_template/Rakefile +49 -0
- data/lib/site_template/bridgetown.config.yml +2 -3
- data/lib/site_template/config/puma.rb +27 -0
- data/lib/site_template/config.ru +7 -0
- data/lib/site_template/frontend/javascript/index.js.erb +3 -3
- data/lib/site_template/package.json.erb +7 -12
- data/lib/site_template/server/roda_app.rb +22 -0
- data/lib/site_template/server/routes/hello.rb.sample +10 -0
- data/lib/site_template/src/_components/head.liquid +2 -1
- data/lib/site_template/src/about.md +0 -1
- data/lib/site_template/src/posts.md +2 -3
- metadata +63 -18
- data/lib/bridgetown-core/concerns/data_accessible.rb +0 -20
- data/lib/bridgetown-core/concerns/validatable.rb +0 -56
- data/lib/bridgetown-core/document.rb +0 -437
- data/lib/bridgetown-core/drops/document_drop.rb +0 -80
- data/lib/bridgetown-core/drops/excerpt_drop.rb +0 -19
- data/lib/bridgetown-core/drops/page_drop.rb +0 -18
- data/lib/bridgetown-core/excerpt.rb +0 -200
- data/lib/bridgetown-core/readers/data_reader.rb +0 -89
- data/lib/bridgetown-core/readers/page_reader.rb +0 -26
- data/lib/bridgetown-core/readers/post_reader.rb +0 -109
- data/lib/bridgetown-core/regenerator.rb +0 -202
- data/lib/bridgetown-core/related_posts.rb +0 -55
- data/lib/site_template/config/.keep +0 -0
- data/lib/site_template/start.js +0 -17
- data/lib/site_template/sync.js +0 -35
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a735962a1880837aa59641e65afa3985f0ebb091861ae32972d0b875229cfc7d
|
|
4
|
+
data.tar.gz: a64d7710c18a4c80805bd7196eacd07387fa1b3061616e8ed2b4de8b9a228871
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7c136fee524ff82c30ceedcc8ef0ef11fc877ac82066c6bd1d16e0d55cc47391b2b211b72c9f2229d7d83685edb98968e516d2eea09510a1c7c3c4ab0466e6e9
|
|
7
|
+
data.tar.gz: 05b65d5c57dfdbd0dcea25ab15875b637868ecd4c69a76a288fe23dd64dc06eb2c3ee6ec980f30b3957888859fbed2e7771a007cf7188cf7572808a17a5c9372
|
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
inherit_from: ../.rubocop.yml
|
|
3
|
+
|
|
4
|
+
AllCops:
|
|
5
|
+
Exclude:
|
|
6
|
+
- "*.gemspec"
|
|
7
|
+
- bin/**/*
|
|
8
|
+
- exe/**/*
|
|
9
|
+
- benchmark/**/*
|
|
10
|
+
- script/**/*
|
|
11
|
+
- vendor/**/*
|
|
12
|
+
- tmp/**/*
|
|
13
|
+
- test/source/**/*
|
|
14
|
+
- lib/site_template/Rakefile
|
|
15
|
+
- lib/site_template/config.ru
|
|
16
|
+
- lib/site_template/config/**/*
|
|
17
|
+
- lib/site_template/plugins/site_builder.rb
|
|
18
|
+
|
|
19
|
+
Lint/ConstantDefinitionInBlock:
|
|
20
|
+
Exclude:
|
|
21
|
+
- test/test_filters.rb
|
|
22
|
+
- test/test_liquid_extensions.rb
|
|
23
|
+
- test/test_site.rb
|
|
24
|
+
|
|
25
|
+
Lint/MissingSuper:
|
|
26
|
+
Exclude:
|
|
27
|
+
- test/test_liquid_extensions.rb
|
|
28
|
+
|
|
29
|
+
Performance/CollectionLiteralInLoop:
|
|
30
|
+
Exclude:
|
|
31
|
+
- test/test_filters.rb
|
|
32
|
+
|
|
33
|
+
Style/StringConcatenation:
|
|
34
|
+
Exclude:
|
|
35
|
+
- test/test_apply_command.rb
|
data/Rakefile
CHANGED
|
@@ -13,16 +13,16 @@ Rake::TestTask.new(:test) do |test|
|
|
|
13
13
|
test.verbose = true
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
require
|
|
16
|
+
require "yard"
|
|
17
17
|
YARD::Rake::YardocTask.new(:yard) do |t|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
t.files = ["lib/**/*.rb"]
|
|
19
|
+
t.options = ["--no-output"]
|
|
20
|
+
t.stats_options = ["--list-undoc"]
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
namespace :yard do
|
|
24
24
|
task :serve do
|
|
25
|
-
port = ENV[
|
|
25
|
+
port = ENV["YARD_PORT"] || "8808"
|
|
26
26
|
sh("yard server --reload -p #{port}")
|
|
27
27
|
end
|
|
28
28
|
end
|
data/bin/bridgetown
CHANGED
data/bridgetown-core.gemspec
CHANGED
|
@@ -46,6 +46,9 @@ Gem::Specification.new do |s|
|
|
|
46
46
|
s.add_runtime_dependency("liquid", "~> 5.0")
|
|
47
47
|
s.add_runtime_dependency("liquid-component", ">= 0.1")
|
|
48
48
|
s.add_runtime_dependency("listen", "~> 3.0")
|
|
49
|
+
s.add_runtime_dependency("rack-indifferent", ">= 1.2.0")
|
|
50
|
+
s.add_runtime_dependency("rake", ">= 13.0")
|
|
51
|
+
s.add_runtime_dependency("roda", "~> 3.46")
|
|
49
52
|
s.add_runtime_dependency("rouge", "~> 3.0")
|
|
50
53
|
s.add_runtime_dependency("terminal-table", "~> 1.8")
|
|
51
54
|
s.add_runtime_dependency("thor", "~> 1.1")
|
|
@@ -82,11 +82,9 @@ module Bridgetown
|
|
|
82
82
|
return @cache[key] if @cache.key?(key)
|
|
83
83
|
|
|
84
84
|
path = path_to(hash(key))
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
raise
|
|
89
|
-
end
|
|
85
|
+
raise unless disk_cache_enabled? && File.file?(path) && File.readable?(path)
|
|
86
|
+
|
|
87
|
+
@cache[key] = load(path)
|
|
90
88
|
end
|
|
91
89
|
|
|
92
90
|
# Add an item to cache
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Bridgetown
|
|
4
4
|
# Handles the cleanup of a site's destination before it is built.
|
|
5
5
|
class Cleaner
|
|
6
|
-
HIDDEN_FILE_REGEX = %r
|
|
6
|
+
HIDDEN_FILE_REGEX = %r!/\.{1,2}$!.freeze
|
|
7
7
|
attr_reader :site
|
|
8
8
|
|
|
9
9
|
def initialize(site)
|
|
@@ -13,7 +13,6 @@ module Bridgetown
|
|
|
13
13
|
# Cleans up the site's destination directory
|
|
14
14
|
def cleanup!
|
|
15
15
|
FileUtils.rm_rf(obsolete_files)
|
|
16
|
-
FileUtils.rm_rf(metadata_file) unless @site.incremental?
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
private
|
|
@@ -28,13 +27,6 @@ module Bridgetown
|
|
|
28
27
|
out
|
|
29
28
|
end
|
|
30
29
|
|
|
31
|
-
# Private: The metadata file storing dependency tree and build history
|
|
32
|
-
#
|
|
33
|
-
# Returns an Array with the metdata file as the only item
|
|
34
|
-
def metadata_file
|
|
35
|
-
[site.regenerator.metadata_file]
|
|
36
|
-
end
|
|
37
|
-
|
|
38
30
|
# Private: The list of existing files, apart from those included in
|
|
39
31
|
# keep_files and hidden files.
|
|
40
32
|
#
|
|
@@ -112,7 +104,7 @@ module Bridgetown
|
|
|
112
104
|
#
|
|
113
105
|
# Returns the regular expression
|
|
114
106
|
def keep_file_regex
|
|
115
|
-
%r!\A#{Regexp.quote(site.dest)}
|
|
107
|
+
%r!\A#{Regexp.quote(site.dest)}/(#{Regexp.union(site.config.keep_files).source})!
|
|
116
108
|
end
|
|
117
109
|
end
|
|
118
110
|
end
|
|
@@ -6,7 +6,6 @@ module Bridgetown
|
|
|
6
6
|
attr_reader :site
|
|
7
7
|
|
|
8
8
|
attr_reader :label, :metadata
|
|
9
|
-
attr_writer :docs
|
|
10
9
|
|
|
11
10
|
attr_writer :resources
|
|
12
11
|
|
|
@@ -24,22 +23,10 @@ module Bridgetown
|
|
|
24
23
|
label.in? %w(posts pages data).freeze
|
|
25
24
|
end
|
|
26
25
|
|
|
27
|
-
def legacy_reader?
|
|
28
|
-
label.in? %w(posts data).freeze
|
|
29
|
-
end
|
|
30
|
-
|
|
31
26
|
def data?
|
|
32
27
|
label == "data"
|
|
33
28
|
end
|
|
34
29
|
|
|
35
|
-
# Fetch the Documents in this collection.
|
|
36
|
-
# Defaults to an empty array if no documents have been read in.
|
|
37
|
-
#
|
|
38
|
-
# @return [Array<Bridgetown::Document>]
|
|
39
|
-
def docs
|
|
40
|
-
@docs ||= []
|
|
41
|
-
end
|
|
42
|
-
|
|
43
30
|
# Fetch the Resources in this collection.
|
|
44
31
|
# Defaults to an empty array if no resources have been read in.
|
|
45
32
|
#
|
|
@@ -48,10 +35,23 @@ module Bridgetown
|
|
|
48
35
|
@resources ||= []
|
|
49
36
|
end
|
|
50
37
|
|
|
51
|
-
#
|
|
52
|
-
#
|
|
38
|
+
# Fetch the collection resources and arrange them by slug in a hash.
|
|
39
|
+
#
|
|
40
|
+
# @return [Hash<String, Bridgetown::Resource::Base>]
|
|
41
|
+
def resources_by_slug
|
|
42
|
+
resources.group_by { |item| item.data.slug }.transform_values(&:first)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Fetch the collection resources and arrange them by relative URL in a hash.
|
|
46
|
+
#
|
|
47
|
+
# @return [Hash<String, Bridgetown::Resource::Base>]
|
|
48
|
+
def resources_by_relative_url
|
|
49
|
+
resources.group_by(&:relative_url).transform_values(&:first)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Iterate over Resources
|
|
53
53
|
def each(&block)
|
|
54
|
-
|
|
54
|
+
resources.each(&block)
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
# Fetch the static files in this collection.
|
|
@@ -67,38 +67,32 @@ module Bridgetown
|
|
|
67
67
|
static_files
|
|
68
68
|
end
|
|
69
69
|
|
|
70
|
-
# Read the allowed
|
|
70
|
+
# Read the allowed resources into the collection's array of resources.
|
|
71
71
|
#
|
|
72
72
|
# @return [Bridgetown::Collection] self
|
|
73
|
-
def read
|
|
73
|
+
def read
|
|
74
74
|
filtered_entries.each do |file_path|
|
|
75
75
|
full_path = collection_dir(file_path)
|
|
76
76
|
next if File.directory?(full_path)
|
|
77
77
|
|
|
78
|
-
if
|
|
79
|
-
next if File.basename(file_path).starts_with?("_")
|
|
78
|
+
next if File.basename(file_path).starts_with?("_")
|
|
80
79
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
else
|
|
85
|
-
read_static_file(file_path, full_path)
|
|
86
|
-
end
|
|
87
|
-
elsif Utils.has_yaml_header? full_path
|
|
88
|
-
read_document(full_path)
|
|
80
|
+
if label == "data" || Utils.has_yaml_header?(full_path) ||
|
|
81
|
+
Utils.has_rbfm_header?(full_path)
|
|
82
|
+
read_resource(full_path)
|
|
89
83
|
else
|
|
90
84
|
read_static_file(file_path, full_path)
|
|
91
85
|
end
|
|
92
86
|
end
|
|
93
87
|
site.static_files.concat(static_files)
|
|
94
|
-
|
|
88
|
+
sort_resources!
|
|
95
89
|
|
|
96
90
|
self
|
|
97
91
|
end
|
|
98
92
|
|
|
99
93
|
# All the entries in this collection.
|
|
100
94
|
#
|
|
101
|
-
# @return [Array<String>] file paths to the
|
|
95
|
+
# @return [Array<String>] file paths to the resources in this collection
|
|
102
96
|
# relative to the collection's folder
|
|
103
97
|
def entries
|
|
104
98
|
return [] unless exists?
|
|
@@ -178,7 +172,7 @@ module Bridgetown
|
|
|
178
172
|
@entry_filter ||= Bridgetown::EntryFilter.new(
|
|
179
173
|
site,
|
|
180
174
|
base_directory: folder_name,
|
|
181
|
-
include_underscores:
|
|
175
|
+
include_underscores: true
|
|
182
176
|
)
|
|
183
177
|
end
|
|
184
178
|
|
|
@@ -186,7 +180,7 @@ module Bridgetown
|
|
|
186
180
|
#
|
|
187
181
|
# @return [String]
|
|
188
182
|
def inspect
|
|
189
|
-
"#<#{self.class} @label=#{label}
|
|
183
|
+
"#<#{self.class} @label=#{label} resources=#{resources}>"
|
|
190
184
|
end
|
|
191
185
|
|
|
192
186
|
# Produce a sanitized label name
|
|
@@ -196,13 +190,13 @@ module Bridgetown
|
|
|
196
190
|
# @param label [String] the possibly-unsafe label
|
|
197
191
|
# @return [String] sanitized version of the label.
|
|
198
192
|
def sanitize_label(label)
|
|
199
|
-
label.gsub(%r![^a-z0-9_
|
|
193
|
+
label.gsub(%r![^a-z0-9_\-.]!i, "")
|
|
200
194
|
end
|
|
201
195
|
|
|
202
196
|
# Produce a representation of this Collection for use in Liquid.
|
|
203
197
|
# Exposes two attributes:
|
|
204
198
|
# - label
|
|
205
|
-
# -
|
|
199
|
+
# - resources
|
|
206
200
|
#
|
|
207
201
|
# @return [Bridgetown::Drops::CollectionDrop] representation of this
|
|
208
202
|
# collection for use in Liquid
|
|
@@ -210,7 +204,7 @@ module Bridgetown
|
|
|
210
204
|
Drops::CollectionDrop.new self
|
|
211
205
|
end
|
|
212
206
|
|
|
213
|
-
# Whether the collection's
|
|
207
|
+
# Whether the collection's resources ought to be written as individual
|
|
214
208
|
# files in the output.
|
|
215
209
|
#
|
|
216
210
|
# @return [Boolean] true if the 'write' metadata is true, false otherwise.
|
|
@@ -221,18 +215,7 @@ module Bridgetown
|
|
|
221
215
|
# Used by Resource's permalink processor
|
|
222
216
|
# @return [String]
|
|
223
217
|
def default_permalink
|
|
224
|
-
metadata.fetch("permalink")
|
|
225
|
-
"/:collection/:path/"
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
# LEGACY: The URL template to render collection's documents at.
|
|
230
|
-
#
|
|
231
|
-
# @return [String]
|
|
232
|
-
def url_template
|
|
233
|
-
@url_template ||= metadata.fetch("permalink") do
|
|
234
|
-
Utils.add_permalink_suffix("/:collection/:path", site.permalink_style)
|
|
235
|
-
end
|
|
218
|
+
metadata.fetch("permalink", "/:collection/:path/")
|
|
236
219
|
end
|
|
237
220
|
|
|
238
221
|
# Extract options for this collection from the site configuration.
|
|
@@ -242,7 +225,7 @@ module Bridgetown
|
|
|
242
225
|
site.config.collections[label] || HashWithDotAccess::Hash.new
|
|
243
226
|
end
|
|
244
227
|
|
|
245
|
-
def merge_data_resources # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
|
|
228
|
+
def merge_data_resources # rubocop:todo Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
246
229
|
data_contents = {}
|
|
247
230
|
|
|
248
231
|
sanitize_filename = ->(name) do
|
|
@@ -287,11 +270,30 @@ module Bridgetown
|
|
|
287
270
|
|
|
288
271
|
# Read in resource from repo path
|
|
289
272
|
# @param full_path [String]
|
|
290
|
-
def read_resource(full_path)
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
273
|
+
def read_resource(full_path, manifest: nil) # rubocop:todo Metrics/AbcSize
|
|
274
|
+
scheme = manifest ? "plugin" : "repo"
|
|
275
|
+
id = +"#{scheme}://#{label}.collection/"
|
|
276
|
+
id += "#{manifest.origin}/" if manifest
|
|
277
|
+
id += Addressable::URI.escape(
|
|
278
|
+
Pathname(full_path).relative_path_from(
|
|
279
|
+
manifest ? Pathname(manifest.content) : Pathname(site.source)
|
|
280
|
+
).to_s
|
|
281
|
+
).gsub("#", "%23")
|
|
282
|
+
model = Bridgetown::Model::Base.find(id)
|
|
283
|
+
|
|
284
|
+
if model.attributes.key?(:locale) && model.locale.to_sym == :multi
|
|
285
|
+
site.config.available_locales.each do |locale|
|
|
286
|
+
model.locale = locale
|
|
287
|
+
add_model_resource model
|
|
288
|
+
end
|
|
289
|
+
return
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
add_model_resource model
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def add_model_resource(model)
|
|
296
|
+
resource = model.to_resource.read!
|
|
295
297
|
resources << resource if site.config.unpublished || resource.published?
|
|
296
298
|
end
|
|
297
299
|
|
|
@@ -301,50 +303,24 @@ module Bridgetown
|
|
|
301
303
|
@container ||= site.config["collections_dir"]
|
|
302
304
|
end
|
|
303
305
|
|
|
304
|
-
def
|
|
305
|
-
doc = Document.new(full_path, site: site, collection: self).tap(&:read)
|
|
306
|
-
docs << doc if site.config.unpublished || doc.published?
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
def sort_docs!
|
|
306
|
+
def sort_resources!
|
|
310
307
|
if metadata["sort_by"].is_a?(String)
|
|
311
|
-
sort_docs_by_key!
|
|
312
308
|
sort_resources_by_key!
|
|
313
309
|
else
|
|
314
|
-
docs.sort!
|
|
315
310
|
resources.sort!
|
|
316
311
|
end
|
|
317
|
-
docs.reverse! if metadata.sort_direction == "descending"
|
|
318
312
|
resources.reverse! if metadata.sort_direction == "descending"
|
|
319
313
|
end
|
|
320
314
|
|
|
321
315
|
# A custom sort function based on Schwartzian transform
|
|
322
316
|
# Refer https://byparker.com/blog/2017/schwartzian-transform-faster-sorting/ for details
|
|
323
|
-
def sort_docs_by_key!
|
|
324
|
-
meta_key = metadata["sort_by"]
|
|
325
|
-
# Modify `docs` array to cache document's property along with the Document instance
|
|
326
|
-
docs.map! { |doc| [doc.data[meta_key], doc] }.sort! do |apples, olives|
|
|
327
|
-
order = determine_sort_order(meta_key, apples, olives)
|
|
328
|
-
|
|
329
|
-
# Fall back to `Document#<=>` if the properties were equal or were non-sortable
|
|
330
|
-
# Otherwise continue with current sort-order
|
|
331
|
-
if order.nil? || order.zero?
|
|
332
|
-
apples[-1] <=> olives[-1]
|
|
333
|
-
else
|
|
334
|
-
order
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
# Finally restore the `docs` array with just the Document objects themselves
|
|
338
|
-
end.map!(&:last)
|
|
339
|
-
end
|
|
340
|
-
|
|
341
317
|
def sort_resources_by_key!
|
|
342
318
|
meta_key = metadata["sort_by"]
|
|
343
|
-
# Modify
|
|
344
|
-
resources.map! { |
|
|
319
|
+
# Modify array to cache property along with the Resource instance
|
|
320
|
+
resources.map! { |r| [r.data[meta_key], r] }.sort! do |apples, olives|
|
|
345
321
|
order = determine_sort_order(meta_key, apples, olives)
|
|
346
322
|
|
|
347
|
-
# Fall back to `
|
|
323
|
+
# Fall back to `Resource::Base#<=>` if the properties were equal or were non-sortable
|
|
348
324
|
# Otherwise continue with current sort-order
|
|
349
325
|
if order.nil? || order.zero?
|
|
350
326
|
apples[-1] <=> olives[-1]
|
|
@@ -352,7 +328,7 @@ module Bridgetown
|
|
|
352
328
|
order
|
|
353
329
|
end
|
|
354
330
|
|
|
355
|
-
# Finally restore the `
|
|
331
|
+
# Finally restore the `resources` array with just the objects themselves
|
|
356
332
|
end.map!(&:last)
|
|
357
333
|
end
|
|
358
334
|
|
|
@@ -369,9 +345,9 @@ module Bridgetown
|
|
|
369
345
|
end
|
|
370
346
|
end
|
|
371
347
|
|
|
372
|
-
def order_with_warning(sort_key,
|
|
348
|
+
def order_with_warning(sort_key, resource, order)
|
|
373
349
|
Bridgetown.logger.warn "Sort warning:", "'#{sort_key}' not defined in" \
|
|
374
|
-
|
|
350
|
+
" #{resource.relative_path}"
|
|
375
351
|
order
|
|
376
352
|
end
|
|
377
353
|
|
|
@@ -17,13 +17,58 @@ module Bridgetown
|
|
|
17
17
|
class << self
|
|
18
18
|
# Override single character commands if necessary
|
|
19
19
|
def find_command_possibilities(subcommand)
|
|
20
|
-
|
|
20
|
+
case subcommand
|
|
21
|
+
when "c"
|
|
21
22
|
["console"]
|
|
23
|
+
when "s"
|
|
24
|
+
["start"]
|
|
22
25
|
else
|
|
23
26
|
super
|
|
24
27
|
end
|
|
25
28
|
end
|
|
29
|
+
|
|
30
|
+
def display_rake_tasks(rake)
|
|
31
|
+
rake.options.show_all_tasks = true
|
|
32
|
+
rake.options.show_task_pattern = Regexp.new("")
|
|
33
|
+
rake.options.show_tasks = :tasks
|
|
34
|
+
rake.display_tasks_and_comments
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Style/GlobalVars
|
|
38
|
+
def handle_no_command_error(cmd, _has_namespace = $thor_runner)
|
|
39
|
+
require "rake"
|
|
40
|
+
Rake::TaskManager.record_task_metadata = true
|
|
41
|
+
|
|
42
|
+
Rake.with_application do |rake|
|
|
43
|
+
rake.instance_variable_set(:@name, "bridgetown")
|
|
44
|
+
rake.standard_exception_handling do
|
|
45
|
+
rakefile, _location = rake.find_rakefile_location
|
|
46
|
+
unless rakefile
|
|
47
|
+
puts "No Rakefile found (searching: #{rake.class::DEFAULT_RAKEFILES.join(", ")})\n"
|
|
48
|
+
new.invoke("help")
|
|
49
|
+
return # rubocop:disable Lint/NonLocalExitFromIterator
|
|
50
|
+
end
|
|
51
|
+
rake.load_rakefile
|
|
52
|
+
rake.top_level
|
|
53
|
+
end
|
|
54
|
+
cmd = cmd.split("[")
|
|
55
|
+
args = []
|
|
56
|
+
if cmd[1]
|
|
57
|
+
args = cmd[1].gsub("\\,", "__COMMA__").delete_suffix!("]").split(",").map do |item|
|
|
58
|
+
item.gsub("__COMMA__", ",")
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if Rake::Task.task_defined?(cmd[0])
|
|
63
|
+
Rake::Task[cmd[0]].invoke(*args)
|
|
64
|
+
else
|
|
65
|
+
puts "Unknown task: #{cmd[0]}\n\nHere's a list of tasks you can run:"
|
|
66
|
+
display_rake_tasks(rake)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
26
70
|
end
|
|
71
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Style/GlobalVars
|
|
27
72
|
|
|
28
73
|
desc "dream", "There's a place where that idea still exists as a reality"
|
|
29
74
|
def dream
|
|
@@ -35,7 +80,7 @@ module Bridgetown
|
|
|
35
80
|
end
|
|
36
81
|
|
|
37
82
|
desc "help <command>", "Show detailed command usage information and exit"
|
|
38
|
-
def help(subcommand = nil)
|
|
83
|
+
def help(subcommand = nil) # rubocop:disable Metrics/MethodLength
|
|
39
84
|
if subcommand && respond_to?(subcommand)
|
|
40
85
|
klass = Kernel.const_get("Bridgetown::Commands::#{subcommand.capitalize}")
|
|
41
86
|
klass.start(["-h"])
|
|
@@ -47,6 +92,21 @@ module Bridgetown
|
|
|
47
92
|
puts " bridgetown <command> [options]"
|
|
48
93
|
puts ""
|
|
49
94
|
super
|
|
95
|
+
|
|
96
|
+
require "rake"
|
|
97
|
+
Rake::TaskManager.record_task_metadata = true
|
|
98
|
+
Rake.with_application do |rake|
|
|
99
|
+
rake.instance_variable_set(:@name, " bridgetown")
|
|
100
|
+
rake.standard_exception_handling do
|
|
101
|
+
rakefile, _location = rake.find_rakefile_location
|
|
102
|
+
return unless rakefile # rubocop:disable Lint/NonLocalExitFromIterator
|
|
103
|
+
|
|
104
|
+
rake.load_rakefile
|
|
105
|
+
rake.top_level
|
|
106
|
+
puts "Available Rake Tasks:"
|
|
107
|
+
self.class.display_rake_tasks(rake)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
50
110
|
end
|
|
51
111
|
end
|
|
52
112
|
end
|
|
@@ -21,21 +21,32 @@ module Bridgetown
|
|
|
21
21
|
aliases: "-w",
|
|
22
22
|
desc: "Watch for changes and rebuild"
|
|
23
23
|
|
|
24
|
+
def self.print_startup_message
|
|
25
|
+
Bridgetown.logger.info "Starting:", "Bridgetown v#{Bridgetown::VERSION.magenta}" \
|
|
26
|
+
" (codename \"#{Bridgetown::CODE_NAME.yellow}\")"
|
|
27
|
+
end
|
|
28
|
+
|
|
24
29
|
# Build your bridgetown site
|
|
25
30
|
# Continuously watch if `watch` is set to true in the config.
|
|
26
31
|
def build
|
|
27
32
|
Bridgetown.logger.adjust_verbosity(options)
|
|
28
33
|
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
unless caller_locations.find do |loc|
|
|
35
|
+
loc.to_s.include?("bridgetown-core/commands/start.rb")
|
|
36
|
+
end
|
|
37
|
+
self.class.print_startup_message
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
config_options = (
|
|
41
|
+
Bridgetown::Current.preloaded_configuration || configuration_with_overrides(options)
|
|
42
|
+
).merge(options)
|
|
31
43
|
|
|
32
|
-
config_options = Serve.loaded_config || configuration_with_overrides(options)
|
|
33
44
|
config_options["serving"] = false unless config_options["serving"]
|
|
34
45
|
@site = Bridgetown::Site.new(config_options)
|
|
35
46
|
|
|
36
47
|
if config_options.fetch("skip_initial_build", false)
|
|
37
48
|
Bridgetown.logger.warn "Build Warning:", "Skipping the initial build." \
|
|
38
|
-
|
|
49
|
+
" This may result in an out-of-date site."
|
|
39
50
|
else
|
|
40
51
|
build_site(config_options)
|
|
41
52
|
end
|
|
@@ -64,13 +75,23 @@ module Bridgetown
|
|
|
64
75
|
Bridgetown.logger.info "Unpublished mode:",
|
|
65
76
|
"enabled. Processing documents marked unpublished"
|
|
66
77
|
end
|
|
67
|
-
incremental = config_options["incremental"]
|
|
68
|
-
Bridgetown.logger.info "Incremental build:",
|
|
69
|
-
(incremental ? "enabled" : "disabled. Enable with --incremental")
|
|
70
78
|
Bridgetown.logger.info "Generating…"
|
|
71
79
|
@site.process
|
|
72
80
|
Bridgetown.logger.info "Done! 🎉", "#{"Completed".green} in less than" \
|
|
73
|
-
|
|
81
|
+
" #{(Time.now - t).ceil(2)} seconds."
|
|
82
|
+
|
|
83
|
+
return unless config_options[:using_puma]
|
|
84
|
+
|
|
85
|
+
require "socket"
|
|
86
|
+
external_ip = Socket.ip_address_list.find do |ai|
|
|
87
|
+
ai.ipv4? && !ai.ipv4_loopback?
|
|
88
|
+
end&.ip_address
|
|
89
|
+
scheme = config_options.bind&.split("://")&.first == "ssl" ? "https" : "http"
|
|
90
|
+
port = config_options.bind&.split(":")&.last || ENV["BRIDGETOWN_PORT"] || 4000
|
|
91
|
+
Bridgetown.logger.info ""
|
|
92
|
+
Bridgetown.logger.info "Now serving at:", "#{scheme}://localhost:#{port}".magenta
|
|
93
|
+
Bridgetown.logger.info "", "#{scheme}://#{external_ip}:#{port}".magenta if external_ip
|
|
94
|
+
Bridgetown.logger.info ""
|
|
74
95
|
end
|
|
75
96
|
|
|
76
97
|
# Watch for file changes and rebuild the site.
|
|
@@ -94,10 +115,10 @@ module Bridgetown
|
|
|
94
115
|
Bridgetown.logger.info "Source:", source
|
|
95
116
|
Bridgetown.logger.info "Destination:", destination
|
|
96
117
|
# TODO: work with arrays
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
118
|
+
return unless config_options["plugins_dir"].is_a?(String)
|
|
119
|
+
|
|
120
|
+
plugins_dir = File.expand_path(config_options["plugins_dir"])
|
|
121
|
+
Bridgetown.logger.info "Custom Plugins:", plugins_dir if Dir.exist?(plugins_dir)
|
|
101
122
|
end
|
|
102
123
|
end
|
|
103
124
|
end
|
|
@@ -25,7 +25,7 @@ module Bridgetown
|
|
|
25
25
|
create_file("plugins/builders/#{filename}", data, verbose: false)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def javascript_import(data = nil, filename: "index.js")
|
|
28
|
+
def javascript_import(data = nil, filename: "index.js") # rubocop:todo Metrics/PerceivedComplexity
|
|
29
29
|
data ||= yield if block_given?
|
|
30
30
|
data += "\n" unless data.chars.last == "\n"
|
|
31
31
|
|
|
@@ -97,7 +97,7 @@ module Bridgetown
|
|
|
97
97
|
github_match = GITHUB_REGEX.match(arg)
|
|
98
98
|
|
|
99
99
|
arg = if arg.start_with?("https://gist.github.com")
|
|
100
|
-
arg.sub(
|
|
100
|
+
arg.sub( # rubocop:disable Style/StringConcatenation
|
|
101
101
|
"https://gist.github.com", "https://gist.githubusercontent.com"
|
|
102
102
|
) + "/raw"
|
|
103
103
|
elsif github_match
|
|
@@ -33,18 +33,15 @@ module Bridgetown
|
|
|
33
33
|
klass.class_option :future,
|
|
34
34
|
type: :boolean,
|
|
35
35
|
desc: "Publishes posts with a future date"
|
|
36
|
-
klass.class_option :
|
|
37
|
-
|
|
38
|
-
desc: "
|
|
36
|
+
klass.class_option :url,
|
|
37
|
+
aliases: "-u",
|
|
38
|
+
desc: "Override the configured url for the website"
|
|
39
39
|
klass.class_option :base_path,
|
|
40
40
|
aliases: "-b",
|
|
41
41
|
desc: "Serve the website from the given base path"
|
|
42
42
|
klass.class_option :force_polling,
|
|
43
43
|
type: :boolean,
|
|
44
44
|
desc: "Force watch to use polling"
|
|
45
|
-
klass.class_option :lsi,
|
|
46
|
-
type: :boolean,
|
|
47
|
-
desc: "Use LSI for improved related posts"
|
|
48
45
|
klass.class_option :unpublished,
|
|
49
46
|
type: :boolean,
|
|
50
47
|
aliases: "-U",
|
|
@@ -63,10 +60,6 @@ module Bridgetown
|
|
|
63
60
|
aliases: "-V",
|
|
64
61
|
type: :boolean,
|
|
65
62
|
desc: "Print verbose output."
|
|
66
|
-
klass.class_option :incremental,
|
|
67
|
-
aliases: "-I",
|
|
68
|
-
type: :boolean,
|
|
69
|
-
desc: "Enable incremental rebuild."
|
|
70
63
|
klass.class_option :strict_front_matter,
|
|
71
64
|
type: :boolean,
|
|
72
65
|
desc: "Fail if errors are present in front matter"
|
|
@@ -11,7 +11,9 @@ module Bridgetown
|
|
|
11
11
|
def configuration_with_overrides(options)
|
|
12
12
|
return options if options.is_a?(Bridgetown::Configuration)
|
|
13
13
|
|
|
14
|
-
Bridgetown.configuration(options)
|
|
14
|
+
Bridgetown.configuration(options).tap do |new_config|
|
|
15
|
+
Bridgetown::Current.preloaded_configuration = new_config
|
|
16
|
+
end
|
|
15
17
|
end
|
|
16
18
|
end
|
|
17
19
|
end
|