jekyll 3.8.7 → 4.1.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/.rubocop.yml +71 -62
- data/LICENSE +1 -1
- data/README.markdown +46 -17
- data/lib/blank_template/_config.yml +3 -0
- data/lib/blank_template/_layouts/default.html +12 -0
- data/lib/blank_template/_sass/main.scss +9 -0
- data/lib/blank_template/assets/css/main.scss +4 -0
- data/lib/blank_template/index.md +8 -0
- data/lib/jekyll.rb +10 -1
- data/lib/jekyll/cache.rb +190 -0
- data/lib/jekyll/cleaner.rb +5 -4
- data/lib/jekyll/collection.rb +82 -10
- data/lib/jekyll/command.rb +33 -6
- data/lib/jekyll/commands/build.rb +11 -20
- data/lib/jekyll/commands/clean.rb +2 -0
- data/lib/jekyll/commands/doctor.rb +15 -8
- data/lib/jekyll/commands/help.rb +1 -1
- data/lib/jekyll/commands/new.rb +37 -35
- data/lib/jekyll/commands/new_theme.rb +30 -28
- data/lib/jekyll/commands/serve.rb +55 -81
- data/lib/jekyll/commands/serve/live_reload_reactor.rb +6 -10
- data/lib/jekyll/commands/serve/servlet.rb +22 -25
- data/lib/jekyll/commands/serve/websockets.rb +1 -1
- data/lib/jekyll/configuration.rb +61 -149
- data/lib/jekyll/converters/identity.rb +18 -0
- data/lib/jekyll/converters/markdown.rb +49 -40
- data/lib/jekyll/converters/markdown/kramdown_parser.rb +84 -11
- data/lib/jekyll/converters/smartypants.rb +34 -14
- data/lib/jekyll/convertible.rb +30 -31
- data/lib/jekyll/deprecator.rb +1 -3
- data/lib/jekyll/document.rb +89 -61
- data/lib/jekyll/drops/collection_drop.rb +2 -3
- data/lib/jekyll/drops/document_drop.rb +14 -1
- data/lib/jekyll/drops/drop.rb +17 -14
- data/lib/jekyll/drops/excerpt_drop.rb +4 -0
- data/lib/jekyll/drops/page_drop.rb +18 -0
- data/lib/jekyll/drops/site_drop.rb +6 -5
- data/lib/jekyll/drops/unified_payload_drop.rb +1 -0
- data/lib/jekyll/drops/url_drop.rb +53 -1
- data/lib/jekyll/entry_filter.rb +42 -45
- data/lib/jekyll/excerpt.rb +45 -34
- data/lib/jekyll/external.rb +10 -5
- data/lib/jekyll/filters.rb +200 -40
- data/lib/jekyll/filters/date_filters.rb +6 -3
- data/lib/jekyll/filters/grouping_filters.rb +1 -2
- data/lib/jekyll/filters/url_filters.rb +46 -14
- data/lib/jekyll/frontmatter_defaults.rb +46 -35
- data/lib/jekyll/hooks.rb +4 -8
- data/lib/jekyll/inclusion.rb +32 -0
- data/lib/jekyll/liquid_extensions.rb +0 -2
- data/lib/jekyll/liquid_renderer.rb +31 -16
- data/lib/jekyll/liquid_renderer/file.rb +24 -3
- data/lib/jekyll/liquid_renderer/table.rb +36 -77
- data/lib/jekyll/log_adapter.rb +5 -1
- data/lib/jekyll/mime.types +53 -11
- data/lib/jekyll/page.rb +54 -12
- data/lib/jekyll/page_excerpt.rb +26 -0
- data/lib/jekyll/page_without_a_file.rb +0 -4
- data/lib/jekyll/path_manager.rb +31 -0
- data/lib/jekyll/plugin.rb +5 -11
- data/lib/jekyll/plugin_manager.rb +2 -0
- data/lib/jekyll/profiler.rb +58 -0
- data/lib/jekyll/reader.rb +42 -9
- data/lib/jekyll/readers/collection_reader.rb +1 -0
- data/lib/jekyll/readers/data_reader.rb +8 -9
- data/lib/jekyll/readers/layout_reader.rb +3 -12
- data/lib/jekyll/readers/page_reader.rb +5 -5
- data/lib/jekyll/readers/post_reader.rb +31 -18
- data/lib/jekyll/readers/static_file_reader.rb +4 -4
- data/lib/jekyll/readers/theme_assets_reader.rb +8 -5
- data/lib/jekyll/regenerator.rb +4 -12
- data/lib/jekyll/renderer.rb +23 -40
- data/lib/jekyll/site.rb +91 -38
- data/lib/jekyll/static_file.rb +62 -21
- data/lib/jekyll/stevenson.rb +2 -3
- data/lib/jekyll/tags/highlight.rb +19 -51
- data/lib/jekyll/tags/include.rb +82 -42
- data/lib/jekyll/tags/link.rb +11 -7
- data/lib/jekyll/tags/post_url.rb +25 -21
- data/lib/jekyll/theme.rb +16 -18
- data/lib/jekyll/theme_builder.rb +91 -89
- data/lib/jekyll/url.rb +10 -5
- data/lib/jekyll/utils.rb +18 -21
- data/lib/jekyll/utils/ansi.rb +1 -1
- data/lib/jekyll/utils/exec.rb +0 -1
- data/lib/jekyll/utils/internet.rb +2 -4
- data/lib/jekyll/utils/platforms.rb +8 -8
- data/lib/jekyll/utils/thread_event.rb +1 -5
- data/lib/jekyll/utils/win_tz.rb +2 -2
- data/lib/jekyll/version.rb +1 -1
- data/lib/site_template/.gitignore +2 -0
- data/lib/site_template/404.html +1 -0
- data/lib/site_template/_config.yml +17 -5
- data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +5 -1
- data/lib/site_template/{about.md → about.markdown} +0 -0
- data/lib/site_template/{index.md → index.markdown} +0 -0
- data/lib/theme_template/gitignore.erb +1 -0
- data/lib/theme_template/theme.gemspec.erb +1 -4
- data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -0
- metadata +69 -31
- data/lib/jekyll/converters/markdown/rdiscount_parser.rb +0 -37
- data/lib/jekyll/converters/markdown/redcarpet_parser.rb +0 -112
- data/lib/jekyll/utils/rouge.rb +0 -22
data/lib/jekyll/cleaner.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Jekyll
|
|
4
4
|
# Handles the cleanup of a site's destination before it is built.
|
|
5
5
|
class Cleaner
|
|
6
|
-
HIDDEN_FILE_REGEX = %r!\/\.{1,2}
|
|
6
|
+
HIDDEN_FILE_REGEX = %r!\/\.{1,2}$!.freeze
|
|
7
7
|
attr_reader :site
|
|
8
8
|
|
|
9
9
|
def initialize(site)
|
|
@@ -45,6 +45,7 @@ module Jekyll
|
|
|
45
45
|
|
|
46
46
|
Utils.safe_glob(site.in_dest_dir, ["**", "*"], File::FNM_DOTMATCH).each do |file|
|
|
47
47
|
next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file)
|
|
48
|
+
|
|
48
49
|
files << file
|
|
49
50
|
end
|
|
50
51
|
|
|
@@ -65,7 +66,7 @@ module Jekyll
|
|
|
65
66
|
#
|
|
66
67
|
# Returns a Set with the directory paths
|
|
67
68
|
def new_dirs
|
|
68
|
-
@new_dirs ||= new_files.
|
|
69
|
+
@new_dirs ||= new_files.flat_map { |file| parent_dirs(file) }.to_set
|
|
69
70
|
end
|
|
70
71
|
|
|
71
72
|
# Private: The list of parent directories of a given file
|
|
@@ -76,7 +77,7 @@ module Jekyll
|
|
|
76
77
|
if parent_dir == site.dest
|
|
77
78
|
[]
|
|
78
79
|
else
|
|
79
|
-
|
|
80
|
+
parent_dirs(parent_dir).unshift(parent_dir)
|
|
80
81
|
end
|
|
81
82
|
end
|
|
82
83
|
|
|
@@ -93,7 +94,7 @@ module Jekyll
|
|
|
93
94
|
#
|
|
94
95
|
# Returns a Set with the directory paths
|
|
95
96
|
def keep_dirs
|
|
96
|
-
site.keep_files.
|
|
97
|
+
site.keep_files.flat_map { |file| parent_dirs(site.in_dest_dir(file)) }.to_set
|
|
97
98
|
end
|
|
98
99
|
|
|
99
100
|
# Private: Creates a regular expression from the config's keep_files array
|
data/lib/jekyll/collection.rb
CHANGED
|
@@ -35,7 +35,7 @@ module Jekyll
|
|
|
35
35
|
def method_missing(method, *args, &blck)
|
|
36
36
|
if docs.respond_to?(method.to_sym)
|
|
37
37
|
Jekyll.logger.warn "Deprecation:",
|
|
38
|
-
|
|
38
|
+
"#{label}.#{method} should be changed to #{label}.docs.#{method}."
|
|
39
39
|
Jekyll.logger.warn "", "Called by #{caller(0..0)}."
|
|
40
40
|
docs.public_send(method.to_sym, *args, &blck)
|
|
41
41
|
else
|
|
@@ -58,13 +58,14 @@ module Jekyll
|
|
|
58
58
|
filtered_entries.each do |file_path|
|
|
59
59
|
full_path = collection_dir(file_path)
|
|
60
60
|
next if File.directory?(full_path)
|
|
61
|
+
|
|
61
62
|
if Utils.has_yaml_header? full_path
|
|
62
63
|
read_document(full_path)
|
|
63
64
|
else
|
|
64
65
|
read_static_file(file_path, full_path)
|
|
65
66
|
end
|
|
66
67
|
end
|
|
67
|
-
|
|
68
|
+
sort_docs!
|
|
68
69
|
end
|
|
69
70
|
|
|
70
71
|
# All the entries in this collection.
|
|
@@ -73,11 +74,14 @@ module Jekyll
|
|
|
73
74
|
# relative to the collection's directory
|
|
74
75
|
def entries
|
|
75
76
|
return [] unless exists?
|
|
76
|
-
|
|
77
|
+
|
|
78
|
+
@entries ||= begin
|
|
79
|
+
collection_dir_slash = "#{collection_dir}/"
|
|
77
80
|
Utils.safe_glob(collection_dir, ["**", "*"], File::FNM_DOTMATCH).map do |entry|
|
|
78
|
-
entry[
|
|
81
|
+
entry[collection_dir_slash] = ""
|
|
79
82
|
entry
|
|
80
83
|
end
|
|
84
|
+
end
|
|
81
85
|
end
|
|
82
86
|
|
|
83
87
|
# Filtered version of the entries in this collection.
|
|
@@ -86,6 +90,7 @@ module Jekyll
|
|
|
86
90
|
# Returns a list of filtered entry paths.
|
|
87
91
|
def filtered_entries
|
|
88
92
|
return [] unless exists?
|
|
93
|
+
|
|
89
94
|
@filtered_entries ||=
|
|
90
95
|
Dir.chdir(directory) do
|
|
91
96
|
entry_filter.filter(entries).reject do |f|
|
|
@@ -124,6 +129,7 @@ module Jekyll
|
|
|
124
129
|
# is stored on the filesystem.
|
|
125
130
|
def collection_dir(*files)
|
|
126
131
|
return directory if files.empty?
|
|
132
|
+
|
|
127
133
|
site.in_source_dir(container, relative_directory, *files)
|
|
128
134
|
end
|
|
129
135
|
|
|
@@ -149,7 +155,7 @@ module Jekyll
|
|
|
149
155
|
#
|
|
150
156
|
# Returns the inspect string
|
|
151
157
|
def inspect
|
|
152
|
-
"
|
|
158
|
+
"#<#{self.class} @label=#{label} docs=#{docs}>"
|
|
153
159
|
end
|
|
154
160
|
|
|
155
161
|
# Produce a sanitized label name
|
|
@@ -207,17 +213,83 @@ module Jekyll
|
|
|
207
213
|
@container ||= site.config["collections_dir"]
|
|
208
214
|
end
|
|
209
215
|
|
|
210
|
-
private
|
|
211
|
-
|
|
212
216
|
def read_document(full_path)
|
|
213
217
|
doc = Document.new(full_path, :site => site, :collection => self)
|
|
214
218
|
doc.read
|
|
215
|
-
if site.unpublished || doc.published?
|
|
216
|
-
|
|
219
|
+
docs << doc if site.unpublished || doc.published?
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def sort_docs!
|
|
223
|
+
if metadata["order"].is_a?(Array)
|
|
224
|
+
rearrange_docs!
|
|
225
|
+
elsif metadata["sort_by"].is_a?(String)
|
|
226
|
+
sort_docs_by_key!
|
|
227
|
+
else
|
|
228
|
+
docs.sort!
|
|
217
229
|
end
|
|
218
230
|
end
|
|
219
231
|
|
|
220
|
-
|
|
232
|
+
# A custom sort function based on Schwartzian transform
|
|
233
|
+
# Refer https://byparker.com/blog/2017/schwartzian-transform-faster-sorting/ for details
|
|
234
|
+
def sort_docs_by_key!
|
|
235
|
+
meta_key = metadata["sort_by"]
|
|
236
|
+
# Modify `docs` array to cache document's property along with the Document instance
|
|
237
|
+
docs.map! { |doc| [doc.data[meta_key], doc] }.sort! do |apples, olives|
|
|
238
|
+
order = determine_sort_order(meta_key, apples, olives)
|
|
239
|
+
|
|
240
|
+
# Fall back to `Document#<=>` if the properties were equal or were non-sortable
|
|
241
|
+
# Otherwise continue with current sort-order
|
|
242
|
+
if order.nil? || order.zero?
|
|
243
|
+
apples[-1] <=> olives[-1]
|
|
244
|
+
else
|
|
245
|
+
order
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
# Finally restore the `docs` array with just the Document objects themselves
|
|
249
|
+
end.map!(&:last)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def determine_sort_order(sort_key, apples, olives)
|
|
253
|
+
apple_property, apple_document = apples
|
|
254
|
+
olive_property, olive_document = olives
|
|
255
|
+
|
|
256
|
+
if apple_property.nil? && !olive_property.nil?
|
|
257
|
+
order_with_warning(sort_key, apple_document, 1)
|
|
258
|
+
elsif !apple_property.nil? && olive_property.nil?
|
|
259
|
+
order_with_warning(sort_key, olive_document, -1)
|
|
260
|
+
else
|
|
261
|
+
apple_property <=> olive_property
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def order_with_warning(sort_key, document, order)
|
|
266
|
+
Jekyll.logger.warn "Sort warning:", "'#{sort_key}' not defined in #{document.relative_path}"
|
|
267
|
+
order
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# Rearrange documents within the `docs` array as listed in the `metadata["order"]` array.
|
|
271
|
+
#
|
|
272
|
+
# Involves converting the two arrays into hashes based on relative_paths as keys first, then
|
|
273
|
+
# merging them to remove duplicates and finally retrieving the Document instances from the
|
|
274
|
+
# merged array.
|
|
275
|
+
def rearrange_docs!
|
|
276
|
+
docs_table = {}
|
|
277
|
+
custom_order = {}
|
|
278
|
+
|
|
279
|
+
# pre-sort to normalize default array across platforms and then proceed to create a Hash
|
|
280
|
+
# from that sorted array.
|
|
281
|
+
docs.sort.each do |doc|
|
|
282
|
+
docs_table[doc.relative_path] = doc
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
metadata["order"].each do |entry|
|
|
286
|
+
custom_order[File.join(relative_directory, entry)] = nil
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
result = Jekyll::Utils.deep_merge_hashes(custom_order, docs_table).values
|
|
290
|
+
result.compact!
|
|
291
|
+
self.docs = result
|
|
292
|
+
end
|
|
221
293
|
|
|
222
294
|
def read_static_file(file_path, full_path)
|
|
223
295
|
relative_dir = Jekyll.sanitized_path(
|
data/lib/jekyll/command.rb
CHANGED
|
@@ -40,6 +40,7 @@ module Jekyll
|
|
|
40
40
|
# Returns a full Jekyll configuration
|
|
41
41
|
def configuration_from_options(options)
|
|
42
42
|
return options if options.is_a?(Jekyll::Configuration)
|
|
43
|
+
|
|
43
44
|
Jekyll.configuration(options)
|
|
44
45
|
end
|
|
45
46
|
|
|
@@ -51,28 +52,54 @@ module Jekyll
|
|
|
51
52
|
# rubocop:disable Metrics/MethodLength
|
|
52
53
|
def add_build_options(cmd)
|
|
53
54
|
cmd.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]",
|
|
54
|
-
|
|
55
|
+
Array, "Custom configuration file"
|
|
55
56
|
cmd.option "destination", "-d", "--destination DESTINATION",
|
|
56
|
-
|
|
57
|
+
"The current folder will be generated into DESTINATION"
|
|
57
58
|
cmd.option "source", "-s", "--source SOURCE", "Custom source directory"
|
|
58
59
|
cmd.option "future", "--future", "Publishes posts with a future date"
|
|
59
60
|
cmd.option "limit_posts", "--limit_posts MAX_POSTS", Integer,
|
|
60
|
-
|
|
61
|
+
"Limits the number of posts to parse and publish"
|
|
61
62
|
cmd.option "watch", "-w", "--[no-]watch", "Watch for changes and rebuild"
|
|
62
63
|
cmd.option "baseurl", "-b", "--baseurl URL",
|
|
63
|
-
|
|
64
|
+
"Serve the website from the given base URL"
|
|
64
65
|
cmd.option "force_polling", "--force_polling", "Force watch to use polling"
|
|
65
66
|
cmd.option "lsi", "--lsi", "Use LSI for improved related posts"
|
|
66
67
|
cmd.option "show_drafts", "-D", "--drafts", "Render posts in the _drafts folder"
|
|
67
68
|
cmd.option "unpublished", "--unpublished",
|
|
68
|
-
|
|
69
|
+
"Render posts that were marked as unpublished"
|
|
70
|
+
cmd.option "disable_disk_cache", "--disable-disk-cache",
|
|
71
|
+
"Disable caching to disk in non-safe mode"
|
|
69
72
|
cmd.option "quiet", "-q", "--quiet", "Silence output."
|
|
70
73
|
cmd.option "verbose", "-V", "--verbose", "Print verbose output."
|
|
71
74
|
cmd.option "incremental", "-I", "--incremental", "Enable incremental rebuild."
|
|
72
75
|
cmd.option "strict_front_matter", "--strict_front_matter",
|
|
73
|
-
|
|
76
|
+
"Fail if errors are present in front matter"
|
|
74
77
|
end
|
|
75
78
|
# rubocop:enable Metrics/MethodLength
|
|
79
|
+
|
|
80
|
+
# Run ::process method in a given set of Jekyll::Command subclasses and suggest
|
|
81
|
+
# re-running the associated command with --trace switch to obtain any additional
|
|
82
|
+
# information or backtrace regarding the encountered Exception.
|
|
83
|
+
#
|
|
84
|
+
# cmd - the Jekyll::Command to be handled
|
|
85
|
+
# options - configuration overrides
|
|
86
|
+
# klass - an array of Jekyll::Command subclasses associated with the command
|
|
87
|
+
#
|
|
88
|
+
# Note that all exceptions are rescued..
|
|
89
|
+
# rubocop: disable Lint/RescueException
|
|
90
|
+
def process_with_graceful_fail(cmd, options, *klass)
|
|
91
|
+
klass.each { |k| k.process(options) if k.respond_to?(:process) }
|
|
92
|
+
rescue Exception => e
|
|
93
|
+
raise e if cmd.trace
|
|
94
|
+
|
|
95
|
+
msg = " Please append `--trace` to the `#{cmd.name}` command "
|
|
96
|
+
dashes = "-" * msg.length
|
|
97
|
+
Jekyll.logger.error "", dashes
|
|
98
|
+
Jekyll.logger.error "Jekyll #{Jekyll::VERSION} ", msg
|
|
99
|
+
Jekyll.logger.error "", " for any additional information or backtrace. "
|
|
100
|
+
Jekyll.logger.abort_with "", dashes
|
|
101
|
+
end
|
|
102
|
+
# rubocop: enable Lint/RescueException
|
|
76
103
|
end
|
|
77
104
|
end
|
|
78
105
|
end
|
|
@@ -15,7 +15,7 @@ module Jekyll
|
|
|
15
15
|
|
|
16
16
|
c.action do |_, options|
|
|
17
17
|
options["serving"] = false
|
|
18
|
-
|
|
18
|
+
process_with_graceful_fail(c, options, self)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
end
|
|
@@ -31,14 +31,14 @@ module Jekyll
|
|
|
31
31
|
|
|
32
32
|
if options.fetch("skip_initial_build", false)
|
|
33
33
|
Jekyll.logger.warn "Build Warning:", "Skipping the initial build." \
|
|
34
|
-
|
|
34
|
+
" This may result in an out-of-date site."
|
|
35
35
|
else
|
|
36
36
|
build(site, options)
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
if options.fetch("detach", false)
|
|
40
40
|
Jekyll.logger.info "Auto-regeneration:",
|
|
41
|
-
|
|
41
|
+
"disabled when running server detached."
|
|
42
42
|
elsif options.fetch("watch", false)
|
|
43
43
|
watch(site, options)
|
|
44
44
|
else
|
|
@@ -54,13 +54,13 @@ module Jekyll
|
|
|
54
54
|
# Returns nothing.
|
|
55
55
|
def build(site, options)
|
|
56
56
|
t = Time.now
|
|
57
|
-
source = options["source"]
|
|
58
|
-
destination = options["destination"]
|
|
57
|
+
source = File.expand_path(options["source"])
|
|
58
|
+
destination = File.expand_path(options["destination"])
|
|
59
59
|
incremental = options["incremental"]
|
|
60
60
|
Jekyll.logger.info "Source:", source
|
|
61
61
|
Jekyll.logger.info "Destination:", destination
|
|
62
62
|
Jekyll.logger.info "Incremental build:",
|
|
63
|
-
|
|
63
|
+
(incremental ? "enabled" : "disabled. Enable with --incremental")
|
|
64
64
|
Jekyll.logger.info "Generating..."
|
|
65
65
|
process_site(site)
|
|
66
66
|
Jekyll.logger.info "", "done in #{(Time.now - t).round(3)} seconds."
|
|
@@ -76,25 +76,16 @@ module Jekyll
|
|
|
76
76
|
# Warn Windows users that they might need to upgrade.
|
|
77
77
|
if Utils::Platforms.bash_on_windows?
|
|
78
78
|
Jekyll.logger.warn "",
|
|
79
|
-
|
|
79
|
+
"Auto-regeneration may not work on some Windows versions."
|
|
80
80
|
Jekyll.logger.warn "",
|
|
81
|
-
|
|
81
|
+
"Please see: https://github.com/Microsoft/BashOnWindows/issues/216"
|
|
82
82
|
Jekyll.logger.warn "",
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
"If it does not work, please upgrade Bash on Windows or "\
|
|
84
|
+
"run Jekyll with --no-watch."
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
External.require_with_graceful_fail "jekyll-watch"
|
|
88
|
-
|
|
89
|
-
if watch_method.parameters.size == 1
|
|
90
|
-
watch_method.call(
|
|
91
|
-
options
|
|
92
|
-
)
|
|
93
|
-
else
|
|
94
|
-
watch_method.call(
|
|
95
|
-
options, site
|
|
96
|
-
)
|
|
97
|
-
end
|
|
88
|
+
Jekyll::Watcher.watch(options, site)
|
|
98
89
|
end
|
|
99
90
|
end
|
|
100
91
|
end
|
|
@@ -22,10 +22,12 @@ module Jekyll
|
|
|
22
22
|
options = configuration_from_options(options)
|
|
23
23
|
destination = options["destination"]
|
|
24
24
|
metadata_file = File.join(options["source"], ".jekyll-metadata")
|
|
25
|
+
cache_dir = File.join(options["source"], options["cache_dir"])
|
|
25
26
|
sass_cache = ".sass-cache"
|
|
26
27
|
|
|
27
28
|
remove(destination, :checker_func => :directory?)
|
|
28
29
|
remove(metadata_file, :checker_func => :file?)
|
|
30
|
+
remove(cache_dir, :checker_func => :directory?)
|
|
29
31
|
remove(sass_cache, :checker_func => :directory?)
|
|
30
32
|
end
|
|
31
33
|
|
|
@@ -11,7 +11,7 @@ module Jekyll
|
|
|
11
11
|
c.alias(:hyde)
|
|
12
12
|
|
|
13
13
|
c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array,
|
|
14
|
-
|
|
14
|
+
"Custom configuration file"
|
|
15
15
|
|
|
16
16
|
c.action do |_, options|
|
|
17
17
|
Jekyll::Commands::Doctor.process(options)
|
|
@@ -45,22 +45,23 @@ module Jekyll
|
|
|
45
45
|
|
|
46
46
|
def properly_gathered_posts?(site)
|
|
47
47
|
return true if site.config["collections_dir"].empty?
|
|
48
|
+
|
|
48
49
|
posts_at_root = site.in_source_dir("_posts")
|
|
49
50
|
return true unless File.directory?(posts_at_root)
|
|
51
|
+
|
|
50
52
|
Jekyll.logger.warn "Warning:",
|
|
51
|
-
|
|
53
|
+
"Detected '_posts' directory outside custom `collections_dir`!"
|
|
52
54
|
Jekyll.logger.warn "",
|
|
53
|
-
|
|
55
|
+
"Please move '#{posts_at_root}' into the custom directory at " \
|
|
54
56
|
"'#{site.in_source_dir(site.config["collections_dir"])}'"
|
|
55
57
|
false
|
|
56
58
|
end
|
|
57
59
|
|
|
58
60
|
def deprecated_relative_permalinks(site)
|
|
59
61
|
if site.config["relative_permalinks"]
|
|
60
|
-
Jekyll::Deprecator.deprecation_message "Your site still uses relative" \
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return true
|
|
62
|
+
Jekyll::Deprecator.deprecation_message "Your site still uses relative permalinks," \
|
|
63
|
+
" which was removed in Jekyll v3.0.0."
|
|
64
|
+
true
|
|
64
65
|
end
|
|
65
66
|
end
|
|
66
67
|
|
|
@@ -71,6 +72,7 @@ module Jekyll
|
|
|
71
72
|
urls = collect_urls(urls, site.posts.docs, site.dest)
|
|
72
73
|
urls.each do |url, paths|
|
|
73
74
|
next unless paths.size > 1
|
|
75
|
+
|
|
74
76
|
conflicting_urls = true
|
|
75
77
|
Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \
|
|
76
78
|
" for the following pages: #{paths.join(", ")}"
|
|
@@ -80,6 +82,7 @@ module Jekyll
|
|
|
80
82
|
|
|
81
83
|
def fsnotify_buggy?(_site)
|
|
82
84
|
return true unless Utils::Platforms.osx?
|
|
85
|
+
|
|
83
86
|
if Dir.pwd != `pwd`.strip
|
|
84
87
|
Jekyll.logger.error " " + <<-STR.strip.gsub(%r!\n\s+!, "\n ")
|
|
85
88
|
We have detected that there might be trouble using fsevent on your
|
|
@@ -99,6 +102,7 @@ module Jekyll
|
|
|
99
102
|
urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest)
|
|
100
103
|
urls.each_value do |real_urls|
|
|
101
104
|
next unless real_urls.uniq.size > 1
|
|
105
|
+
|
|
102
106
|
urls_only_differ_by_case = true
|
|
103
107
|
Jekyll.logger.warn "Warning:", "The following URLs only differ" \
|
|
104
108
|
" by case. On a case-insensitive file system one of the URLs" \
|
|
@@ -117,6 +121,7 @@ module Jekyll
|
|
|
117
121
|
end
|
|
118
122
|
|
|
119
123
|
private
|
|
124
|
+
|
|
120
125
|
def collect_urls(urls, things, destination)
|
|
121
126
|
things.each do |thing|
|
|
122
127
|
dest = thing.destination(destination)
|
|
@@ -138,6 +143,7 @@ module Jekyll
|
|
|
138
143
|
|
|
139
144
|
def url_exists?(url)
|
|
140
145
|
return true unless url.nil? || url.empty?
|
|
146
|
+
|
|
141
147
|
Jekyll.logger.warn "Warning:", "You didn't set an URL in the config file, "\
|
|
142
148
|
"you may encounter problems with some plugins."
|
|
143
149
|
false
|
|
@@ -155,7 +161,8 @@ module Jekyll
|
|
|
155
161
|
end
|
|
156
162
|
|
|
157
163
|
def url_absolute(url)
|
|
158
|
-
return true if Addressable::URI.parse(url).absolute?
|
|
164
|
+
return true if url.is_a?(String) && Addressable::URI.parse(url).absolute?
|
|
165
|
+
|
|
159
166
|
Jekyll.logger.warn "Warning:", "Your site URL does not seem to be absolute, "\
|
|
160
167
|
"check the value of `url` in your config file."
|
|
161
168
|
false
|
data/lib/jekyll/commands/help.rb
CHANGED
|
@@ -25,7 +25,7 @@ module Jekyll
|
|
|
25
25
|
|
|
26
26
|
def invalid_command(prog, cmd)
|
|
27
27
|
Jekyll.logger.error "Error:",
|
|
28
|
-
|
|
28
|
+
"Hmm... we don't know what the '#{cmd}' command is."
|
|
29
29
|
Jekyll.logger.info "Valid commands:", prog.commands.keys.join(", ")
|
|
30
30
|
end
|
|
31
31
|
end
|
data/lib/jekyll/commands/new.rb
CHANGED
|
@@ -41,10 +41,16 @@ module Jekyll
|
|
|
41
41
|
after_install(new_blog_path, options)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
def blank_template
|
|
45
|
+
File.expand_path("../../blank_template", __dir__)
|
|
46
|
+
end
|
|
47
|
+
|
|
44
48
|
def create_blank_site(path)
|
|
49
|
+
FileUtils.cp_r blank_template + "/.", path
|
|
50
|
+
FileUtils.chmod_R "u+w", path
|
|
51
|
+
|
|
45
52
|
Dir.chdir(path) do
|
|
46
|
-
FileUtils.mkdir(%w(
|
|
47
|
-
FileUtils.touch("index.html")
|
|
53
|
+
FileUtils.mkdir(%w(_data _drafts _includes _posts))
|
|
48
54
|
end
|
|
49
55
|
end
|
|
50
56
|
|
|
@@ -62,42 +68,38 @@ module Jekyll
|
|
|
62
68
|
private
|
|
63
69
|
|
|
64
70
|
def gemfile_contents
|
|
65
|
-
|
|
66
|
-
source "https://rubygems.org"
|
|
67
|
-
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
#
|
|
72
|
-
#
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
# If you
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
# If you have any plugins, put them here!
|
|
86
|
-
group :jekyll_plugins do
|
|
87
|
-
gem "jekyll-feed", "~> 0.6"
|
|
88
|
-
end
|
|
71
|
+
<<~RUBY
|
|
72
|
+
source "https://rubygems.org"
|
|
73
|
+
# Hello! This is where you manage which Jekyll version is used to run.
|
|
74
|
+
# When you want to use a different version, change it below, save the
|
|
75
|
+
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
|
|
76
|
+
#
|
|
77
|
+
# bundle exec jekyll serve
|
|
78
|
+
#
|
|
79
|
+
# This will help ensure the proper Jekyll version is running.
|
|
80
|
+
# Happy Jekylling!
|
|
81
|
+
gem "jekyll", "~> #{Jekyll::VERSION}"
|
|
82
|
+
# This is the default theme for new Jekyll sites. You may change this to anything you like.
|
|
83
|
+
gem "minima", "~> 2.5"
|
|
84
|
+
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
|
|
85
|
+
# uncomment the line below. To upgrade, run `bundle update github-pages`.
|
|
86
|
+
# gem "github-pages", group: :jekyll_plugins
|
|
87
|
+
# If you have any plugins, put them here!
|
|
88
|
+
group :jekyll_plugins do
|
|
89
|
+
gem "jekyll-feed", "~> 0.12"
|
|
90
|
+
end
|
|
89
91
|
|
|
90
|
-
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
|
91
|
-
# and associated library.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
end
|
|
92
|
+
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
|
|
93
|
+
# and associated library.
|
|
94
|
+
platforms :mingw, :x64_mingw, :mswin, :jruby do
|
|
95
|
+
gem "tzinfo", "~> 1.2"
|
|
96
|
+
gem "tzinfo-data"
|
|
97
|
+
end
|
|
96
98
|
|
|
97
|
-
# Performance-booster for watching directories on Windows
|
|
98
|
-
gem "wdm", "~> 0.1.
|
|
99
|
+
# Performance-booster for watching directories on Windows
|
|
100
|
+
gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]
|
|
99
101
|
|
|
100
|
-
RUBY
|
|
102
|
+
RUBY
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
def create_site(new_blog_path)
|