jekyll 4.0.1 → 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 -163
  3. data/LICENSE +21 -21
  4. data/README.markdown +86 -90
  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 -103
  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 -173
  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 -42
  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 -354
  26. data/lib/jekyll/configuration.rb +313 -316
  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 -130
  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 -254
  33. data/lib/jekyll/deprecator.rb +50 -50
  34. data/lib/jekyll/document.rb +544 -522
  35. data/lib/jekyll/drops/collection_drop.rb +20 -20
  36. data/lib/jekyll/drops/document_drop.rb +70 -69
  37. data/lib/jekyll/drops/drop.rb +293 -215
  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 -132
  44. data/lib/jekyll/entry_filter.rb +121 -110
  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 -68
  51. data/lib/jekyll/filters.rb +535 -454
  52. data/lib/jekyll/frontmatter_defaults.rb +240 -245
  53. data/lib/jekyll/generator.rb +5 -5
  54. data/lib/jekyll/hooks.rb +107 -106
  55. data/lib/jekyll/inclusion.rb +32 -0
  56. data/lib/jekyll/layout.rb +67 -62
  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 -75
  60. data/lib/jekyll/liquid_renderer.rb +80 -77
  61. data/lib/jekyll/log_adapter.rb +151 -151
  62. data/lib/jekyll/mime.types +866 -866
  63. data/lib/jekyll/page.rb +217 -186
  64. data/lib/jekyll/page_excerpt.rb +25 -0
  65. data/lib/jekyll/page_without_a_file.rb +14 -14
  66. data/lib/jekyll/path_manager.rb +74 -31
  67. data/lib/jekyll/plugin.rb +92 -92
  68. data/lib/jekyll/plugin_manager.rb +115 -115
  69. data/lib/jekyll/profiler.rb +58 -0
  70. data/lib/jekyll/publisher.rb +23 -23
  71. data/lib/jekyll/reader.rb +192 -187
  72. data/lib/jekyll/readers/collection_reader.rb +23 -22
  73. data/lib/jekyll/readers/data_reader.rb +79 -75
  74. data/lib/jekyll/readers/layout_reader.rb +62 -61
  75. data/lib/jekyll/readers/page_reader.rb +25 -24
  76. data/lib/jekyll/readers/post_reader.rb +85 -84
  77. data/lib/jekyll/readers/static_file_reader.rb +25 -24
  78. data/lib/jekyll/readers/theme_assets_reader.rb +52 -51
  79. data/lib/jekyll/regenerator.rb +195 -195
  80. data/lib/jekyll/related_posts.rb +52 -52
  81. data/lib/jekyll/renderer.rb +265 -267
  82. data/lib/jekyll/site.rb +551 -527
  83. data/lib/jekyll/static_file.rb +208 -203
  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 -221
  87. data/lib/jekyll/tags/link.rb +42 -41
  88. data/lib/jekyll/tags/post_url.rb +106 -107
  89. data/lib/jekyll/theme.rb +86 -80
  90. data/lib/jekyll/theme_builder.rb +121 -121
  91. data/lib/jekyll/url.rb +167 -164
  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 -82
  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 -206
  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 -19
  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 +20 -38
@@ -1,203 +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, :data
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 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
- @data = @site.frontmatter_defaults.all(relative_path, type)
38
- end
39
- # rubocop: enable ParameterLists
40
-
41
- # Returns source file path.
42
- def path
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
-
51
- # Obtain destination path.
52
- #
53
- # dest - The String path to the destination dir.
54
- #
55
- # Returns destination file path.
56
- def destination(dest)
57
- dest = @site.in_dest_dir(dest)
58
- @site.in_dest_dir(dest, Jekyll::URL.unescape_path(url))
59
- end
60
-
61
- def destination_rel_dir
62
- if @collection
63
- File.dirname(url)
64
- else
65
- @dir
66
- end
67
- end
68
-
69
- def modified_time
70
- @modified_time ||= File.stat(path).mtime
71
- end
72
-
73
- # Returns last modification time for this file.
74
- def mtime
75
- modified_time.to_i
76
- end
77
-
78
- # Is source path modified?
79
- #
80
- # Returns true if modified since last write.
81
- def modified?
82
- self.class.mtimes[path] != mtime
83
- end
84
-
85
- # Whether to write the file to the filesystem
86
- #
87
- # Returns true unless the defaults for the destination path from
88
- # _config.yml contain `published: false`.
89
- def write?
90
- publishable = defaults.fetch("published", true)
91
- return publishable unless @collection
92
-
93
- publishable && @collection.write?
94
- end
95
-
96
- # Write the static file to the destination directory (if modified).
97
- #
98
- # dest - The String path to the destination dir.
99
- #
100
- # Returns false if the file was not modified since last time (no-op).
101
- def write(dest)
102
- dest_path = destination(dest)
103
- return false if File.exist?(dest_path) && !modified?
104
-
105
- self.class.mtimes[path] = mtime
106
-
107
- FileUtils.mkdir_p(File.dirname(dest_path))
108
- FileUtils.rm(dest_path) if File.exist?(dest_path)
109
- copy_file(dest_path)
110
-
111
- true
112
- end
113
-
114
- def to_liquid
115
- @to_liquid ||= Drops::StaticFileDrop.new(self)
116
- end
117
-
118
- # Generate "basename without extension" and strip away any trailing periods.
119
- # NOTE: `String#gsub` removes all trailing periods (in comparison to `String#chomp`)
120
- def basename
121
- @basename ||= File.basename(name, extname).gsub(%r!\.*\z!, "")
122
- end
123
-
124
- def placeholders
125
- {
126
- :collection => @collection.label,
127
- :path => cleaned_relative_path,
128
- :output_ext => "",
129
- :name => basename,
130
- :title => "",
131
- }
132
- end
133
-
134
- # Similar to Jekyll::Document#cleaned_relative_path.
135
- # Generates a relative path with the collection's directory removed when applicable
136
- # and additionally removes any multiple periods in the string.
137
- #
138
- # NOTE: `String#gsub!` removes all trailing periods (in comparison to `String#chomp!`)
139
- #
140
- # Examples:
141
- # When `relative_path` is "_methods/site/my-cool-avatar...png":
142
- # cleaned_relative_path
143
- # # => "/site/my-cool-avatar"
144
- #
145
- # Returns the cleaned relative path of the static file.
146
- def cleaned_relative_path
147
- @cleaned_relative_path ||= begin
148
- cleaned = relative_path[0..-extname.length - 1]
149
- cleaned.gsub!(%r!\.*\z!, "")
150
- cleaned.sub!(@collection.relative_directory, "") if @collection
151
- cleaned
152
- end
153
- end
154
-
155
- # Applies a similar URL-building technique as Jekyll::Document that takes
156
- # the collection's URL template into account. The default URL template can
157
- # be overriden in the collection's configuration in _config.yml.
158
- def url
159
- @url ||= begin
160
- base = if @collection.nil?
161
- cleaned_relative_path
162
- else
163
- Jekyll::URL.new(
164
- :template => @collection.url_template,
165
- :placeholders => placeholders
166
- )
167
- end.to_s.chomp("/")
168
- base << extname
169
- end
170
- end
171
-
172
- # Returns the type of the collection if present, nil otherwise.
173
- def type
174
- @type ||= @collection.nil? ? nil : @collection.label.to_sym
175
- end
176
-
177
- # Returns the front matter defaults defined for the file's URL and/or type
178
- # as defined in _config.yml.
179
- def defaults
180
- @defaults ||= @site.frontmatter_defaults.all url, type
181
- end
182
-
183
- # Returns a debug string on inspecting the static file.
184
- # Includes only the relative path of the object.
185
- def inspect
186
- "#<#{self.class} @relative_path=#{relative_path.inspect}>"
187
- end
188
-
189
- private
190
-
191
- def copy_file(dest_path)
192
- if @site.safe || Jekyll.env == "production"
193
- FileUtils.cp(path, dest_path)
194
- else
195
- FileUtils.copy_entry(path, dest_path)
196
- end
197
-
198
- unless File.symlink?(dest_path)
199
- File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path)
200
- end
201
- end
202
- end
203
- 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