jekyll 3.9.3 → 4.0.0.pre.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +27 -50
- 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/cache.rb +183 -0
- data/lib/jekyll/cleaner.rb +2 -1
- data/lib/jekyll/collection.rb +78 -8
- data/lib/jekyll/command.rb +31 -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 -42
- data/lib/jekyll/commands/new_theme.rb +30 -28
- data/lib/jekyll/commands/serve/live_reload_reactor.rb +6 -10
- data/lib/jekyll/commands/serve/servlet.rb +15 -19
- data/lib/jekyll/commands/serve.rb +46 -86
- data/lib/jekyll/configuration.rb +26 -26
- data/lib/jekyll/converters/identity.rb +18 -0
- data/lib/jekyll/converters/markdown/kramdown_parser.rb +1 -10
- data/lib/jekyll/converters/markdown.rb +49 -40
- data/lib/jekyll/converters/smartypants.rb +34 -14
- data/lib/jekyll/convertible.rb +11 -13
- data/lib/jekyll/deprecator.rb +1 -3
- data/lib/jekyll/document.rb +44 -41
- data/lib/jekyll/drops/collection_drop.rb +2 -3
- data/lib/jekyll/drops/document_drop.rb +2 -1
- data/lib/jekyll/drops/drop.rb +3 -6
- data/lib/jekyll/drops/excerpt_drop.rb +4 -0
- data/lib/jekyll/drops/site_drop.rb +4 -13
- data/lib/jekyll/drops/unified_payload_drop.rb +1 -0
- data/lib/jekyll/drops/url_drop.rb +1 -0
- data/lib/jekyll/entry_filter.rb +2 -1
- data/lib/jekyll/excerpt.rb +45 -34
- data/lib/jekyll/external.rb +10 -5
- 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 +6 -1
- data/lib/jekyll/filters.rb +72 -31
- data/lib/jekyll/frontmatter_defaults.rb +35 -19
- data/lib/jekyll/hooks.rb +2 -3
- data/lib/jekyll/liquid_extensions.rb +0 -2
- data/lib/jekyll/liquid_renderer/file.rb +14 -3
- data/lib/jekyll/liquid_renderer/table.rb +67 -65
- data/lib/jekyll/liquid_renderer.rb +13 -1
- data/lib/jekyll/log_adapter.rb +5 -1
- data/lib/jekyll/mime.types +80 -195
- data/lib/jekyll/page.rb +10 -11
- data/lib/jekyll/page_without_a_file.rb +0 -4
- data/lib/jekyll/plugin.rb +5 -11
- data/lib/jekyll/plugin_manager.rb +2 -0
- data/lib/jekyll/reader.rb +38 -8
- data/lib/jekyll/readers/data_reader.rb +5 -5
- data/lib/jekyll/readers/layout_reader.rb +2 -12
- data/lib/jekyll/readers/post_reader.rb +29 -17
- data/lib/jekyll/readers/static_file_reader.rb +1 -1
- data/lib/jekyll/readers/theme_assets_reader.rb +7 -5
- data/lib/jekyll/regenerator.rb +4 -12
- data/lib/jekyll/renderer.rb +14 -25
- data/lib/jekyll/site.rb +78 -34
- data/lib/jekyll/static_file.rb +47 -11
- data/lib/jekyll/stevenson.rb +2 -3
- data/lib/jekyll/tags/highlight.rb +22 -52
- data/lib/jekyll/tags/include.rb +27 -48
- data/lib/jekyll/tags/link.rb +11 -7
- data/lib/jekyll/tags/post_url.rb +17 -16
- data/lib/jekyll/theme.rb +12 -23
- data/lib/jekyll/theme_builder.rb +91 -89
- data/lib/jekyll/url.rb +3 -2
- 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 +47 -18
- data/lib/jekyll/utils.rb +5 -4
- data/lib/jekyll/version.rb +1 -1
- data/lib/jekyll.rb +5 -0
- 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/rubocop/jekyll/assert_equal_literal_actual.rb +149 -0
- metadata +75 -48
- data/lib/jekyll/commands/serve/mime_types_charset.json +0 -71
- 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/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,6 +74,7 @@ module Jekyll
|
|
73
74
|
# relative to the collection's directory
|
74
75
|
def entries
|
75
76
|
return [] unless exists?
|
77
|
+
|
76
78
|
@entries ||=
|
77
79
|
Utils.safe_glob(collection_dir, ["**", "*"], File::FNM_DOTMATCH).map do |entry|
|
78
80
|
entry["#{collection_dir}/"] = ""
|
@@ -86,6 +88,7 @@ module Jekyll
|
|
86
88
|
# Returns a list of filtered entry paths.
|
87
89
|
def filtered_entries
|
88
90
|
return [] unless exists?
|
91
|
+
|
89
92
|
@filtered_entries ||=
|
90
93
|
Dir.chdir(directory) do
|
91
94
|
entry_filter.filter(entries).reject do |f|
|
@@ -124,6 +127,7 @@ module Jekyll
|
|
124
127
|
# is stored on the filesystem.
|
125
128
|
def collection_dir(*files)
|
126
129
|
return directory if files.empty?
|
130
|
+
|
127
131
|
site.in_source_dir(container, relative_directory, *files)
|
128
132
|
end
|
129
133
|
|
@@ -149,7 +153,7 @@ module Jekyll
|
|
149
153
|
#
|
150
154
|
# Returns the inspect string
|
151
155
|
def inspect
|
152
|
-
"
|
156
|
+
"#<#{self.class} @label=#{label} docs=#{docs}>"
|
153
157
|
end
|
154
158
|
|
155
159
|
# Produce a sanitized label name
|
@@ -207,17 +211,83 @@ module Jekyll
|
|
207
211
|
@container ||= site.config["collections_dir"]
|
208
212
|
end
|
209
213
|
|
210
|
-
private
|
211
|
-
|
212
214
|
def read_document(full_path)
|
213
215
|
doc = Document.new(full_path, :site => site, :collection => self)
|
214
216
|
doc.read
|
215
|
-
if site.unpublished || doc.published?
|
216
|
-
|
217
|
+
docs << doc if site.unpublished || doc.published?
|
218
|
+
end
|
219
|
+
|
220
|
+
def sort_docs!
|
221
|
+
if metadata["order"].is_a?(Array)
|
222
|
+
rearrange_docs!
|
223
|
+
elsif metadata["sort_by"].is_a?(String)
|
224
|
+
sort_docs_by_key!
|
225
|
+
else
|
226
|
+
docs.sort!
|
217
227
|
end
|
218
228
|
end
|
219
229
|
|
220
|
-
|
230
|
+
# A custom sort function based on Schwartzian transform
|
231
|
+
# Refer https://byparker.com/blog/2017/schwartzian-transform-faster-sorting/ for details
|
232
|
+
def sort_docs_by_key!
|
233
|
+
meta_key = metadata["sort_by"]
|
234
|
+
# Modify `docs` array to cache document's property along with the Document instance
|
235
|
+
docs.map! { |doc| [doc.data[meta_key], doc] }.sort! do |apples, olives|
|
236
|
+
order = determine_sort_order(meta_key, apples, olives)
|
237
|
+
|
238
|
+
# Fall back to `Document#<=>` if the properties were equal or were non-sortable
|
239
|
+
# Otherwise continue with current sort-order
|
240
|
+
if order.zero? || order.nil?
|
241
|
+
apples[-1] <=> olives[-1]
|
242
|
+
else
|
243
|
+
order
|
244
|
+
end
|
245
|
+
|
246
|
+
# Finally restore the `docs` array with just the Document objects themselves
|
247
|
+
end.map!(&:last)
|
248
|
+
end
|
249
|
+
|
250
|
+
def determine_sort_order(sort_key, apples, olives)
|
251
|
+
apple_property, apple_document = apples
|
252
|
+
olive_property, olive_document = olives
|
253
|
+
|
254
|
+
if apple_property.nil? && !olive_property.nil?
|
255
|
+
order_with_warning(sort_key, apple_document, 1)
|
256
|
+
elsif !apple_property.nil? && olive_property.nil?
|
257
|
+
order_with_warning(sort_key, olive_document, -1)
|
258
|
+
else
|
259
|
+
apple_property <=> olive_property
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def order_with_warning(sort_key, document, order)
|
264
|
+
Jekyll.logger.warn "Sort warning:", "'#{sort_key}' not defined in #{document.relative_path}"
|
265
|
+
order
|
266
|
+
end
|
267
|
+
|
268
|
+
# Rearrange documents within the `docs` array as listed in the `metadata["order"]` array.
|
269
|
+
#
|
270
|
+
# Involves converting the two arrays into hashes based on relative_paths as keys first, then
|
271
|
+
# merging them to remove duplicates and finally retrieving the Document instances from the
|
272
|
+
# merged array.
|
273
|
+
def rearrange_docs!
|
274
|
+
docs_table = {}
|
275
|
+
custom_order = {}
|
276
|
+
|
277
|
+
# pre-sort to normalize default array across platforms and then proceed to create a Hash
|
278
|
+
# from that sorted array.
|
279
|
+
docs.sort.each do |doc|
|
280
|
+
docs_table[doc.relative_path] = doc
|
281
|
+
end
|
282
|
+
|
283
|
+
metadata["order"].each do |entry|
|
284
|
+
custom_order[File.join(relative_directory, entry)] = nil
|
285
|
+
end
|
286
|
+
|
287
|
+
result = Jekyll::Utils.deep_merge_hashes(custom_order, docs_table).values
|
288
|
+
result.compact!
|
289
|
+
self.docs = result
|
290
|
+
end
|
221
291
|
|
222
292
|
def read_static_file(file_path, full_path)
|
223
293
|
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,52 @@ 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"
|
69
70
|
cmd.option "quiet", "-q", "--quiet", "Silence output."
|
70
71
|
cmd.option "verbose", "-V", "--verbose", "Print verbose output."
|
71
72
|
cmd.option "incremental", "-I", "--incremental", "Enable incremental rebuild."
|
72
73
|
cmd.option "strict_front_matter", "--strict_front_matter",
|
73
|
-
|
74
|
+
"Fail if errors are present in front matter"
|
74
75
|
end
|
75
76
|
# rubocop:enable Metrics/MethodLength
|
77
|
+
|
78
|
+
# Run ::process method in a given set of Jekyll::Command subclasses and suggest
|
79
|
+
# re-running the associated command with --trace switch to obtain any additional
|
80
|
+
# information or backtrace regarding the encountered Exception.
|
81
|
+
#
|
82
|
+
# cmd - the Jekyll::Command to be handled
|
83
|
+
# options - configuration overrides
|
84
|
+
# klass - an array of Jekyll::Command subclasses associated with the command
|
85
|
+
#
|
86
|
+
# Note that all exceptions are rescued..
|
87
|
+
# rubocop: disable RescueException
|
88
|
+
def process_with_graceful_fail(cmd, options, *klass)
|
89
|
+
klass.each { |k| k.process(options) if k.respond_to?(:process) }
|
90
|
+
rescue Exception => e
|
91
|
+
raise e if cmd.trace
|
92
|
+
|
93
|
+
msg = " Please append `--trace` to the `#{cmd.name}` command "
|
94
|
+
dashes = "-" * msg.length
|
95
|
+
Jekyll.logger.error "", dashes
|
96
|
+
Jekyll.logger.error "Jekyll #{Jekyll::VERSION} ", msg
|
97
|
+
Jekyll.logger.error "", " for any additional information or backtrace. "
|
98
|
+
Jekyll.logger.abort_with "", dashes
|
99
|
+
end
|
100
|
+
# rubocop: enable RescueException
|
76
101
|
end
|
77
102
|
end
|
78
103
|
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,49 +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
|
89
|
-
|
90
|
-
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
|
91
|
-
# and associated library.
|
92
|
-
platforms :mingw, :x64_mingw, :mswin, :jruby do
|
93
|
-
gem "tzinfo", ">= 1", "< 3"
|
94
|
-
gem "tzinfo-data"
|
95
|
-
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.0"
|
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.6"
|
90
|
+
end
|
96
91
|
|
97
|
-
#
|
98
|
-
|
92
|
+
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
|
93
|
+
# and associated library.
|
94
|
+
install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do
|
95
|
+
gem "tzinfo", "~> 1.2"
|
96
|
+
gem "tzinfo-data"
|
97
|
+
end
|
99
98
|
|
100
|
-
#
|
101
|
-
|
102
|
-
gem "kramdown-parser-gfm"
|
99
|
+
# Performance-booster for watching directories on Windows
|
100
|
+
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?
|
103
101
|
|
104
|
-
|
105
|
-
# do not have a Java counterpart.
|
106
|
-
gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]
|
107
|
-
RUBY
|
102
|
+
RUBY
|
108
103
|
end
|
109
104
|
|
110
105
|
def create_site(new_blog_path)
|
@@ -2,39 +2,41 @@
|
|
2
2
|
|
3
3
|
require "erb"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
module Jekyll
|
6
|
+
module Commands
|
7
|
+
class NewTheme < Jekyll::Command
|
8
|
+
class << self
|
9
|
+
def init_with_program(prog)
|
10
|
+
prog.command(:"new-theme") do |c|
|
11
|
+
c.syntax "new-theme NAME"
|
12
|
+
c.description "Creates a new Jekyll theme scaffold"
|
13
|
+
c.option "code_of_conduct", \
|
14
|
+
"-c", "--code-of-conduct", \
|
15
|
+
"Include a Code of Conduct. (defaults to false)"
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
+
c.action do |args, opts|
|
18
|
+
Jekyll::Commands::NewTheme.process(args, opts)
|
19
|
+
end
|
20
|
+
end
|
17
21
|
end
|
18
|
-
end
|
19
|
-
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
# rubocop:disable Metrics/AbcSize
|
24
|
+
def process(args, opts)
|
25
|
+
if !args || args.empty?
|
26
|
+
raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name."
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists."
|
31
|
-
end
|
29
|
+
new_theme_name = args.join("_")
|
30
|
+
theme = Jekyll::ThemeBuilder.new(new_theme_name, opts)
|
31
|
+
Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists." if theme.path.exist?
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
theme.create!
|
34
|
+
Jekyll.logger.info "Your new Jekyll theme, #{theme.name.cyan}," \
|
35
|
+
" is ready for you in #{theme.path.to_s.cyan}!"
|
36
|
+
Jekyll.logger.info "For help getting started, read #{theme.path}/README.md."
|
37
|
+
end
|
38
|
+
# rubocop:enable Metrics/AbcSize
|
39
|
+
end
|
37
40
|
end
|
38
|
-
# rubocop:enable Metrics/AbcSize
|
39
41
|
end
|
40
42
|
end
|
@@ -58,7 +58,7 @@ module Jekyll
|
|
58
58
|
EM.add_shutdown_hook { @stopped_event.set }
|
59
59
|
|
60
60
|
Jekyll.logger.info "LiveReload address:",
|
61
|
-
|
61
|
+
"http://#{opts["host"]}:#{opts["livereload_port"]}"
|
62
62
|
end
|
63
63
|
end
|
64
64
|
@thread.abort_on_exception = true
|
@@ -68,11 +68,11 @@ module Jekyll
|
|
68
68
|
# http://feedback.livereload.com/knowledgebase/articles/86174-livereload-protocol
|
69
69
|
def reload(pages)
|
70
70
|
pages.each do |p|
|
71
|
-
json_message = JSON.dump(
|
71
|
+
json_message = JSON.dump(
|
72
72
|
:command => "reload",
|
73
73
|
:path => p.url,
|
74
|
-
:liveCSS => true
|
75
|
-
|
74
|
+
:liveCSS => true
|
75
|
+
)
|
76
76
|
|
77
77
|
Jekyll.logger.debug "LiveReload:", "Reloading #{p.url}"
|
78
78
|
Jekyll.logger.debug "", json_message
|
@@ -81,6 +81,7 @@ module Jekyll
|
|
81
81
|
end
|
82
82
|
|
83
83
|
private
|
84
|
+
|
84
85
|
def connect(websocket, handshake)
|
85
86
|
@connections_count += 1
|
86
87
|
if @connections_count == 1
|
@@ -99,22 +100,17 @@ module Jekyll
|
|
99
100
|
@websockets << websocket
|
100
101
|
end
|
101
102
|
|
102
|
-
private
|
103
103
|
def disconnect(websocket)
|
104
104
|
@websockets.delete(websocket)
|
105
105
|
end
|
106
106
|
|
107
|
-
private
|
108
107
|
def print_message(json_message)
|
109
108
|
msg = JSON.parse(json_message)
|
110
109
|
# Not sure what the 'url' command even does in LiveReload. The spec is silent
|
111
110
|
# on its purpose.
|
112
|
-
if msg["command"] == "url"
|
113
|
-
Jekyll.logger.info "LiveReload:", "Browser URL: #{msg["url"]}"
|
114
|
-
end
|
111
|
+
Jekyll.logger.info "LiveReload:", "Browser URL: #{msg["url"]}" if msg["command"] == "url"
|
115
112
|
end
|
116
113
|
|
117
|
-
private
|
118
114
|
def log_error(error)
|
119
115
|
Jekyll.logger.error "LiveReload experienced an error. " \
|
120
116
|
"Run with --trace for more information."
|