jekyll 3.9.5 → 4.0.0.pre.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) 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/cache.rb +183 -0
  11. data/lib/jekyll/cleaner.rb +2 -1
  12. data/lib/jekyll/collection.rb +78 -8
  13. data/lib/jekyll/command.rb +31 -6
  14. data/lib/jekyll/commands/build.rb +11 -20
  15. data/lib/jekyll/commands/clean.rb +2 -0
  16. data/lib/jekyll/commands/doctor.rb +15 -8
  17. data/lib/jekyll/commands/help.rb +1 -1
  18. data/lib/jekyll/commands/new.rb +37 -42
  19. data/lib/jekyll/commands/new_theme.rb +30 -28
  20. data/lib/jekyll/commands/serve/live_reload_reactor.rb +6 -10
  21. data/lib/jekyll/commands/serve/servlet.rb +15 -19
  22. data/lib/jekyll/commands/serve.rb +46 -86
  23. data/lib/jekyll/configuration.rb +26 -26
  24. data/lib/jekyll/converters/identity.rb +18 -0
  25. data/lib/jekyll/converters/markdown/kramdown_parser.rb +1 -10
  26. data/lib/jekyll/converters/markdown.rb +49 -40
  27. data/lib/jekyll/converters/smartypants.rb +34 -14
  28. data/lib/jekyll/convertible.rb +11 -13
  29. data/lib/jekyll/deprecator.rb +1 -3
  30. data/lib/jekyll/document.rb +44 -41
  31. data/lib/jekyll/drops/collection_drop.rb +2 -3
  32. data/lib/jekyll/drops/document_drop.rb +2 -1
  33. data/lib/jekyll/drops/drop.rb +3 -6
  34. data/lib/jekyll/drops/excerpt_drop.rb +4 -0
  35. data/lib/jekyll/drops/site_drop.rb +4 -13
  36. data/lib/jekyll/drops/unified_payload_drop.rb +1 -0
  37. data/lib/jekyll/drops/url_drop.rb +1 -0
  38. data/lib/jekyll/entry_filter.rb +2 -1
  39. data/lib/jekyll/excerpt.rb +45 -34
  40. data/lib/jekyll/external.rb +10 -5
  41. data/lib/jekyll/filters/date_filters.rb +6 -3
  42. data/lib/jekyll/filters/grouping_filters.rb +1 -2
  43. data/lib/jekyll/filters/url_filters.rb +6 -1
  44. data/lib/jekyll/filters.rb +72 -31
  45. data/lib/jekyll/frontmatter_defaults.rb +35 -19
  46. data/lib/jekyll/hooks.rb +2 -3
  47. data/lib/jekyll/liquid_extensions.rb +0 -2
  48. data/lib/jekyll/liquid_renderer/file.rb +14 -3
  49. data/lib/jekyll/liquid_renderer/table.rb +67 -65
  50. data/lib/jekyll/liquid_renderer.rb +13 -1
  51. data/lib/jekyll/log_adapter.rb +5 -1
  52. data/lib/jekyll/mime.types +80 -195
  53. data/lib/jekyll/page.rb +10 -26
  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 +5 -5
  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 +7 -5
  68. data/lib/jekyll/tags/highlight.rb +22 -52
  69. data/lib/jekyll/tags/include.rb +27 -48
  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/ansi.rb +1 -1
  76. data/lib/jekyll/utils/exec.rb +0 -1
  77. data/lib/jekyll/utils/internet.rb +2 -4
  78. data/lib/jekyll/utils/platforms.rb +8 -8
  79. data/lib/jekyll/utils/thread_event.rb +1 -5
  80. data/lib/jekyll/utils/win_tz.rb +47 -18
  81. data/lib/jekyll/utils.rb +5 -4
  82. data/lib/jekyll/version.rb +1 -1
  83. data/lib/jekyll.rb +5 -0
  84. data/lib/site_template/.gitignore +2 -0
  85. data/lib/site_template/404.html +1 -0
  86. data/lib/site_template/_config.yml +17 -5
  87. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +5 -1
  88. data/lib/theme_template/gitignore.erb +1 -0
  89. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -0
  90. metadata +75 -48
  91. data/lib/jekyll/commands/serve/mime_types_charset.json +0 -71
  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
  95. /data/lib/site_template/{about.md → about.markdown} +0 -0
  96. /data/lib/site_template/{index.md → index.markdown} +0 -0
data/lib/jekyll/hooks.rb CHANGED
@@ -60,6 +60,7 @@ module Jekyll
60
60
  # Ensure the priority is a Fixnum
61
61
  def self.priority_value(priority)
62
62
  return priority if priority.is_a?(Integer)
63
+
63
64
  PRIORITY_MAP[priority] || DEFAULT_PRIORITY
64
65
  end
65
66
 
@@ -77,9 +78,7 @@ module Jekyll
77
78
  "following hooks #{@registry[owner].keys.inspect}"
78
79
  end
79
80
 
80
- unless block.respond_to? :call
81
- raise Uncallable, "Hooks must respond to :call"
82
- end
81
+ raise Uncallable, "Hooks must respond to :call" unless block.respond_to? :call
83
82
 
84
83
  insert_hook owner, event, priority, &block
85
84
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module LiquidExtensions
5
-
6
5
  # Lookup a Liquid variable in the given context.
7
6
  #
8
7
  # context - the Liquid context in question.
@@ -19,6 +18,5 @@ module Jekyll
19
18
 
20
19
  lookup || variable
21
20
  end
22
-
23
21
  end
24
22
  end
@@ -10,8 +10,9 @@ module Jekyll
10
10
 
11
11
  def parse(content)
12
12
  measure_time do
13
- @template = Liquid::Template.parse(content, :line_numbers => true)
13
+ @renderer.cache[@filename] ||= Liquid::Template.parse(content, :line_numbers => true)
14
14
  end
15
+ @template = @renderer.cache[@filename]
15
16
 
16
17
  self
17
18
  end
@@ -19,15 +20,20 @@ module Jekyll
19
20
  def render(*args)
20
21
  measure_time do
21
22
  measure_bytes do
22
- @template.render(*args)
23
+ measure_counts do
24
+ @template.render(*args)
25
+ end
23
26
  end
24
27
  end
25
28
  end
26
29
 
30
+ # This method simply 'rethrows any error' before attempting to render the template.
27
31
  def render!(*args)
28
32
  measure_time do
29
33
  measure_bytes do
30
- @template.render!(*args)
34
+ measure_counts do
35
+ @template.render!(*args)
36
+ end
31
37
  end
32
38
  end
33
39
  end
@@ -38,6 +44,11 @@ module Jekyll
38
44
 
39
45
  private
40
46
 
47
+ def measure_counts
48
+ @renderer.increment_count(@filename)
49
+ yield
50
+ end
51
+
41
52
  def measure_bytes
42
53
  yield.tap do |str|
43
54
  @renderer.increment_bytes(@filename, str.bytesize)
@@ -1,96 +1,98 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Jekyll
4
- class LiquidRenderer::Table
5
- def initialize(stats)
6
- @stats = stats
7
- end
4
+ class LiquidRenderer
5
+ class Table
6
+ def initialize(stats)
7
+ @stats = stats
8
+ end
8
9
 
9
- def to_s(num_of_rows = 50)
10
- data = data_for_table(num_of_rows)
11
- widths = table_widths(data)
12
- generate_table(data, widths)
13
- end
10
+ def to_s(num_of_rows = 50)
11
+ data = data_for_table(num_of_rows)
12
+ widths = table_widths(data)
13
+ generate_table(data, widths)
14
+ end
14
15
 
15
- private
16
+ private
16
17
 
17
- def generate_table(data, widths)
18
- str = String.new("\n")
18
+ def generate_table(data, widths)
19
+ str = +"\n"
19
20
 
20
- table_head = data.shift
21
- str << generate_row(table_head, widths)
22
- str << generate_table_head_border(table_head, widths)
21
+ table_head = data.shift
22
+ str << generate_row(table_head, widths)
23
+ str << generate_table_head_border(table_head, widths)
23
24
 
24
- data.each do |row_data|
25
- str << generate_row(row_data, widths)
25
+ data.each do |row_data|
26
+ str << generate_row(row_data, widths)
27
+ end
28
+
29
+ str << "\n"
30
+ str
26
31
  end
27
32
 
28
- str << "\n"
29
- str
30
- end
33
+ def generate_table_head_border(row_data, widths)
34
+ str = +""
31
35
 
32
- def generate_table_head_border(row_data, widths)
33
- str = String.new("")
36
+ row_data.each_index do |cell_index|
37
+ str << "-" * widths[cell_index]
38
+ str << "-+-" unless cell_index == row_data.length - 1
39
+ end
34
40
 
35
- row_data.each_index do |cell_index|
36
- str << "-" * widths[cell_index]
37
- str << "-+-" unless cell_index == row_data.length - 1
41
+ str << "\n"
42
+ str
38
43
  end
39
44
 
40
- str << "\n"
41
- str
42
- end
45
+ def generate_row(row_data, widths)
46
+ str = +""
43
47
 
44
- def generate_row(row_data, widths)
45
- str = String.new("")
48
+ row_data.each_with_index do |cell_data, cell_index|
49
+ str << if cell_index.zero?
50
+ cell_data.ljust(widths[cell_index], " ")
51
+ else
52
+ cell_data.rjust(widths[cell_index], " ")
53
+ end
46
54
 
47
- row_data.each_with_index do |cell_data, cell_index|
48
- str << if cell_index.zero?
49
- cell_data.ljust(widths[cell_index], " ")
50
- else
51
- cell_data.rjust(widths[cell_index], " ")
52
- end
55
+ str << " | " unless cell_index == row_data.length - 1
56
+ end
53
57
 
54
- str << " | " unless cell_index == row_data.length - 1
58
+ str << "\n"
59
+ str
55
60
  end
56
61
 
57
- str << "\n"
58
- str
59
- end
60
-
61
- def table_widths(data)
62
- widths = []
62
+ def table_widths(data)
63
+ widths = []
63
64
 
64
- data.each do |row|
65
- row.each_with_index do |cell, index|
66
- widths[index] = [cell.length, widths[index]].compact.max
65
+ data.each do |row|
66
+ row.each_with_index do |cell, index|
67
+ widths[index] = [cell.length, widths[index]].compact.max
68
+ end
67
69
  end
70
+
71
+ widths
68
72
  end
69
73
 
70
- widths
71
- end
74
+ def data_for_table(num_of_rows)
75
+ sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] }
76
+ sorted = sorted.slice(0, num_of_rows)
72
77
 
73
- def data_for_table(num_of_rows)
74
- sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] }
75
- sorted = sorted.slice(0, num_of_rows)
78
+ table = [%w(Filename Count Bytes Time)]
76
79
 
77
- table = [%w(Filename Count Bytes Time)]
80
+ sorted.each do |filename, file_stats|
81
+ row = []
82
+ row << filename
83
+ row << file_stats[:count].to_s
84
+ row << format_bytes(file_stats[:bytes])
85
+ row << format("%.3f", file_stats[:time])
86
+ table << row
87
+ end
78
88
 
79
- sorted.each do |filename, file_stats|
80
- row = []
81
- row << filename
82
- row << file_stats[:count].to_s
83
- row << format_bytes(file_stats[:bytes])
84
- row << format("%.3f", file_stats[:time])
85
- table << row
89
+ table
86
90
  end
87
91
 
88
- table
89
- end
90
-
91
- def format_bytes(bytes)
92
- bytes /= 1024.0
93
- format("%.2fK", bytes)
92
+ def format_bytes(bytes)
93
+ bytes /= 1024.0
94
+ format("%.2fK", bytes)
95
+ end
94
96
  end
95
97
  end
96
98
  end
@@ -18,6 +18,7 @@ module Jekyll
18
18
 
19
19
  def reset
20
20
  @stats = {}
21
+ @cache = {}
21
22
  end
22
23
 
23
24
  def file(filename)
@@ -30,7 +31,6 @@ module Jekyll
30
31
  end
31
32
  LiquidRenderer::File.new(self, filename).tap do
32
33
  @stats[filename] ||= new_profile_hash
33
- @stats[filename][:count] += 1
34
34
  end
35
35
  end
36
36
 
@@ -42,6 +42,10 @@ module Jekyll
42
42
  @stats[filename][:time] += time
43
43
  end
44
44
 
45
+ def increment_count(filename)
46
+ @stats[filename][:count] += 1
47
+ end
48
+
45
49
  def stats_table(num_of_rows = 50)
46
50
  LiquidRenderer::Table.new(@stats).to_s(num_of_rows)
47
51
  end
@@ -50,6 +54,14 @@ module Jekyll
50
54
  "#{error.message} in #{path}"
51
55
  end
52
56
 
57
+ # A persistent cache to store and retrieve parsed templates based on the filename
58
+ # via `LiquidRenderer::File#parse`
59
+ #
60
+ # It is emptied when `self.reset` is called.
61
+ def cache
62
+ @cache ||= {}
63
+ end
64
+
53
65
  private
54
66
 
55
67
  def filename_regex
@@ -29,7 +29,9 @@ module Jekyll
29
29
  #
30
30
  # Returns nothing
31
31
  def log_level=(level)
32
- writer.level = LOG_LEVELS.fetch(level)
32
+ writer.level = level if level.is_a?(Integer) && level.between?(0, 3)
33
+ writer.level = LOG_LEVELS[level] ||
34
+ raise(ArgumentError, "unknown log level")
33
35
  @level = level
34
36
  end
35
37
 
@@ -41,6 +43,7 @@ module Jekyll
41
43
  self.log_level = :debug
42
44
  end
43
45
  debug "Logging at level:", LOG_LEVELS.key(writer.level).to_s
46
+ debug "Jekyll Version:", Jekyll::VERSION
44
47
  end
45
48
 
46
49
  # Public: Print a debug message
@@ -141,6 +144,7 @@ module Jekyll
141
144
  # the appropriate writer method, e.g. writer.info.
142
145
  def write(level_of_message, topic, message = nil, &block)
143
146
  return false unless write_message?(level_of_message)
147
+
144
148
  writer.public_send(level_of_message, message(topic, message, &block))
145
149
  end
146
150
  end