jekyll 4.2.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +350 -347
  3. data/LICENSE +21 -21
  4. data/README.markdown +86 -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 +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 +190 -190
  12. data/lib/jekyll/cleaner.rb +111 -111
  13. data/lib/jekyll/collection.rb +309 -309
  14. data/lib/jekyll/command.rb +105 -105
  15. data/lib/jekyll/commands/build.rb +93 -93
  16. data/lib/jekyll/commands/clean.rb +45 -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 +169 -169
  20. data/lib/jekyll/commands/new_theme.rb +40 -40
  21. data/lib/jekyll/commands/serve/live_reload_reactor.rb +122 -122
  22. data/lib/jekyll/commands/serve/livereload_assets/livereload.js +1183 -1183
  23. data/lib/jekyll/commands/serve/servlet.rb +202 -202
  24. data/lib/jekyll/commands/serve/websockets.rb +81 -81
  25. data/lib/jekyll/commands/serve.rb +362 -365
  26. data/lib/jekyll/configuration.rb +313 -313
  27. data/lib/jekyll/converter.rb +54 -54
  28. data/lib/jekyll/converters/identity.rb +41 -41
  29. data/lib/jekyll/converters/markdown/kramdown_parser.rb +199 -199
  30. data/lib/jekyll/converters/markdown.rb +113 -113
  31. data/lib/jekyll/converters/smartypants.rb +70 -70
  32. data/lib/jekyll/convertible.rb +257 -260
  33. data/lib/jekyll/deprecator.rb +50 -50
  34. data/lib/jekyll/document.rb +544 -544
  35. data/lib/jekyll/drops/collection_drop.rb +20 -20
  36. data/lib/jekyll/drops/document_drop.rb +70 -70
  37. data/lib/jekyll/drops/drop.rb +293 -293
  38. data/lib/jekyll/drops/excerpt_drop.rb +19 -19
  39. data/lib/jekyll/drops/jekyll_drop.rb +32 -32
  40. data/lib/jekyll/drops/site_drop.rb +66 -66
  41. data/lib/jekyll/drops/static_file_drop.rb +14 -14
  42. data/lib/jekyll/drops/unified_payload_drop.rb +26 -26
  43. data/lib/jekyll/drops/url_drop.rb +140 -140
  44. data/lib/jekyll/entry_filter.rb +121 -121
  45. data/lib/jekyll/errors.rb +20 -20
  46. data/lib/jekyll/excerpt.rb +201 -201
  47. data/lib/jekyll/external.rb +79 -79
  48. data/lib/jekyll/filters/date_filters.rb +110 -110
  49. data/lib/jekyll/filters/grouping_filters.rb +64 -64
  50. data/lib/jekyll/filters/url_filters.rb +98 -98
  51. data/lib/jekyll/filters.rb +535 -535
  52. data/lib/jekyll/frontmatter_defaults.rb +240 -240
  53. data/lib/jekyll/generator.rb +5 -5
  54. data/lib/jekyll/hooks.rb +107 -107
  55. data/lib/jekyll/inclusion.rb +32 -32
  56. data/lib/jekyll/layout.rb +67 -67
  57. data/lib/jekyll/liquid_extensions.rb +22 -22
  58. data/lib/jekyll/liquid_renderer/file.rb +77 -77
  59. data/lib/jekyll/liquid_renderer/table.rb +55 -55
  60. data/lib/jekyll/liquid_renderer.rb +80 -80
  61. data/lib/jekyll/log_adapter.rb +151 -151
  62. data/lib/jekyll/mime.types +866 -866
  63. data/lib/jekyll/page.rb +217 -217
  64. data/lib/jekyll/page_excerpt.rb +25 -25
  65. data/lib/jekyll/page_without_a_file.rb +14 -14
  66. data/lib/jekyll/path_manager.rb +74 -74
  67. data/lib/jekyll/plugin.rb +92 -92
  68. data/lib/jekyll/plugin_manager.rb +115 -115
  69. data/lib/jekyll/profiler.rb +58 -58
  70. data/lib/jekyll/publisher.rb +23 -23
  71. data/lib/jekyll/reader.rb +192 -192
  72. data/lib/jekyll/readers/collection_reader.rb +23 -23
  73. data/lib/jekyll/readers/data_reader.rb +79 -79
  74. data/lib/jekyll/readers/layout_reader.rb +62 -62
  75. data/lib/jekyll/readers/page_reader.rb +25 -25
  76. data/lib/jekyll/readers/post_reader.rb +85 -85
  77. data/lib/jekyll/readers/static_file_reader.rb +25 -25
  78. data/lib/jekyll/readers/theme_assets_reader.rb +52 -52
  79. data/lib/jekyll/regenerator.rb +195 -195
  80. data/lib/jekyll/related_posts.rb +52 -52
  81. data/lib/jekyll/renderer.rb +265 -265
  82. data/lib/jekyll/site.rb +551 -551
  83. data/lib/jekyll/static_file.rb +208 -208
  84. data/lib/jekyll/stevenson.rb +60 -60
  85. data/lib/jekyll/tags/highlight.rb +110 -110
  86. data/lib/jekyll/tags/include.rb +275 -270
  87. data/lib/jekyll/tags/link.rb +42 -42
  88. data/lib/jekyll/tags/post_url.rb +106 -106
  89. data/lib/jekyll/theme.rb +86 -86
  90. data/lib/jekyll/theme_builder.rb +121 -121
  91. data/lib/jekyll/url.rb +167 -167
  92. data/lib/jekyll/utils/ansi.rb +57 -57
  93. data/lib/jekyll/utils/exec.rb +26 -26
  94. data/lib/jekyll/utils/internet.rb +37 -37
  95. data/lib/jekyll/utils/platforms.rb +67 -67
  96. data/lib/jekyll/utils/thread_event.rb +31 -31
  97. data/lib/jekyll/utils/win_tz.rb +75 -75
  98. data/lib/jekyll/utils.rb +367 -367
  99. data/lib/jekyll/version.rb +5 -5
  100. data/lib/jekyll.rb +195 -195
  101. data/lib/site_template/.gitignore +5 -5
  102. data/lib/site_template/404.html +25 -25
  103. data/lib/site_template/_config.yml +55 -55
  104. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +29 -29
  105. data/lib/site_template/about.markdown +18 -18
  106. data/lib/site_template/index.markdown +6 -6
  107. data/lib/theme_template/CODE_OF_CONDUCT.md.erb +74 -74
  108. data/lib/theme_template/Gemfile +4 -4
  109. data/lib/theme_template/LICENSE.txt.erb +21 -21
  110. data/lib/theme_template/README.md.erb +52 -52
  111. data/lib/theme_template/_layouts/default.html +1 -1
  112. data/lib/theme_template/_layouts/page.html +5 -5
  113. data/lib/theme_template/_layouts/post.html +5 -5
  114. data/lib/theme_template/example/_config.yml.erb +1 -1
  115. data/lib/theme_template/example/_post.md +12 -12
  116. data/lib/theme_template/example/index.html +14 -14
  117. data/lib/theme_template/example/style.scss +7 -7
  118. data/lib/theme_template/gitignore.erb +6 -6
  119. data/lib/theme_template/theme.gemspec.erb +16 -16
  120. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -149
  121. data/rubocop/jekyll/no_p_allowed.rb +23 -23
  122. data/rubocop/jekyll/no_puts_allowed.rb +23 -23
  123. data/rubocop/jekyll.rb +5 -5
  124. metadata +3 -3
@@ -1,208 +1,208 @@
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 ||= 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,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