jekyll 4.2.1 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +474 -350
  3. data/LICENSE +21 -21
  4. data/README.markdown +83 -86
  5. data/exe/jekyll +57 -57
  6. data/lib/blank_template/_config.yml +3 -3
  7. data/lib/blank_template/_layouts/default.html +12 -12
  8. data/lib/blank_template/_sass/{main.scss → base.scss} +9 -9
  9. data/lib/blank_template/assets/css/main.scss +4 -4
  10. data/lib/blank_template/index.md +8 -8
  11. data/lib/jekyll/cache.rb +186 -190
  12. data/lib/jekyll/cleaner.rb +111 -111
  13. data/lib/jekyll/collection.rb +310 -309
  14. data/lib/jekyll/command.rb +105 -105
  15. data/lib/jekyll/commands/build.rb +82 -93
  16. data/lib/jekyll/commands/clean.rb +44 -45
  17. data/lib/jekyll/commands/doctor.rb +177 -177
  18. data/lib/jekyll/commands/help.rb +34 -34
  19. data/lib/jekyll/commands/new.rb +168 -169
  20. data/lib/jekyll/commands/new_theme.rb +39 -40
  21. data/lib/jekyll/commands/serve/live_reload_reactor.rb +119 -122
  22. data/lib/jekyll/commands/serve/livereload_assets/livereload.js +1183 -1183
  23. data/lib/jekyll/commands/serve/mime_types_charset.json +71 -0
  24. data/lib/jekyll/commands/serve/servlet.rb +206 -202
  25. data/lib/jekyll/commands/serve/websockets.rb +81 -81
  26. data/lib/jekyll/commands/serve.rb +367 -362
  27. data/lib/jekyll/configuration.rb +313 -313
  28. data/lib/jekyll/converter.rb +54 -54
  29. data/lib/jekyll/converters/identity.rb +41 -41
  30. data/lib/jekyll/converters/markdown/kramdown_parser.rb +197 -199
  31. data/lib/jekyll/converters/markdown.rb +113 -113
  32. data/lib/jekyll/converters/smartypants.rb +70 -70
  33. data/lib/jekyll/convertible.rb +257 -257
  34. data/lib/jekyll/deprecator.rb +50 -50
  35. data/lib/jekyll/document.rb +543 -544
  36. data/lib/jekyll/drops/collection_drop.rb +20 -20
  37. data/lib/jekyll/drops/document_drop.rb +74 -70
  38. data/lib/jekyll/drops/drop.rb +293 -293
  39. data/lib/jekyll/drops/excerpt_drop.rb +23 -19
  40. data/lib/jekyll/drops/jekyll_drop.rb +32 -32
  41. data/lib/jekyll/drops/site_drop.rb +66 -66
  42. data/lib/jekyll/drops/static_file_drop.rb +14 -14
  43. data/lib/jekyll/drops/theme_drop.rb +36 -0
  44. data/lib/jekyll/drops/unified_payload_drop.rb +30 -26
  45. data/lib/jekyll/drops/url_drop.rb +140 -140
  46. data/lib/jekyll/entry_filter.rb +117 -121
  47. data/lib/jekyll/errors.rb +20 -20
  48. data/lib/jekyll/excerpt.rb +200 -201
  49. data/lib/jekyll/external.rb +75 -79
  50. data/lib/jekyll/filters/date_filters.rb +110 -110
  51. data/lib/jekyll/filters/grouping_filters.rb +64 -64
  52. data/lib/jekyll/filters/url_filters.rb +98 -98
  53. data/lib/jekyll/filters.rb +532 -535
  54. data/lib/jekyll/frontmatter_defaults.rb +238 -240
  55. data/lib/jekyll/generator.rb +5 -5
  56. data/lib/jekyll/hooks.rb +107 -107
  57. data/lib/jekyll/inclusion.rb +32 -32
  58. data/lib/jekyll/layout.rb +55 -67
  59. data/lib/jekyll/liquid_extensions.rb +22 -22
  60. data/lib/jekyll/liquid_renderer/file.rb +77 -77
  61. data/lib/jekyll/liquid_renderer/table.rb +45 -55
  62. data/lib/jekyll/liquid_renderer.rb +80 -80
  63. data/lib/jekyll/log_adapter.rb +151 -151
  64. data/lib/jekyll/mime.types +939 -866
  65. data/lib/jekyll/page.rb +215 -217
  66. data/lib/jekyll/page_excerpt.rb +25 -25
  67. data/lib/jekyll/page_without_a_file.rb +14 -14
  68. data/lib/jekyll/path_manager.rb +74 -74
  69. data/lib/jekyll/plugin.rb +92 -92
  70. data/lib/jekyll/plugin_manager.rb +123 -115
  71. data/lib/jekyll/profiler.rb +51 -58
  72. data/lib/jekyll/publisher.rb +23 -23
  73. data/lib/jekyll/reader.rb +209 -192
  74. data/lib/jekyll/readers/collection_reader.rb +23 -23
  75. data/lib/jekyll/readers/data_reader.rb +113 -79
  76. data/lib/jekyll/readers/layout_reader.rb +62 -62
  77. data/lib/jekyll/readers/page_reader.rb +25 -25
  78. data/lib/jekyll/readers/post_reader.rb +85 -85
  79. data/lib/jekyll/readers/static_file_reader.rb +25 -25
  80. data/lib/jekyll/readers/theme_assets_reader.rb +52 -52
  81. data/lib/jekyll/regenerator.rb +195 -195
  82. data/lib/jekyll/related_posts.rb +52 -52
  83. data/lib/jekyll/renderer.rb +263 -265
  84. data/lib/jekyll/site.rb +576 -551
  85. data/lib/jekyll/static_file.rb +205 -208
  86. data/lib/jekyll/stevenson.rb +60 -60
  87. data/lib/jekyll/tags/highlight.rb +114 -110
  88. data/lib/jekyll/tags/include.rb +275 -275
  89. data/lib/jekyll/tags/link.rb +42 -42
  90. data/lib/jekyll/tags/post_url.rb +106 -106
  91. data/lib/jekyll/theme.rb +90 -86
  92. data/lib/jekyll/theme_builder.rb +121 -121
  93. data/lib/jekyll/url.rb +167 -167
  94. data/lib/jekyll/utils/ansi.rb +57 -57
  95. data/lib/jekyll/utils/exec.rb +26 -26
  96. data/lib/jekyll/utils/internet.rb +37 -37
  97. data/lib/jekyll/utils/platforms.rb +67 -67
  98. data/lib/jekyll/utils/thread_event.rb +31 -31
  99. data/lib/jekyll/utils/win_tz.rb +46 -75
  100. data/lib/jekyll/utils.rb +371 -367
  101. data/lib/jekyll/version.rb +5 -5
  102. data/lib/jekyll.rb +195 -195
  103. data/lib/site_template/.gitignore +5 -5
  104. data/lib/site_template/404.html +25 -25
  105. data/lib/site_template/_config.yml +55 -55
  106. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +29 -29
  107. data/lib/site_template/about.markdown +18 -18
  108. data/lib/site_template/index.markdown +6 -6
  109. data/lib/theme_template/CODE_OF_CONDUCT.md.erb +74 -74
  110. data/lib/theme_template/Gemfile +4 -4
  111. data/lib/theme_template/LICENSE.txt.erb +21 -21
  112. data/lib/theme_template/README.md.erb +50 -52
  113. data/lib/theme_template/_layouts/default.html +1 -1
  114. data/lib/theme_template/_layouts/page.html +5 -5
  115. data/lib/theme_template/_layouts/post.html +5 -5
  116. data/lib/theme_template/example/_config.yml.erb +1 -1
  117. data/lib/theme_template/example/_post.md +12 -12
  118. data/lib/theme_template/example/index.html +14 -14
  119. data/lib/theme_template/example/style.scss +7 -7
  120. data/lib/theme_template/gitignore.erb +6 -6
  121. data/lib/theme_template/theme.gemspec.erb +16 -16
  122. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -149
  123. data/rubocop/jekyll/no_p_allowed.rb +23 -23
  124. data/rubocop/jekyll/no_puts_allowed.rb +23 -23
  125. data/rubocop/jekyll.rb +5 -5
  126. metadata +64 -18
@@ -1,62 +1,62 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- class LayoutReader
5
- attr_reader :site
6
-
7
- def initialize(site)
8
- @site = site
9
- @layouts = {}
10
- end
11
-
12
- def read
13
- layout_entries.each do |layout_file|
14
- @layouts[layout_name(layout_file)] = \
15
- Layout.new(site, layout_directory, layout_file)
16
- end
17
-
18
- theme_layout_entries.each do |layout_file|
19
- @layouts[layout_name(layout_file)] ||= \
20
- Layout.new(site, theme_layout_directory, layout_file)
21
- end
22
-
23
- @layouts
24
- end
25
-
26
- def layout_directory
27
- @layout_directory ||= site.in_source_dir(site.config["layouts_dir"])
28
- end
29
-
30
- def theme_layout_directory
31
- @theme_layout_directory ||= site.theme.layouts_path if site.theme
32
- end
33
-
34
- private
35
-
36
- def layout_entries
37
- entries_in layout_directory
38
- end
39
-
40
- def theme_layout_entries
41
- theme_layout_directory ? entries_in(theme_layout_directory) : []
42
- end
43
-
44
- def entries_in(dir)
45
- entries = []
46
- within(dir) do
47
- entries = EntryFilter.new(site).filter(Dir["**/*.*"])
48
- end
49
- entries
50
- end
51
-
52
- def layout_name(file)
53
- file.split(".")[0..-2].join(".")
54
- end
55
-
56
- def within(directory)
57
- return unless File.exist?(directory)
58
-
59
- Dir.chdir(directory) { yield }
60
- end
61
- end
62
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ class LayoutReader
5
+ attr_reader :site
6
+
7
+ def initialize(site)
8
+ @site = site
9
+ @layouts = {}
10
+ end
11
+
12
+ def read
13
+ layout_entries.each do |layout_file|
14
+ @layouts[layout_name(layout_file)] = \
15
+ Layout.new(site, layout_directory, layout_file)
16
+ end
17
+
18
+ theme_layout_entries.each do |layout_file|
19
+ @layouts[layout_name(layout_file)] ||= \
20
+ Layout.new(site, theme_layout_directory, layout_file)
21
+ end
22
+
23
+ @layouts
24
+ end
25
+
26
+ def layout_directory
27
+ @layout_directory ||= site.in_source_dir(site.config["layouts_dir"])
28
+ end
29
+
30
+ def theme_layout_directory
31
+ @theme_layout_directory ||= site.theme.layouts_path if site.theme
32
+ end
33
+
34
+ private
35
+
36
+ def layout_entries
37
+ entries_in layout_directory
38
+ end
39
+
40
+ def theme_layout_entries
41
+ theme_layout_directory ? entries_in(theme_layout_directory) : []
42
+ end
43
+
44
+ def entries_in(dir)
45
+ entries = []
46
+ within(dir) do
47
+ entries = EntryFilter.new(site).filter(Dir["**/*.*"])
48
+ end
49
+ entries
50
+ end
51
+
52
+ def layout_name(file)
53
+ file.split(".")[0..-2].join(".")
54
+ end
55
+
56
+ def within(directory)
57
+ return unless File.exist?(directory)
58
+
59
+ Dir.chdir(directory) { yield }
60
+ end
61
+ end
62
+ end
@@ -1,25 +1,25 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- class PageReader
5
- attr_reader :site, :dir, :unfiltered_content
6
-
7
- def initialize(site, dir)
8
- @site = site
9
- @dir = dir
10
- @unfiltered_content = []
11
- end
12
-
13
- # Create a new `Jekyll::Page` object for each entry in a given array.
14
- #
15
- # files - An array of file names inside `@dir`
16
- #
17
- # Returns an array of publishable `Jekyll::Page` objects.
18
- def read(files)
19
- files.each do |page|
20
- @unfiltered_content << Page.new(@site, @site.source, @dir, page)
21
- end
22
- @unfiltered_content.select { |page| site.publisher.publish?(page) }
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ class PageReader
5
+ attr_reader :site, :dir, :unfiltered_content
6
+
7
+ def initialize(site, dir)
8
+ @site = site
9
+ @dir = dir
10
+ @unfiltered_content = []
11
+ end
12
+
13
+ # Create a new `Jekyll::Page` object for each entry in a given array.
14
+ #
15
+ # files - An array of file names inside `@dir`
16
+ #
17
+ # Returns an array of publishable `Jekyll::Page` objects.
18
+ def read(files)
19
+ files.each do |page|
20
+ @unfiltered_content << Page.new(@site, @site.source, @dir, page)
21
+ end
22
+ @unfiltered_content.select { |page| site.publisher.publish?(page) }
23
+ end
24
+ end
25
+ end
@@ -1,85 +1,85 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- class PostReader
5
- attr_reader :site, :unfiltered_content
6
-
7
- def initialize(site)
8
- @site = site
9
- end
10
-
11
- # Read all the files in <source>/<dir>/_drafts and create a new
12
- # Document object with each one.
13
- #
14
- # dir - The String relative path of the directory to read.
15
- #
16
- # Returns nothing.
17
- def read_drafts(dir)
18
- read_publishable(dir, "_drafts", Document::DATELESS_FILENAME_MATCHER)
19
- end
20
-
21
- # Read all the files in <source>/<dir>/_posts and create a new Document
22
- # object with each one.
23
- #
24
- # dir - The String relative path of the directory to read.
25
- #
26
- # Returns nothing.
27
- def read_posts(dir)
28
- read_publishable(dir, "_posts", Document::DATE_FILENAME_MATCHER)
29
- end
30
-
31
- # Read all the files in <source>/<dir>/<magic_dir> and create a new
32
- # Document object with each one insofar as it matches the regexp matcher.
33
- #
34
- # dir - The String relative path of the directory to read.
35
- #
36
- # Returns nothing.
37
- def read_publishable(dir, magic_dir, matcher)
38
- read_content(dir, magic_dir, matcher)
39
- .tap { |docs| docs.each(&:read) }
40
- .select { |doc| processable?(doc) }
41
- end
42
-
43
- # Read all the content files from <source>/<dir>/magic_dir
44
- # and return them with the type klass.
45
- #
46
- # dir - The String relative path of the directory to read.
47
- # magic_dir - The String relative directory to <dir>,
48
- # looks for content here.
49
- # klass - The return type of the content.
50
- #
51
- # Returns klass type of content files
52
- def read_content(dir, magic_dir, matcher)
53
- @site.reader.get_entries(dir, magic_dir).map do |entry|
54
- next unless matcher.match?(entry)
55
-
56
- path = @site.in_source_dir(File.join(dir, magic_dir, entry))
57
- Document.new(path,
58
- :site => @site,
59
- :collection => @site.posts)
60
- end.tap(&:compact!)
61
- end
62
-
63
- private
64
-
65
- def processable?(doc)
66
- if doc.content.nil?
67
- Jekyll.logger.debug "Skipping:", "Content in #{doc.relative_path} is nil"
68
- false
69
- elsif !doc.content.valid_encoding?
70
- Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is not valid UTF-8"
71
- false
72
- else
73
- publishable?(doc)
74
- end
75
- end
76
-
77
- def publishable?(doc)
78
- site.publisher.publish?(doc).tap do |will_publish|
79
- if !will_publish && site.publisher.hidden_in_the_future?(doc)
80
- Jekyll.logger.warn "Skipping:", "#{doc.relative_path} has a future date"
81
- end
82
- end
83
- end
84
- end
85
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ class PostReader
5
+ attr_reader :site, :unfiltered_content
6
+
7
+ def initialize(site)
8
+ @site = site
9
+ end
10
+
11
+ # Read all the files in <source>/<dir>/_drafts and create a new
12
+ # Document object with each one.
13
+ #
14
+ # dir - The String relative path of the directory to read.
15
+ #
16
+ # Returns nothing.
17
+ def read_drafts(dir)
18
+ read_publishable(dir, "_drafts", Document::DATELESS_FILENAME_MATCHER)
19
+ end
20
+
21
+ # Read all the files in <source>/<dir>/_posts and create a new Document
22
+ # object with each one.
23
+ #
24
+ # dir - The String relative path of the directory to read.
25
+ #
26
+ # Returns nothing.
27
+ def read_posts(dir)
28
+ read_publishable(dir, "_posts", Document::DATE_FILENAME_MATCHER)
29
+ end
30
+
31
+ # Read all the files in <source>/<dir>/<magic_dir> and create a new
32
+ # Document object with each one insofar as it matches the regexp matcher.
33
+ #
34
+ # dir - The String relative path of the directory to read.
35
+ #
36
+ # Returns nothing.
37
+ def read_publishable(dir, magic_dir, matcher)
38
+ read_content(dir, magic_dir, matcher)
39
+ .tap { |docs| docs.each(&:read) }
40
+ .select { |doc| processable?(doc) }
41
+ end
42
+
43
+ # Read all the content files from <source>/<dir>/magic_dir
44
+ # and return them with the type klass.
45
+ #
46
+ # dir - The String relative path of the directory to read.
47
+ # magic_dir - The String relative directory to <dir>,
48
+ # looks for content here.
49
+ # klass - The return type of the content.
50
+ #
51
+ # Returns klass type of content files
52
+ def read_content(dir, magic_dir, matcher)
53
+ @site.reader.get_entries(dir, magic_dir).map do |entry|
54
+ next unless matcher.match?(entry)
55
+
56
+ path = @site.in_source_dir(File.join(dir, magic_dir, entry))
57
+ Document.new(path,
58
+ :site => @site,
59
+ :collection => @site.posts)
60
+ end.tap(&:compact!)
61
+ end
62
+
63
+ private
64
+
65
+ def processable?(doc)
66
+ if doc.content.nil?
67
+ Jekyll.logger.debug "Skipping:", "Content in #{doc.relative_path} is nil"
68
+ false
69
+ elsif !doc.content.valid_encoding?
70
+ Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is not valid UTF-8"
71
+ false
72
+ else
73
+ publishable?(doc)
74
+ end
75
+ end
76
+
77
+ def publishable?(doc)
78
+ site.publisher.publish?(doc).tap do |will_publish|
79
+ if !will_publish && site.publisher.hidden_in_the_future?(doc)
80
+ Jekyll.logger.warn "Skipping:", "#{doc.relative_path} has a future date"
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,25 +1,25 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- class StaticFileReader
5
- attr_reader :site, :dir, :unfiltered_content
6
-
7
- def initialize(site, dir)
8
- @site = site
9
- @dir = dir
10
- @unfiltered_content = []
11
- end
12
-
13
- # Create a new StaticFile object for every entry in a given list of basenames.
14
- #
15
- # files - an array of file basenames.
16
- #
17
- # Returns an array of static files.
18
- def read(files)
19
- files.each do |file|
20
- @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file)
21
- end
22
- @unfiltered_content
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ class StaticFileReader
5
+ attr_reader :site, :dir, :unfiltered_content
6
+
7
+ def initialize(site, dir)
8
+ @site = site
9
+ @dir = dir
10
+ @unfiltered_content = []
11
+ end
12
+
13
+ # Create a new StaticFile object for every entry in a given list of basenames.
14
+ #
15
+ # files - an array of file basenames.
16
+ #
17
+ # Returns an array of static files.
18
+ def read(files)
19
+ files.each do |file|
20
+ @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file)
21
+ end
22
+ @unfiltered_content
23
+ end
24
+ end
25
+ end
@@ -1,52 +1,52 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- class ThemeAssetsReader
5
- attr_reader :site
6
-
7
- def initialize(site)
8
- @site = site
9
- end
10
-
11
- def read
12
- return unless site.theme&.assets_path
13
-
14
- Find.find(site.theme.assets_path) do |path|
15
- next if File.directory?(path)
16
-
17
- if File.symlink?(path)
18
- Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}"
19
- else
20
- read_theme_asset(path)
21
- end
22
- end
23
- end
24
-
25
- private
26
-
27
- def read_theme_asset(path)
28
- base = site.theme.root
29
- dir = File.dirname(path.sub("#{site.theme.root}/", ""))
30
- name = File.basename(path)
31
-
32
- if Utils.has_yaml_header?(path)
33
- append_unless_exists site.pages,
34
- Jekyll::Page.new(site, base, dir, name)
35
- else
36
- append_unless_exists site.static_files,
37
- Jekyll::StaticFile.new(site, base, "/#{dir}", name)
38
- end
39
- end
40
-
41
- def append_unless_exists(haystack, new_item)
42
- if haystack.any? { |file| file.relative_path == new_item.relative_path }
43
- Jekyll.logger.debug "Theme:",
44
- "Ignoring #{new_item.relative_path} in theme due to existing file " \
45
- "with that path in site."
46
- return
47
- end
48
-
49
- haystack << new_item
50
- end
51
- end
52
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ class ThemeAssetsReader
5
+ attr_reader :site
6
+
7
+ def initialize(site)
8
+ @site = site
9
+ end
10
+
11
+ def read
12
+ return unless site.theme&.assets_path
13
+
14
+ Find.find(site.theme.assets_path) do |path|
15
+ next if File.directory?(path)
16
+
17
+ if File.symlink?(path)
18
+ Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}"
19
+ else
20
+ read_theme_asset(path)
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def read_theme_asset(path)
28
+ base = site.theme.root
29
+ dir = File.dirname(path.sub("#{site.theme.root}/", ""))
30
+ name = File.basename(path)
31
+
32
+ if Utils.has_yaml_header?(path)
33
+ append_unless_exists site.pages,
34
+ Jekyll::Page.new(site, base, dir, name)
35
+ else
36
+ append_unless_exists site.static_files,
37
+ Jekyll::StaticFile.new(site, base, "/#{dir}", name)
38
+ end
39
+ end
40
+
41
+ def append_unless_exists(haystack, new_item)
42
+ if haystack.any? { |file| file.relative_path == new_item.relative_path }
43
+ Jekyll.logger.debug "Theme:",
44
+ "Ignoring #{new_item.relative_path} in theme due to existing file " \
45
+ "with that path in site."
46
+ return
47
+ end
48
+
49
+ haystack << new_item
50
+ end
51
+ end
52
+ end