jekyll 4.2.1 → 4.3.2

Sign up to get free protection for your applications and to get access to all the features.
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,208 +1,205 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- class StaticFile
5
- extend Forwardable
6
-
7
- attr_reader :relative_path, :extname, :name
8
-
9
- def_delegator :to_liquid, :to_json, :to_json
10
-
11
- class << self
12
- # The cache of last modification times [path] -> mtime.
13
- def mtimes
14
- @mtimes ||= {}
15
- end
16
-
17
- def reset_cache
18
- @mtimes = nil
19
- end
20
- end
21
-
22
- # Initialize a new StaticFile.
23
- #
24
- # site - The Site.
25
- # base - The String path to the <source>.
26
- # dir - The String path between <source> and the file.
27
- # name - The String filename of the file.
28
- # rubocop: disable Metrics/ParameterLists
29
- def initialize(site, base, dir, name, collection = nil)
30
- @site = site
31
- @base = base
32
- @dir = dir
33
- @name = name
34
- @collection = collection
35
- @relative_path = File.join(*[@dir, @name].compact)
36
- @extname = File.extname(@name)
37
- end
38
- # rubocop: enable Metrics/ParameterLists
39
-
40
- # Returns source file path.
41
- def path
42
- @path ||= begin
43
- # Static file is from a collection inside custom collections directory
44
- if !@collection.nil? && !@site.config["collections_dir"].empty?
45
- File.join(*[@base, @site.config["collections_dir"], @dir, @name].compact)
46
- else
47
- File.join(*[@base, @dir, @name].compact)
48
- end
49
- end
50
- end
51
-
52
- # Obtain destination path.
53
- #
54
- # dest - The String path to the destination dir.
55
- #
56
- # Returns destination file path.
57
- def destination(dest)
58
- @destination ||= {}
59
- @destination[dest] ||= @site.in_dest_dir(dest, Jekyll::URL.unescape_path(url))
60
- end
61
-
62
- def destination_rel_dir
63
- if @collection
64
- File.dirname(url)
65
- else
66
- @dir
67
- end
68
- end
69
-
70
- def modified_time
71
- @modified_time ||= File.stat(path).mtime
72
- end
73
-
74
- # Returns last modification time for this file.
75
- def mtime
76
- modified_time.to_i
77
- end
78
-
79
- # Is source path modified?
80
- #
81
- # Returns true if modified since last write.
82
- def modified?
83
- self.class.mtimes[path] != mtime
84
- end
85
-
86
- # Whether to write the file to the filesystem
87
- #
88
- # Returns true unless the defaults for the destination path from
89
- # _config.yml contain `published: false`.
90
- def write?
91
- publishable = defaults.fetch("published", true)
92
- return publishable unless @collection
93
-
94
- publishable && @collection.write?
95
- end
96
-
97
- # Write the static file to the destination directory (if modified).
98
- #
99
- # dest - The String path to the destination dir.
100
- #
101
- # Returns false if the file was not modified since last time (no-op).
102
- def write(dest)
103
- dest_path = destination(dest)
104
- return false if File.exist?(dest_path) && !modified?
105
-
106
- self.class.mtimes[path] = mtime
107
-
108
- FileUtils.mkdir_p(File.dirname(dest_path))
109
- FileUtils.rm(dest_path) if File.exist?(dest_path)
110
- copy_file(dest_path)
111
-
112
- true
113
- end
114
-
115
- def data
116
- @data ||= @site.frontmatter_defaults.all(relative_path, type)
117
- end
118
-
119
- def to_liquid
120
- @to_liquid ||= Drops::StaticFileDrop.new(self)
121
- end
122
-
123
- # Generate "basename without extension" and strip away any trailing periods.
124
- # NOTE: `String#gsub` removes all trailing periods (in comparison to `String#chomp`)
125
- def basename
126
- @basename ||= File.basename(name, extname).gsub(%r!\.*\z!, "")
127
- end
128
-
129
- def placeholders
130
- {
131
- :collection => @collection.label,
132
- :path => cleaned_relative_path,
133
- :output_ext => "",
134
- :name => basename,
135
- :title => "",
136
- }
137
- end
138
-
139
- # Similar to Jekyll::Document#cleaned_relative_path.
140
- # Generates a relative path with the collection's directory removed when applicable
141
- # and additionally removes any multiple periods in the string.
142
- #
143
- # NOTE: `String#gsub!` removes all trailing periods (in comparison to `String#chomp!`)
144
- #
145
- # Examples:
146
- # When `relative_path` is "_methods/site/my-cool-avatar...png":
147
- # cleaned_relative_path
148
- # # => "/site/my-cool-avatar"
149
- #
150
- # Returns the cleaned relative path of the static file.
151
- def cleaned_relative_path
152
- @cleaned_relative_path ||= begin
153
- cleaned = relative_path[0..-extname.length - 1]
154
- cleaned.gsub!(%r!\.*\z!, "")
155
- cleaned.sub!(@collection.relative_directory, "") if @collection
156
- cleaned
157
- end
158
- end
159
-
160
- # Applies a similar URL-building technique as Jekyll::Document that takes
161
- # the collection's URL template into account. The default URL template can
162
- # be overriden in the collection's configuration in _config.yml.
163
- def url
164
- @url ||= begin
165
- base = if @collection.nil?
166
- cleaned_relative_path
167
- else
168
- Jekyll::URL.new(
169
- :template => @collection.url_template,
170
- :placeholders => placeholders
171
- )
172
- end.to_s.chomp("/")
173
- base << extname
174
- end
175
- end
176
-
177
- # Returns the type of the collection if present, nil otherwise.
178
- def type
179
- @type ||= @collection.nil? ? nil : @collection.label.to_sym
180
- end
181
-
182
- # Returns the front matter defaults defined for the file's URL and/or type
183
- # as defined in _config.yml.
184
- def defaults
185
- @defaults ||= @site.frontmatter_defaults.all url, type
186
- end
187
-
188
- # Returns a debug string on inspecting the static file.
189
- # Includes only the relative path of the object.
190
- def inspect
191
- "#<#{self.class} @relative_path=#{relative_path.inspect}>"
192
- end
193
-
194
- private
195
-
196
- def copy_file(dest_path)
197
- if @site.safe || Jekyll.env == "production"
198
- FileUtils.cp(path, dest_path)
199
- else
200
- FileUtils.copy_entry(path, dest_path)
201
- end
202
-
203
- unless File.symlink?(dest_path)
204
- File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path)
205
- end
206
- end
207
- end
208
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ class StaticFile
5
+ extend Forwardable
6
+
7
+ attr_reader :relative_path, :extname, :name
8
+
9
+ def_delegator :to_liquid, :to_json, :to_json
10
+
11
+ class << self
12
+ # The cache of last modification times [path] -> mtime.
13
+ def mtimes
14
+ @mtimes ||= {}
15
+ end
16
+
17
+ def reset_cache
18
+ @mtimes = nil
19
+ end
20
+ end
21
+
22
+ # Initialize a new StaticFile.
23
+ #
24
+ # site - The Site.
25
+ # base - The String path to the <source>.
26
+ # dir - The String path between <source> and the file.
27
+ # name - The String filename of the file.
28
+ # rubocop: disable Metrics/ParameterLists
29
+ def initialize(site, base, dir, name, collection = nil)
30
+ @site = site
31
+ @base = base
32
+ @dir = dir
33
+ @name = name
34
+ @collection = collection
35
+ @relative_path = File.join(*[@dir, @name].compact)
36
+ @extname = File.extname(@name)
37
+ end
38
+ # rubocop: enable Metrics/ParameterLists
39
+
40
+ # Returns source file path.
41
+ def path
42
+ @path ||= if !@collection.nil? && !@site.config["collections_dir"].empty?
43
+ File.join(*[@base, @site.config["collections_dir"], @dir, @name].compact)
44
+ else
45
+ File.join(*[@base, @dir, @name].compact)
46
+ end
47
+ end
48
+
49
+ # Obtain destination path.
50
+ #
51
+ # dest - The String path to the destination dir.
52
+ #
53
+ # Returns destination file path.
54
+ def destination(dest)
55
+ @destination ||= {}
56
+ @destination[dest] ||= @site.in_dest_dir(dest, Jekyll::URL.unescape_path(url))
57
+ end
58
+
59
+ def destination_rel_dir
60
+ if @collection
61
+ File.dirname(url)
62
+ else
63
+ @dir
64
+ end
65
+ end
66
+
67
+ def modified_time
68
+ @modified_time ||= File.stat(path).mtime
69
+ end
70
+
71
+ # Returns last modification time for this file.
72
+ def mtime
73
+ modified_time.to_i
74
+ end
75
+
76
+ # Is source path modified?
77
+ #
78
+ # Returns true if modified since last write.
79
+ def modified?
80
+ self.class.mtimes[path] != mtime
81
+ end
82
+
83
+ # Whether to write the file to the filesystem
84
+ #
85
+ # Returns true unless the defaults for the destination path from
86
+ # _config.yml contain `published: false`.
87
+ def write?
88
+ publishable = defaults.fetch("published", true)
89
+ return publishable unless @collection
90
+
91
+ publishable && @collection.write?
92
+ end
93
+
94
+ # Write the static file to the destination directory (if modified).
95
+ #
96
+ # dest - The String path to the destination dir.
97
+ #
98
+ # Returns false if the file was not modified since last time (no-op).
99
+ def write(dest)
100
+ dest_path = destination(dest)
101
+ return false if File.exist?(dest_path) && !modified?
102
+
103
+ self.class.mtimes[path] = mtime
104
+
105
+ FileUtils.mkdir_p(File.dirname(dest_path))
106
+ FileUtils.rm(dest_path) if File.exist?(dest_path)
107
+ copy_file(dest_path)
108
+
109
+ true
110
+ end
111
+
112
+ def data
113
+ @data ||= @site.frontmatter_defaults.all(relative_path, type)
114
+ end
115
+
116
+ def to_liquid
117
+ @to_liquid ||= Drops::StaticFileDrop.new(self)
118
+ end
119
+
120
+ # Generate "basename without extension" and strip away any trailing periods.
121
+ # NOTE: `String#gsub` removes all trailing periods (in comparison to `String#chomp`)
122
+ def basename
123
+ @basename ||= File.basename(name, extname).gsub(%r!\.*\z!, "")
124
+ end
125
+
126
+ def placeholders
127
+ {
128
+ :collection => @collection.label,
129
+ :path => cleaned_relative_path,
130
+ :output_ext => "",
131
+ :name => basename,
132
+ :title => "",
133
+ }
134
+ end
135
+
136
+ # Similar to Jekyll::Document#cleaned_relative_path.
137
+ # Generates a relative path with the collection's directory removed when applicable
138
+ # and additionally removes any multiple periods in the string.
139
+ #
140
+ # NOTE: `String#gsub!` removes all trailing periods (in comparison to `String#chomp!`)
141
+ #
142
+ # Examples:
143
+ # When `relative_path` is "_methods/site/my-cool-avatar...png":
144
+ # cleaned_relative_path
145
+ # # => "/site/my-cool-avatar"
146
+ #
147
+ # Returns the cleaned relative path of the static file.
148
+ def cleaned_relative_path
149
+ @cleaned_relative_path ||= begin
150
+ cleaned = relative_path[0..-extname.length - 1]
151
+ cleaned.gsub!(%r!\.*\z!, "")
152
+ cleaned.sub!(@collection.relative_directory, "") if @collection
153
+ cleaned
154
+ end
155
+ end
156
+
157
+ # Applies a similar URL-building technique as Jekyll::Document that takes
158
+ # the collection's URL template into account. The default URL template can
159
+ # be overridden in the collection's configuration in _config.yml.
160
+ def url
161
+ @url ||= begin
162
+ base = if @collection.nil?
163
+ cleaned_relative_path
164
+ else
165
+ Jekyll::URL.new(
166
+ :template => @collection.url_template,
167
+ :placeholders => placeholders
168
+ )
169
+ end.to_s.chomp("/")
170
+ base << extname
171
+ end
172
+ end
173
+
174
+ # Returns the type of the collection if present, nil otherwise.
175
+ def type
176
+ @type ||= @collection.nil? ? nil : @collection.label.to_sym
177
+ end
178
+
179
+ # Returns the front matter defaults defined for the file's URL and/or type
180
+ # as defined in _config.yml.
181
+ def defaults
182
+ @defaults ||= @site.frontmatter_defaults.all url, type
183
+ end
184
+
185
+ # Returns a debug string on inspecting the static file.
186
+ # Includes only the relative path of the object.
187
+ def inspect
188
+ "#<#{self.class} @relative_path=#{relative_path.inspect}>"
189
+ end
190
+
191
+ private
192
+
193
+ def copy_file(dest_path)
194
+ if @site.safe || Jekyll.env == "production"
195
+ FileUtils.cp(path, dest_path)
196
+ else
197
+ FileUtils.copy_entry(path, dest_path)
198
+ end
199
+
200
+ unless File.symlink?(dest_path)
201
+ File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path)
202
+ end
203
+ end
204
+ end
205
+ end
@@ -1,60 +1,60 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- class Stevenson < ::Logger
5
- def initialize
6
- @progname = nil
7
- @level = DEBUG
8
- @default_formatter = Formatter.new
9
- @logdev = $stdout
10
- @formatter = proc do |_, _, _, msg|
11
- msg.to_s
12
- end
13
- end
14
-
15
- def add(severity, message = nil, progname = nil)
16
- severity ||= UNKNOWN
17
- @logdev = logdevice(severity)
18
-
19
- return true if @logdev.nil? || severity < @level
20
-
21
- progname ||= @progname
22
- if message.nil?
23
- if block_given?
24
- message = yield
25
- else
26
- message = progname
27
- progname = @progname
28
- end
29
- end
30
- @logdev.puts(
31
- format_message(format_severity(severity), Time.now, progname, message)
32
- )
33
- true
34
- end
35
-
36
- # Log a +WARN+ message
37
- def warn(progname = nil, &block)
38
- add(WARN, nil, progname.yellow, &block)
39
- end
40
-
41
- # Log an +ERROR+ message
42
- def error(progname = nil, &block)
43
- add(ERROR, nil, progname.red, &block)
44
- end
45
-
46
- def close
47
- # No LogDevice in use
48
- end
49
-
50
- private
51
-
52
- def logdevice(severity)
53
- if severity > INFO
54
- $stderr
55
- else
56
- $stdout
57
- end
58
- end
59
- end
60
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ class Stevenson < ::Logger
5
+ def initialize
6
+ @progname = nil
7
+ @level = DEBUG
8
+ @default_formatter = Formatter.new
9
+ @logdev = $stdout
10
+ @formatter = proc do |_, _, _, msg|
11
+ msg.to_s
12
+ end
13
+ end
14
+
15
+ def add(severity, message = nil, progname = nil)
16
+ severity ||= UNKNOWN
17
+ @logdev = logdevice(severity)
18
+
19
+ return true if @logdev.nil? || severity < @level
20
+
21
+ progname ||= @progname
22
+ if message.nil?
23
+ if block_given?
24
+ message = yield
25
+ else
26
+ message = progname
27
+ progname = @progname
28
+ end
29
+ end
30
+ @logdev.puts(
31
+ format_message(format_severity(severity), Time.now, progname, message)
32
+ )
33
+ true
34
+ end
35
+
36
+ # Log a +WARN+ message
37
+ def warn(progname = nil, &block)
38
+ add(WARN, nil, progname.yellow, &block)
39
+ end
40
+
41
+ # Log an +ERROR+ message
42
+ def error(progname = nil, &block)
43
+ add(ERROR, nil, progname.red, &block)
44
+ end
45
+
46
+ def close
47
+ # No LogDevice in use
48
+ end
49
+
50
+ private
51
+
52
+ def logdevice(severity)
53
+ if severity > INFO
54
+ $stderr
55
+ else
56
+ $stdout
57
+ end
58
+ end
59
+ end
60
+ end