jekyll 3.9.1 → 4.0.0.pre.alpha1

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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +27 -50
  3. data/LICENSE +1 -1
  4. data/README.markdown +46 -17
  5. data/lib/blank_template/_config.yml +3 -0
  6. data/lib/blank_template/_layouts/default.html +12 -0
  7. data/lib/blank_template/_sass/main.scss +9 -0
  8. data/lib/blank_template/assets/css/main.scss +4 -0
  9. data/lib/blank_template/index.md +8 -0
  10. data/lib/jekyll.rb +5 -0
  11. data/lib/jekyll/cache.rb +183 -0
  12. data/lib/jekyll/cleaner.rb +2 -1
  13. data/lib/jekyll/collection.rb +78 -8
  14. data/lib/jekyll/command.rb +31 -6
  15. data/lib/jekyll/commands/build.rb +11 -20
  16. data/lib/jekyll/commands/clean.rb +2 -0
  17. data/lib/jekyll/commands/doctor.rb +15 -8
  18. data/lib/jekyll/commands/help.rb +1 -1
  19. data/lib/jekyll/commands/new.rb +37 -39
  20. data/lib/jekyll/commands/new_theme.rb +30 -28
  21. data/lib/jekyll/commands/serve.rb +46 -80
  22. data/lib/jekyll/commands/serve/live_reload_reactor.rb +6 -10
  23. data/lib/jekyll/commands/serve/servlet.rb +9 -11
  24. data/lib/jekyll/configuration.rb +26 -26
  25. data/lib/jekyll/converters/identity.rb +18 -0
  26. data/lib/jekyll/converters/markdown.rb +49 -40
  27. data/lib/jekyll/converters/markdown/kramdown_parser.rb +1 -10
  28. data/lib/jekyll/converters/smartypants.rb +34 -14
  29. data/lib/jekyll/convertible.rb +11 -13
  30. data/lib/jekyll/deprecator.rb +1 -3
  31. data/lib/jekyll/document.rb +44 -41
  32. data/lib/jekyll/drops/collection_drop.rb +2 -3
  33. data/lib/jekyll/drops/document_drop.rb +2 -1
  34. data/lib/jekyll/drops/drop.rb +3 -6
  35. data/lib/jekyll/drops/excerpt_drop.rb +4 -0
  36. data/lib/jekyll/drops/site_drop.rb +4 -13
  37. data/lib/jekyll/drops/unified_payload_drop.rb +1 -0
  38. data/lib/jekyll/drops/url_drop.rb +1 -0
  39. data/lib/jekyll/entry_filter.rb +2 -1
  40. data/lib/jekyll/excerpt.rb +45 -34
  41. data/lib/jekyll/external.rb +10 -5
  42. data/lib/jekyll/filters.rb +72 -31
  43. data/lib/jekyll/filters/date_filters.rb +6 -3
  44. data/lib/jekyll/filters/grouping_filters.rb +1 -2
  45. data/lib/jekyll/filters/url_filters.rb +6 -1
  46. data/lib/jekyll/frontmatter_defaults.rb +35 -19
  47. data/lib/jekyll/hooks.rb +2 -3
  48. data/lib/jekyll/liquid_extensions.rb +0 -2
  49. data/lib/jekyll/liquid_renderer.rb +13 -1
  50. data/lib/jekyll/liquid_renderer/file.rb +14 -3
  51. data/lib/jekyll/liquid_renderer/table.rb +67 -65
  52. data/lib/jekyll/log_adapter.rb +5 -1
  53. data/lib/jekyll/page.rb +10 -11
  54. data/lib/jekyll/page_without_a_file.rb +0 -4
  55. data/lib/jekyll/plugin.rb +5 -11
  56. data/lib/jekyll/plugin_manager.rb +2 -0
  57. data/lib/jekyll/reader.rb +38 -8
  58. data/lib/jekyll/readers/data_reader.rb +7 -9
  59. data/lib/jekyll/readers/layout_reader.rb +2 -12
  60. data/lib/jekyll/readers/post_reader.rb +29 -17
  61. data/lib/jekyll/readers/static_file_reader.rb +1 -1
  62. data/lib/jekyll/readers/theme_assets_reader.rb +7 -5
  63. data/lib/jekyll/regenerator.rb +4 -12
  64. data/lib/jekyll/renderer.rb +14 -25
  65. data/lib/jekyll/site.rb +78 -34
  66. data/lib/jekyll/static_file.rb +47 -11
  67. data/lib/jekyll/stevenson.rb +2 -3
  68. data/lib/jekyll/tags/highlight.rb +22 -52
  69. data/lib/jekyll/tags/include.rb +22 -38
  70. data/lib/jekyll/tags/link.rb +11 -7
  71. data/lib/jekyll/tags/post_url.rb +17 -16
  72. data/lib/jekyll/theme.rb +12 -23
  73. data/lib/jekyll/theme_builder.rb +91 -89
  74. data/lib/jekyll/url.rb +3 -2
  75. data/lib/jekyll/utils.rb +5 -4
  76. data/lib/jekyll/utils/ansi.rb +1 -1
  77. data/lib/jekyll/utils/exec.rb +0 -1
  78. data/lib/jekyll/utils/internet.rb +2 -4
  79. data/lib/jekyll/utils/platforms.rb +8 -8
  80. data/lib/jekyll/utils/thread_event.rb +1 -5
  81. data/lib/jekyll/utils/win_tz.rb +1 -1
  82. data/lib/jekyll/version.rb +1 -1
  83. data/lib/site_template/.gitignore +2 -0
  84. data/lib/site_template/404.html +1 -0
  85. data/lib/site_template/_config.yml +17 -5
  86. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +5 -1
  87. data/lib/site_template/{about.md → about.markdown} +0 -0
  88. data/lib/site_template/{index.md → index.markdown} +0 -0
  89. data/lib/theme_template/gitignore.erb +1 -0
  90. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -0
  91. metadata +85 -51
  92. data/lib/jekyll/converters/markdown/rdiscount_parser.rb +0 -37
  93. data/lib/jekyll/converters/markdown/redcarpet_parser.rb +0 -112
  94. data/lib/jekyll/utils/rouge.rb +0 -22
@@ -1,119 +1,121 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Jekyll::ThemeBuilder
4
- SCAFFOLD_DIRECTORIES = %w(
5
- assets _layouts _includes _sass
6
- ).freeze
7
-
8
- attr_reader :name, :path, :code_of_conduct
3
+ module Jekyll
4
+ class ThemeBuilder
5
+ SCAFFOLD_DIRECTORIES = %w(
6
+ assets _layouts _includes _sass
7
+ ).freeze
8
+
9
+ attr_reader :name, :path, :code_of_conduct
10
+
11
+ def initialize(theme_name, opts)
12
+ @name = theme_name.to_s.tr(" ", "_").squeeze("_")
13
+ @path = Pathname.new(File.expand_path(name, Dir.pwd))
14
+ @code_of_conduct = !!opts["code_of_conduct"]
15
+ end
9
16
 
10
- def initialize(theme_name, opts)
11
- @name = theme_name.to_s.tr(" ", "_").squeeze("_")
12
- @path = Pathname.new(File.expand_path(name, Dir.pwd))
13
- @code_of_conduct = !!opts["code_of_conduct"]
14
- end
17
+ def create!
18
+ create_directories
19
+ create_starter_files
20
+ create_gemspec
21
+ create_accessories
22
+ initialize_git_repo
23
+ end
15
24
 
16
- def create!
17
- create_directories
18
- create_starter_files
19
- create_gemspec
20
- create_accessories
21
- initialize_git_repo
22
- end
25
+ def user_name
26
+ @user_name ||= `git config user.name`.chomp
27
+ end
23
28
 
24
- def user_name
25
- @user_name ||= `git config user.name`.chomp
26
- end
29
+ def user_email
30
+ @user_email ||= `git config user.email`.chomp
31
+ end
27
32
 
28
- def user_email
29
- @user_email ||= `git config user.email`.chomp
30
- end
33
+ private
31
34
 
32
- private
35
+ def root
36
+ @root ||= Pathname.new(File.expand_path("../", __dir__))
37
+ end
33
38
 
34
- def root
35
- @root ||= Pathname.new(File.expand_path("../", __dir__))
36
- end
39
+ def template_file(filename)
40
+ [
41
+ root.join("theme_template", "#{filename}.erb"),
42
+ root.join("theme_template", filename.to_s),
43
+ ].find(&:exist?)
44
+ end
37
45
 
38
- def template_file(filename)
39
- [
40
- root.join("theme_template", "#{filename}.erb"),
41
- root.join("theme_template", filename.to_s),
42
- ].find(&:exist?)
43
- end
46
+ def template(filename)
47
+ erb.render(template_file(filename).read)
48
+ end
44
49
 
45
- def template(filename)
46
- erb.render(template_file(filename).read)
47
- end
50
+ def erb
51
+ @erb ||= ERBRenderer.new(self)
52
+ end
48
53
 
49
- def erb
50
- @erb ||= ERBRenderer.new(self)
51
- end
54
+ def mkdir_p(directories)
55
+ Array(directories).each do |directory|
56
+ full_path = path.join(directory)
57
+ Jekyll.logger.info "create", full_path.to_s
58
+ FileUtils.mkdir_p(full_path)
59
+ end
60
+ end
52
61
 
53
- def mkdir_p(directories)
54
- Array(directories).each do |directory|
55
- full_path = path.join(directory)
62
+ def write_file(filename, contents)
63
+ full_path = path.join(filename)
56
64
  Jekyll.logger.info "create", full_path.to_s
57
- FileUtils.mkdir_p(full_path)
65
+ File.write(full_path, contents)
58
66
  end
59
- end
60
-
61
- def write_file(filename, contents)
62
- full_path = path.join(filename)
63
- Jekyll.logger.info "create", full_path.to_s
64
- File.write(full_path, contents)
65
- end
66
67
 
67
- def create_directories
68
- mkdir_p(SCAFFOLD_DIRECTORIES)
69
- end
68
+ def create_directories
69
+ mkdir_p(SCAFFOLD_DIRECTORIES)
70
+ end
70
71
 
71
- def create_starter_files
72
- %w(page post default).each do |layout|
73
- write_file("_layouts/#{layout}.html", template("_layouts/#{layout}.html"))
72
+ def create_starter_files
73
+ %w(page post default).each do |layout|
74
+ write_file("_layouts/#{layout}.html", template("_layouts/#{layout}.html"))
75
+ end
74
76
  end
75
- end
76
77
 
77
- def create_gemspec
78
- write_file("Gemfile", template("Gemfile"))
79
- write_file("#{name}.gemspec", template("theme.gemspec"))
80
- end
78
+ def create_gemspec
79
+ write_file("Gemfile", template("Gemfile"))
80
+ write_file("#{name}.gemspec", template("theme.gemspec"))
81
+ end
81
82
 
82
- def create_accessories
83
- accessories = %w(README.md LICENSE.txt)
84
- accessories << "CODE_OF_CONDUCT.md" if code_of_conduct
85
- accessories.each do |filename|
86
- write_file(filename, template(filename))
83
+ def create_accessories
84
+ accessories = %w(README.md LICENSE.txt)
85
+ accessories << "CODE_OF_CONDUCT.md" if code_of_conduct
86
+ accessories.each do |filename|
87
+ write_file(filename, template(filename))
88
+ end
87
89
  end
88
- end
89
90
 
90
- def initialize_git_repo
91
- Jekyll.logger.info "initialize", path.join(".git").to_s
92
- Dir.chdir(path.to_s) { `git init` }
93
- write_file(".gitignore", template("gitignore"))
94
- end
91
+ def initialize_git_repo
92
+ Jekyll.logger.info "initialize", path.join(".git").to_s
93
+ Dir.chdir(path.to_s) { `git init` }
94
+ write_file(".gitignore", template("gitignore"))
95
+ end
95
96
 
96
- class ERBRenderer
97
- extend Forwardable
97
+ class ERBRenderer
98
+ extend Forwardable
98
99
 
99
- def_delegator :@theme_builder, :name, :theme_name
100
- def_delegator :@theme_builder, :user_name, :user_name
101
- def_delegator :@theme_builder, :user_email, :user_email
100
+ def_delegator :@theme_builder, :name, :theme_name
101
+ def_delegator :@theme_builder, :user_name, :user_name
102
+ def_delegator :@theme_builder, :user_email, :user_email
102
103
 
103
- def initialize(theme_builder)
104
- @theme_builder = theme_builder
105
- end
104
+ def initialize(theme_builder)
105
+ @theme_builder = theme_builder
106
+ end
106
107
 
107
- def jekyll_version_with_minor
108
- Jekyll::VERSION.split(".").take(2).join(".")
109
- end
108
+ def jekyll_version_with_minor
109
+ Jekyll::VERSION.split(".").take(2).join(".")
110
+ end
110
111
 
111
- def theme_directories
112
- SCAFFOLD_DIRECTORIES
113
- end
112
+ def theme_directories
113
+ SCAFFOLD_DIRECTORIES
114
+ end
114
115
 
115
- def render(contents)
116
- ERB.new(contents).result binding
116
+ def render(contents)
117
+ ERB.new(contents).result binding
118
+ end
117
119
  end
118
120
  end
119
121
  end
data/lib/jekyll/url.rb CHANGED
@@ -68,6 +68,7 @@ module Jekyll
68
68
  def generate_url_from_hash(template)
69
69
  @placeholders.inject(template) do |result, token|
70
70
  break result if result.index(":").nil?
71
+
71
72
  if token.last.nil?
72
73
  # Remove leading "/" to avoid generating urls with `//`
73
74
  result.gsub("/:#{token.first}", "")
@@ -98,8 +99,8 @@ module Jekyll
98
99
  winner = pool.find { |key| @placeholders.key?(key) }
99
100
  if winner.nil?
100
101
  raise NoMethodError,
101
- "The URL template doesn't have #{pool.join(" or ")} keys. "\
102
- "Check your permalink template!"
102
+ "The URL template doesn't have #{pool.join(" or ")} keys. "\
103
+ "Check your permalink template!"
103
104
  end
104
105
 
105
106
  value = @placeholders[winner]
data/lib/jekyll/utils.rb CHANGED
@@ -7,7 +7,6 @@ module Jekyll
7
7
  autoload :Exec, "jekyll/utils/exec"
8
8
  autoload :Internet, "jekyll/utils/internet"
9
9
  autoload :Platforms, "jekyll/utils/platforms"
10
- autoload :Rouge, "jekyll/utils/rouge"
11
10
  autoload :ThreadEvent, "jekyll/utils/thread_event"
12
11
  autoload :WinTZ, "jekyll/utils/win_tz"
13
12
 
@@ -153,6 +152,7 @@ module Jekyll
153
152
  # Returns true is the string contains sequences of `{%` or `{{`
154
153
  def has_liquid_construct?(content)
155
154
  return false if content.nil? || content.empty?
155
+
156
156
  content.include?("{%") || content.include?("{{")
157
157
  end
158
158
  # rubocop: enable PredicateName
@@ -222,6 +222,7 @@ module Jekyll
222
222
  slug.gsub!(%r!^\-|\-$!i, "")
223
223
 
224
224
  slug.downcase! unless cased
225
+ Jekyll.logger.warn("Warning:", "Empty `slug` generated for '#{string}'.") if slug.empty?
225
226
  slug
226
227
  end
227
228
 
@@ -293,8 +294,10 @@ module Jekyll
293
294
  # Returns matched pathes
294
295
  def safe_glob(dir, patterns, flags = 0)
295
296
  return [] unless Dir.exist?(dir)
297
+
296
298
  pattern = File.join(Array(patterns))
297
299
  return [dir] if pattern.empty?
300
+
298
301
  Dir.chdir(dir) do
299
302
  Dir.glob(pattern, flags).map { |f| File.join(dir, f) }
300
303
  end
@@ -314,6 +317,7 @@ module Jekyll
314
317
  end
315
318
 
316
319
  private
320
+
317
321
  def merge_values(target, overwrite)
318
322
  target.merge!(overwrite) do |_key, old_val, new_val|
319
323
  if new_val.nil?
@@ -326,14 +330,12 @@ module Jekyll
326
330
  end
327
331
  end
328
332
 
329
- private
330
333
  def merge_default_proc(target, overwrite)
331
334
  if target.is_a?(Hash) && overwrite.is_a?(Hash) && target.default_proc.nil?
332
335
  target.default_proc = overwrite.default_proc
333
336
  end
334
337
  end
335
338
 
336
- private
337
339
  def duplicate_frozen_values(target)
338
340
  target.each do |key, val|
339
341
  target[key] = val.dup if val.frozen? && duplicable?(val)
@@ -344,7 +346,6 @@ module Jekyll
344
346
  #
345
347
  # See Utils#slugify for a description of the character sequence specified
346
348
  # by each mode.
347
- private
348
349
  def replace_character_sequence_with_hyphen(string, mode: "default")
349
350
  replaceable_char =
350
351
  case mode
@@ -6,7 +6,7 @@ module Jekyll
6
6
  extend self
7
7
 
8
8
  ESCAPE = format("%c", 27)
9
- MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix
9
+ MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix.freeze
10
10
  COLORS = {
11
11
  :red => 31,
12
12
  :green => 32,
@@ -21,7 +21,6 @@ module Jekyll
21
21
  [stdin, stdout, stderr].each(&:close)
22
22
  [process.value, out + err]
23
23
  end
24
-
25
24
  end
26
25
  end
27
26
  end
@@ -3,7 +3,6 @@
3
3
  module Jekyll
4
4
  module Utils
5
5
  module Internet
6
-
7
6
  # Public: Determine whether the present device has a connection to
8
7
  # the Internet. This allows plugin writers which require the outside
9
8
  # world to have a neat fallback mechanism for offline building.
@@ -18,13 +17,13 @@ module Jekyll
18
17
  # end
19
18
  #
20
19
  # Returns true if a DNS call can successfully be made, or false if not.
20
+
21
21
  module_function
22
+
22
23
  def connected?
23
24
  !dns("example.com").nil?
24
25
  end
25
26
 
26
- private
27
- module_function
28
27
  def dns(domain)
29
28
  require "resolv"
30
29
  Resolv::DNS.open do |resolver|
@@ -33,7 +32,6 @@ module Jekyll
33
32
  rescue Resolv::ResolvError, Resolv::ResolvTimeout
34
33
  nil
35
34
  end
36
-
37
35
  end
38
36
  end
39
37
  end
@@ -31,7 +31,7 @@ module Jekyll
31
31
  # --
32
32
 
33
33
  alias_method :really_windows?, \
34
- :vanilla_windows?
34
+ :vanilla_windows?
35
35
 
36
36
  #
37
37
 
@@ -68,14 +68,14 @@ module Jekyll
68
68
  #
69
69
 
70
70
  private
71
+
71
72
  def proc_version
72
- @proc_version ||= begin
73
- Pathutil.new(
74
- "/proc/version"
75
- ).read
76
- rescue Errno::ENOENT
77
- nil
78
- end
73
+ @proc_version ||=
74
+ begin
75
+ Pathutil.new("/proc/version").read
76
+ rescue Errno::ENOENT, Errno::EACCES
77
+ nil
78
+ end
79
79
  end
80
80
  end
81
81
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "thread"
4
-
5
3
  module Jekyll
6
4
  module Utils
7
5
  # Based on the pattern and code from
@@ -25,9 +23,7 @@ module Jekyll
25
23
 
26
24
  def wait
27
25
  @lock.synchronize do
28
- unless @flag
29
- @cond.wait(@lock)
30
- end
26
+ @cond.wait(@lock) unless @flag
31
27
  end
32
28
  end
33
29
  end
@@ -21,7 +21,7 @@ module Jekyll
21
21
  # is denoted as:
22
22
  # EST+5 (or) EST+05:00
23
23
  # Reference: http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
24
- sign = difference < 0 ? "-" : "+"
24
+ sign = difference.negative? ? "-" : "+"
25
25
  offset = sign == "-" ? "+" : "-" unless difference.zero?
26
26
  #
27
27
  # convert the difference (in seconds) to hours, as a rational number, and perform
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Jekyll
4
- VERSION = "3.9.1".freeze
4
+ VERSION = "4.0.0.pre.alpha1"
5
5
  end
@@ -1,3 +1,5 @@
1
1
  _site
2
2
  .sass-cache
3
+ .jekyll-cache
3
4
  .jekyll-metadata
5
+ vendor
@@ -1,4 +1,5 @@
1
1
  ---
2
+ permalink: /404.html
2
3
  layout: default
3
4
  ---
4
5
 
@@ -7,12 +7,17 @@
7
7
  #
8
8
  # For technical reasons, this file is *NOT* reloaded automatically when you use
9
9
  # 'bundle exec jekyll serve'. If you change this file, please restart the server process.
10
-
10
+ #
11
+ # If you need help with YAML syntax, here are some quick references for you:
12
+ # https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
13
+ # https://learnxinyminutes.com/docs/yaml/
14
+ #
11
15
  # Site settings
12
16
  # These are used to personalize your new site. If you look in the HTML files,
13
17
  # you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
14
18
  # You can create any custom variable you would like, and they will be accessible
15
19
  # in the templates via {{ site.myvariable }}.
20
+
16
21
  title: Your awesome title
17
22
  email: your-email@example.com
18
23
  description: >- # this means to ignore newlines until "baseurl:"
@@ -25,18 +30,25 @@ twitter_username: jekyllrb
25
30
  github_username: jekyll
26
31
 
27
32
  # Build settings
28
- markdown: kramdown
29
33
  theme: minima
30
34
  plugins:
31
35
  - jekyll-feed
32
36
 
33
37
  # Exclude from processing.
34
- # The following items will not be processed, by default. Create a custom list
35
- # to override the default setting.
38
+ # The following items will not be processed, by default.
39
+ # Any item listed under the `exclude:` key here will be automatically added to
40
+ # the internal "default list".
41
+ #
42
+ # Excluded items can be processed by explicitly listing the directories or
43
+ # their entries' file path in the `include:` list.
44
+ #
36
45
  # exclude:
46
+ # - .sass-cache/
47
+ # - .jekyll-cache/
48
+ # - gemfiles/
37
49
  # - Gemfile
38
50
  # - Gemfile.lock
39
- # - node_modules
51
+ # - node_modules/
40
52
  # - vendor/bundle/
41
53
  # - vendor/cache/
42
54
  # - vendor/gems/