jekyll-archives 2.1.1 → 2.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2f27192f95a4ce144e1d72588b4bf80d765357f2
4
- data.tar.gz: 2e51316514e8d6020cfc281c302b9854e66e7c4b
2
+ SHA256:
3
+ metadata.gz: 50b7b8aebac240d8301566358280400e017127a035a5d31ab4e7eea412b17199
4
+ data.tar.gz: e2443238bbb35443bf37bfce255492ba035ab3d46d54a6be7dcf5cab28548a2f
5
5
  SHA512:
6
- metadata.gz: 6a07cb99f2004e548f0b386485f1f6a5ec9139b24f99db985a8a3e1b55ae42459fe07826aa5eaadc92f8454bbf5a82d3ff5c0b9891e1a0aa557190b6da5dd6a6
7
- data.tar.gz: f46620e903c6a09d2bd7ac414162d45eaeacf7a3f95ce407b6cb4e2dabe63358bd8e9946698bff2b32b436fbaa17da34fe24ad74df8b6ce51d48b40db18749d5
6
+ metadata.gz: f001b57c44f9ccc6f4664695b7159c0961e2bc4c202343c9ab25e11b1484d529547277937d38023254be55f4dc231b595d4e0ad274c61d189e5607ab2b9d40d5
7
+ data.tar.gz: 2e49eb77fa4803b0407f23940de2139c0e2929f5fef86d6785a501f5dbbf44837c6bc62a6eddcea22ed6250fa3e501d4a87c55f9d2af0ab8c4dc2a553aff7585
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014-present Alfred Xing and the jekyll-archives contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jekyll
2
4
  module Archives
3
5
  class Archive < Jekyll::Page
4
-
5
6
  attr_accessor :posts, :type, :slug
6
7
 
7
8
  # Attributes for Liquid templates
@@ -13,6 +14,7 @@ module Jekyll
13
14
  name
14
15
  path
15
16
  url
17
+ permalink
16
18
  ).freeze
17
19
 
18
20
  # Initialize a new Archive page
@@ -27,12 +29,8 @@ module Jekyll
27
29
  @posts = posts
28
30
  @type = type
29
31
  @title = title
30
- @config = site.config['jekyll-archives']
31
-
32
- # Generate slug if tag or category (taken from jekyll/jekyll/features/support/env.rb)
33
- if title.to_s.length
34
- @slug = Utils.slugify(title.to_s)
35
- end
32
+ @config = site.config["jekyll-archives"]
33
+ @slug = slugify_string_title
36
34
 
37
35
  # Use ".html" for file extension and url for path
38
36
  @ext = File.extname(relative_path)
@@ -40,7 +38,7 @@ module Jekyll
40
38
  @name = File.basename(relative_path, @ext)
41
39
 
42
40
  @data = {
43
- "layout" => layout
41
+ "layout" => layout,
44
42
  }
45
43
  @content = ""
46
44
  end
@@ -49,25 +47,21 @@ module Jekyll
49
47
  #
50
48
  # Returns the template String.
51
49
  def template
52
- @config['permalinks'][type]
50
+ @config.dig("permalinks", type)
53
51
  end
54
52
 
55
53
  # The layout to use for rendering
56
54
  #
57
55
  # Returns the layout as a String
58
56
  def layout
59
- if @config['layouts'] && @config['layouts'][type]
60
- @config['layouts'][type]
61
- else
62
- @config['layout']
63
- end
57
+ @config.dig("layouts", type) || @config["layout"]
64
58
  end
65
59
 
66
60
  # Returns a hash of URL placeholder names (as symbols) mapping to the
67
61
  # desired placeholder replacements. For details see "url.rb".
68
62
  def url_placeholders
69
63
  if @title.is_a? Hash
70
- @title.merge({ :type => @type })
64
+ @title.merge(:type => @type)
71
65
  else
72
66
  { :name => @slug, :type => @type }
73
67
  end
@@ -77,13 +71,17 @@ module Jekyll
77
71
  #
78
72
  # Returns the String url.
79
73
  def url
80
- @url ||= URL.new({
81
- :template => template,
74
+ @url ||= URL.new(
75
+ :template => template,
82
76
  :placeholders => url_placeholders,
83
- :permalink => nil
84
- }).to_s
77
+ :permalink => nil
78
+ ).to_s
85
79
  rescue ArgumentError
86
- raise ArgumentError.new "Template \"#{template}\" provided is invalid."
80
+ raise ArgumentError, "Template #{template.inspect} provided is invalid."
81
+ end
82
+
83
+ def permalink
84
+ data.is_a?(Hash) && data["permalink"]
87
85
  end
88
86
 
89
87
  # Produce a title object suitable for Liquid based on type of archive.
@@ -91,17 +89,17 @@ module Jekyll
91
89
  # Returns a String (for tag and category archives) and nil for
92
90
  # date-based archives.
93
91
  def title
94
- if @title.is_a? String
95
- @title
96
- end
92
+ @title if @title.is_a?(String)
97
93
  end
98
94
 
99
95
  # Produce a date object if a date-based archive
100
96
  #
101
97
  # Returns a Date.
102
98
  def date
103
- if @title.is_a? Hash
104
- args = @title.values.map { |s| s.to_i }
99
+ return unless @title.is_a?(Hash)
100
+
101
+ @date ||= begin
102
+ args = @title.values.map(&:to_i)
105
103
  Date.new(*args)
106
104
  end
107
105
  end
@@ -110,14 +108,33 @@ module Jekyll
110
108
  #
111
109
  # Returns the destination relative path String.
112
110
  def relative_path
113
- path = URL.unescape_path(url).gsub(/^\//, '')
114
- path = File.join(path, "index.html") if url =~ /\/$/
115
- path
111
+ @relative_path ||= begin
112
+ path = URL.unescape_path(url).gsub(%r!^/!, "")
113
+ path = File.join(path, "index.html") if url.end_with?("/")
114
+ path
115
+ end
116
116
  end
117
117
 
118
118
  # Returns the object as a debug String.
119
119
  def inspect
120
- "#<Jekyll:Archive @type=#{@type.to_s} @title=#{@title} @data=#{@data.inspect}>"
120
+ "#<Jekyll:Archive @type=#{@type} @title=#{@title} @data=#{@data.inspect}>"
121
+ end
122
+
123
+ # The Liquid representation of this page.
124
+ def to_liquid
125
+ @to_liquid ||= Jekyll::Archives::PageDrop.new(self)
126
+ end
127
+
128
+ private
129
+
130
+ # Generate slug if @title attribute is a string.
131
+ #
132
+ # Note: mode other than those expected by Jekyll returns the given string after
133
+ # downcasing it.
134
+ def slugify_string_title
135
+ return unless title.is_a?(String)
136
+
137
+ Utils.slugify(title, :mode => @config["slug_mode"])
121
138
  end
122
139
  end
123
140
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Archives
5
+ class PageDrop < Jekyll::Drops::Drop
6
+ extend Forwardable
7
+
8
+ mutable false
9
+
10
+ def_delegators :@obj, :posts, :type, :title, :date, :name, :path, :url, :permalink
11
+ private def_delegator :@obj, :data, :fallback_data
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Archives
5
+ VERSION = "2.3.0"
6
+ end
7
+ end
@@ -1,48 +1,49 @@
1
- require 'jekyll'
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
2
4
 
3
5
  module Jekyll
4
6
  module Archives
5
7
  # Internal requires
6
- autoload :Archive, 'jekyll-archives/archive'
7
- autoload :VERSION, 'jekyll-archives/version'
8
-
9
- if (Jekyll.const_defined? :Hooks)
10
- Jekyll::Hooks.register :site, :after_reset do |site|
11
- # We need to disable incremental regen for Archives to generate with the
12
- # correct content
13
- site.regenerator.instance_variable_set(:@disabled, true)
14
- end
15
- end
8
+ autoload :Archive, "jekyll-archives/archive"
9
+ autoload :PageDrop, "jekyll-archives/page_drop"
10
+ autoload :VERSION, "jekyll-archives/version"
16
11
 
17
12
  class Archives < Jekyll::Generator
18
13
  safe true
19
14
 
20
15
  DEFAULTS = {
21
- 'layout' => 'archive',
22
- 'enabled' => [],
23
- 'permalinks' => {
24
- 'year' => '/:year/',
25
- 'month' => '/:year/:month/',
26
- 'day' => '/:year/:month/:day/',
27
- 'tag' => '/tag/:name/',
28
- 'category' => '/category/:name/'
29
- }
30
- }
31
-
32
- def initialize(config = nil)
33
- if config['jekyll-archives'].nil?
34
- @config = DEFAULTS
16
+ "layout" => "archive",
17
+ "enabled" => [],
18
+ "permalinks" => {
19
+ "year" => "/:year/",
20
+ "month" => "/:year/:month/",
21
+ "day" => "/:year/:month/:day/",
22
+ "tag" => "/tag/:name/",
23
+ "category" => "/category/:name/",
24
+ },
25
+ }.freeze
26
+
27
+ def initialize(config = {})
28
+ archives_config = config.fetch("jekyll-archives", {})
29
+ if archives_config.is_a?(Hash)
30
+ @config = Utils.deep_merge_hashes(DEFAULTS, archives_config)
35
31
  else
36
- @config = Utils.deep_merge_hashes(DEFAULTS, config['jekyll-archives'])
32
+ @config = nil
33
+ Jekyll.logger.warn "Archives:", "Expected a hash but got #{archives_config.inspect}"
34
+ Jekyll.logger.warn "", "Archives will not be generated for this site."
37
35
  end
36
+ @enabled = @config && @config["enabled"]
38
37
  end
39
38
 
40
39
  def generate(site)
40
+ return if @config.nil?
41
+
41
42
  @site = site
42
43
  @posts = site.posts
43
44
  @archives = []
44
45
 
45
- @site.config['jekyll-archives'] = @config
46
+ @site.config["jekyll-archives"] = @config
46
47
 
47
48
  read
48
49
  @site.pages.concat(@archives)
@@ -74,12 +75,12 @@ module Jekyll
74
75
  end
75
76
 
76
77
  def read_dates
77
- years.each do |year, posts|
78
- @archives << Archive.new(@site, { :year => year }, "year", posts) if enabled? "year"
79
- months(posts).each do |month, posts|
80
- @archives << Archive.new(@site, { :year => year, :month => month }, "month", posts) if enabled? "month"
81
- days(posts).each do |day, posts|
82
- @archives << Archive.new(@site, { :year => year, :month => month, :day => day }, "day", posts) if enabled? "day"
78
+ years.each do |year, y_posts|
79
+ append_enabled_date_type({ :year => year }, "year", y_posts)
80
+ months(y_posts).each do |month, m_posts|
81
+ append_enabled_date_type({ :year => year, :month => month }, "month", m_posts)
82
+ days(m_posts).each do |day, d_posts|
83
+ append_enabled_date_type({ :year => year, :month => month, :day => day }, "day", d_posts)
83
84
  end
84
85
  end
85
86
  end
@@ -87,44 +88,52 @@ module Jekyll
87
88
 
88
89
  # Checks if archive type is enabled in config
89
90
  def enabled?(archive)
90
- @config["enabled"] == true || @config["enabled"] == "all" || if @config["enabled"].is_a? Array
91
- @config["enabled"].include? archive
92
- end
91
+ @enabled == true || @enabled == "all" || (@enabled.is_a?(Array) && @enabled.include?(archive))
93
92
  end
94
93
 
95
94
  def tags
96
- @site.post_attr_hash('tags')
95
+ @site.tags
97
96
  end
98
97
 
99
98
  def categories
100
- @site.post_attr_hash('categories')
99
+ @site.categories
101
100
  end
102
101
 
103
102
  # Custom `post_attr_hash` method for years
104
103
  def years
105
- hash = Hash.new { |h, key| h[key] = [] }
106
-
107
- # In Jekyll 3, Collection#each should be called on the #docs array directly.
108
- if Jekyll::VERSION >= '3.0.0'
109
- @posts.docs.each { |p| hash[p.date.strftime("%Y")] << p }
110
- else
111
- @posts.each { |p| hash[p.date.strftime("%Y")] << p }
112
- end
113
- hash.values.each { |posts| posts.sort!.reverse! }
114
- hash
104
+ date_attr_hash(@posts.docs, "%Y")
115
105
  end
116
106
 
107
+ # Custom `post_attr_hash` method for months
117
108
  def months(year_posts)
118
- hash = Hash.new { |h, key| h[key] = [] }
119
- year_posts.each { |p| hash[p.date.strftime("%m")] << p }
120
- hash.values.each { |posts| posts.sort!.reverse! }
121
- hash
109
+ date_attr_hash(year_posts, "%m")
122
110
  end
123
111
 
112
+ # Custom `post_attr_hash` method for days
124
113
  def days(month_posts)
125
- hash = Hash.new { |h, key| h[key] = [] }
126
- month_posts.each { |p| hash[p.date.strftime("%d")] << p }
127
- hash.values.each { |posts| posts.sort!.reverse! }
114
+ date_attr_hash(month_posts, "%d")
115
+ end
116
+
117
+ private
118
+
119
+ # Initialize a new Archive page and append to base array if the associated date `type`
120
+ # has been enabled by configuration.
121
+ #
122
+ # meta - A Hash of the year / month / day as applicable for date.
123
+ # type - The type of date archive.
124
+ # posts - The array of posts that belong in the date archive.
125
+ def append_enabled_date_type(meta, type, posts)
126
+ @archives << Archive.new(@site, meta, type, posts) if enabled?(type)
127
+ end
128
+
129
+ # Custom `post_attr_hash` for date type archives.
130
+ #
131
+ # posts - Array of posts to be considered for archiving.
132
+ # id - String used to format post date via `Time.strptime` e.g. %Y, %m, etc.
133
+ def date_attr_hash(posts, id)
134
+ hash = Hash.new { |hsh, key| hsh[key] = [] }
135
+ posts.each { |post| hash[post.date.strftime(id)] << post }
136
+ hash.each_value { |posts_in_hsh| posts_in_hsh.sort!.reverse! }
128
137
  hash
129
138
  end
130
139
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-archives
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alfred Xing
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-18 00:00:00.000000000 Z
11
+ date: 2024-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -16,78 +16,31 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.4'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
19
+ version: '3.6'
20
+ - - "<"
25
21
  - !ruby/object:Gem::Version
26
- version: '2.4'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rdoc
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: shoulda
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
22
+ version: '5.0'
23
+ type: :runtime
63
24
  prerelease: false
64
25
  version_requirements: !ruby/object:Gem::Requirement
65
26
  requirements:
66
27
  - - ">="
67
28
  - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
29
+ version: '3.6'
30
+ - - "<"
81
31
  - !ruby/object:Gem::Version
82
- version: '0'
32
+ version: '5.0'
83
33
  description: Automatically generate post archives by dates, tags, and categories.
84
34
  email:
85
35
  executables: []
86
36
  extensions: []
87
37
  extra_rdoc_files: []
88
38
  files:
39
+ - LICENSE
89
40
  - lib/jekyll-archives.rb
90
41
  - lib/jekyll-archives/archive.rb
42
+ - lib/jekyll-archives/page_drop.rb
43
+ - lib/jekyll-archives/version.rb
91
44
  homepage: https://github.com/jekyll/jekyll-archives
92
45
  licenses:
93
46
  - MIT
@@ -100,15 +53,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
100
53
  requirements:
101
54
  - - ">="
102
55
  - !ruby/object:Gem::Version
103
- version: '0'
56
+ version: 2.7.0
104
57
  required_rubygems_version: !ruby/object:Gem::Requirement
105
58
  requirements:
106
59
  - - ">="
107
60
  - !ruby/object:Gem::Version
108
61
  version: '0'
109
62
  requirements: []
110
- rubyforge_project:
111
- rubygems_version: 2.5.1
63
+ rubygems_version: 3.1.6
112
64
  signing_key:
113
65
  specification_version: 4
114
66
  summary: Post archives for Jekyll.