sutty-archives 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: de531ca1b1088e2b311d795bb399e76d4d472c13b146b4c87d711d0ff7f30612
4
+ data.tar.gz: 465b830b25c64e795503d591012e37268059265a1fb16b0d6d1d289fdf40dfae
5
+ SHA512:
6
+ metadata.gz: 4cd9ad72c38bf0a4fccad60781a6d2d161e42754d7e98262d15ca037e8c125ac3cfd3f312b2f58f52a0cb3b3e2a2a1f1cdfccf881180d9dd689238b154ec25ef
7
+ data.tar.gz: 82dc16f23c07788f6c69e592e3045a3d49f03987a556694825b005a9c0e7b66d3e9a203eeb73baf2d70287ec69dc44097a82b600f004d993a282ebb6cb926a5b
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+
5
+ module Jekyll
6
+ module Archives
7
+ # Internal requires
8
+ autoload :Archive, "jekyll-archives/archive"
9
+ autoload :VERSION, "jekyll-archives/version"
10
+
11
+ class Archives < Jekyll::Generator
12
+ safe true
13
+
14
+ DATE_ATTRS = %w[year month day].freeze
15
+ # Map between the front matter attribute and names used by
16
+ # jekyll-archive
17
+ LEGACY_ATTRS = { 'tags' => 'tag', 'categories' => 'category' }.freeze
18
+
19
+ DEFAULTS = {
20
+ "layout" => "archive",
21
+ "enabled" => [],
22
+ "permalinks" => {
23
+ "year" => "/:year/",
24
+ "month" => "/:year/:month/",
25
+ "day" => "/:year/:month/:day/",
26
+ "tag" => "/tag/:name/",
27
+ "category" => "/category/:name/",
28
+ "category-tag" => "/category/:category/tag/:tag/"
29
+ },
30
+ }.freeze
31
+
32
+ def initialize(config = {})
33
+ archives_config = config.fetch("jekyll-archives", {})
34
+ if archives_config.is_a?(Hash)
35
+ @config = Utils.deep_merge_hashes(DEFAULTS, archives_config)
36
+ else
37
+ @config = nil
38
+ Jekyll.logger.warn "Archives:", "Expected a hash but got #{archives_config.inspect}"
39
+ Jekyll.logger.warn "", "Archives will not be generated for this site."
40
+ end
41
+ @enabled = @config && @config["enabled"]
42
+ @post_attr_hash = {}
43
+ end
44
+
45
+ def generate(site)
46
+ return if @config.nil?
47
+
48
+ @site = site
49
+ @posts = site.posts
50
+ @archives = []
51
+
52
+ @site.config["jekyll-archives"] = @config
53
+
54
+ read
55
+ @site.pages.concat(@archives)
56
+
57
+ @site.config["archives"] = @archives
58
+ end
59
+
60
+ # Read archive data from posts
61
+ def read
62
+ read_attrs
63
+ read_categories_tags
64
+ read_dates
65
+ end
66
+
67
+ # Read and group by attributes, using the legacy names when
68
+ # needed.
69
+ def read_attrs
70
+ attrs.each do |attr|
71
+ post_attr_hash(attr).each do |title, posts|
72
+ attr = LEGACY_ATTRS[attr] if LEGACY_ATTRS[attr]
73
+
74
+ @archives << Archive.new(@site, title, attr, posts)
75
+ end
76
+ end
77
+ end
78
+
79
+ def read_categories_tags
80
+ if enabled? "categories-tags"
81
+ categories.each do |category, posts|
82
+ posts.map { |post| post.data['tags'] }.flatten.uniq.compact.each do |tag|
83
+ category_tag_posts = posts.select do |post|
84
+ post.data['categories'].include?(category) &&
85
+ post.data['tags'].include?(tag)
86
+ end
87
+
88
+ @archives << Archive.new(@site, { category: category, tag: tag }, "category-tag", category_tag_posts)
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ def read_dates
95
+ years.each do |year, y_posts|
96
+ append_enabled_date_type({ :year => year }, "year", y_posts)
97
+ months(y_posts).each do |month, m_posts|
98
+ append_enabled_date_type({ :year => year, :month => month }, "month", m_posts)
99
+ days(m_posts).each do |day, d_posts|
100
+ append_enabled_date_type({ :year => year, :month => month, :day => day }, "day", d_posts)
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ # Return the front matter attributes to archive by, using the
107
+ # legacy names unless specified and leaving out the date
108
+ # attributes.
109
+ def attrs
110
+ return LEGACY_ATTRS.keys unless @enabled.is_a? Array
111
+
112
+ @attrs ||= @enabled - DATE_ATTRS
113
+ end
114
+
115
+ # Checks if archive type is enabled in config
116
+ def enabled?(archive)
117
+ @enabled == true || @enabled == "all" || (@enabled.is_a?(Array) && @enabled.include?(archive))
118
+ end
119
+
120
+ # Custom `post_attr_hash` method for years
121
+ def years
122
+ date_attr_hash(@posts.docs, "%Y")
123
+ end
124
+
125
+ # Custom `post_attr_hash` method for months
126
+ def months(year_posts)
127
+ date_attr_hash(year_posts, "%m")
128
+ end
129
+
130
+ # Custom `post_attr_hash` method for days
131
+ def days(month_posts)
132
+ date_attr_hash(month_posts, "%d")
133
+ end
134
+
135
+ private
136
+
137
+ # Initialize a new Archive page and append to base array if the associated date `type`
138
+ # has been enabled by configuration.
139
+ #
140
+ # meta - A Hash of the year / month / day as applicable for date.
141
+ # type - The type of date archive.
142
+ # posts - The array of posts that belong in the date archive.
143
+ def append_enabled_date_type(meta, type, posts)
144
+ @archives << Archive.new(@site, meta, type, posts) if enabled?(type)
145
+ end
146
+
147
+ # Custom `post_attr_hash` for date type archives.
148
+ #
149
+ # posts - Array of posts to be considered for archiving.
150
+ # id - String used to format post date via `Time.strptime` e.g. %Y, %m, etc.
151
+ def date_attr_hash(posts, id)
152
+ hash = Hash.new { |hsh, key| hsh[key] = [] }
153
+ posts.each { |post| hash[post.date.strftime(id)] << post }
154
+ hash.each_value { |posts| posts.sort!.reverse! }
155
+ hash
156
+ end
157
+
158
+ # Custom `post_attr_hash` to group by any attribute
159
+ def post_attr_hash(post_attr)
160
+ @post_attr_hash[post_attr] ||= begin
161
+ hash = Hash.new { |h, key| h[key] = [] }
162
+ @site.posts.docs.each do |p|
163
+ d = p.data[post_attr]
164
+
165
+ next if d.nil?
166
+
167
+ if d.respond_to? :each
168
+ d.each { |t| hash[t] << p }
169
+ else
170
+ hash[d.to_s] << p
171
+ end
172
+ end
173
+ hash.each_value { |posts| posts.sort!.reverse! }
174
+ hash
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Archives
5
+ class Archive < Jekyll::Page
6
+ attr_accessor :posts, :type, :slug
7
+
8
+ # Attributes for Liquid templates
9
+ ATTRIBUTES_FOR_LIQUID = %w(
10
+ posts
11
+ type
12
+ title
13
+ date
14
+ name
15
+ path
16
+ url
17
+ permalink
18
+ slug
19
+ category
20
+ tag
21
+ ).freeze
22
+
23
+ # Initialize a new Archive page
24
+ #
25
+ # site - The Site object.
26
+ # title - The name of the tag/category or a Hash of the year/month/day in case of date.
27
+ # e.g. { :year => 2014, :month => 08 } or "my-category" or "my-tag".
28
+ # type - The type of archive. Can be one of "year", "month", "day", "category", or "tag"
29
+ # posts - The array of posts that belong in this archive.
30
+ def initialize(site, title, type, posts)
31
+ @site = site
32
+ @posts = posts
33
+ @type = type
34
+ @title = title
35
+ @config = site.config["jekyll-archives"]
36
+ @slug = slugify_string_title
37
+
38
+ # Use ".html" for file extension and url for path
39
+ @ext = File.extname(relative_path)
40
+ @path = relative_path
41
+ @name = File.basename(relative_path, @ext)
42
+
43
+ @data = {
44
+ "layout" => layout,
45
+ }
46
+ @content = ""
47
+ end
48
+
49
+ # The template of the permalink.
50
+ #
51
+ # Returns the template String.
52
+ def template
53
+ @config.dig("permalinks", type) || "/#{type}/:name/"
54
+ end
55
+
56
+ # The layout to use for rendering
57
+ #
58
+ # Returns the layout as a String
59
+ def layout
60
+ @config.dig("layouts", type) || @config["layout"]
61
+ end
62
+
63
+ # Returns a hash of URL placeholder names (as symbols) mapping to the
64
+ # desired placeholder replacements. For details see "url.rb".
65
+ def url_placeholders
66
+ if @title.is_a? Hash
67
+ placeholders = @title.merge(:type => @type)
68
+
69
+ if @type == 'category-tag'
70
+ %i[category tag].each do |k|
71
+ placeholders[k] = Utils.slugify(@title[k], mode: @config.dig('slug'))
72
+ end
73
+ end
74
+
75
+ placeholders
76
+ else
77
+ { :name => @slug, :type => @type }
78
+ end
79
+ end
80
+
81
+ # The generated relative url of this page. e.g. /about.html.
82
+ #
83
+ # Returns the String url.
84
+ def url
85
+ @url ||= URL.new(
86
+ :template => template,
87
+ :placeholders => url_placeholders,
88
+ :permalink => nil
89
+ ).to_s
90
+ rescue ArgumentError
91
+ raise ArgumentError, "Template \"#{template}\" provided is invalid."
92
+ end
93
+
94
+ def permalink
95
+ data&.is_a?(Hash) && data["permalink"]
96
+ end
97
+
98
+ # Produce a title object suitable for Liquid based on type of archive.
99
+ #
100
+ # Returns a String (for tag and category archives) and nil for
101
+ # date-based archives.
102
+ def title
103
+ if @title.is_a? String
104
+ @title
105
+ elsif @type == 'category-tag'
106
+ @title.values.join(@config.fetch('separator', ' / '))
107
+ end
108
+ end
109
+
110
+ # Produce a date object if a date-based archive
111
+ #
112
+ # Returns a Date.
113
+ def date
114
+ return unless @title.is_a?(Hash)
115
+
116
+ @date ||= begin
117
+ args = @title.values.map(&:to_i)
118
+ Date.new(*args)
119
+ end
120
+ end
121
+
122
+ def category
123
+ @title[:category] if @title.is_a? Hash
124
+ end
125
+
126
+ def tag
127
+ @title[:tag] if @title.is_a? Hash
128
+ end
129
+
130
+ # Obtain the write path relative to the destination directory
131
+ #
132
+ # Returns the destination relative path String.
133
+ def relative_path
134
+ @relative_path ||= begin
135
+ path = URL.unescape_path(url).gsub(%r!^/!, "")
136
+ path = File.join(path, "index.html") if url.end_with?("/")
137
+ path
138
+ end
139
+ end
140
+
141
+ # Returns the object as a debug String.
142
+ def inspect
143
+ "#<Jekyll:Archive @type=#{@type} @title=#{@title} @data=#{@data.inspect}>"
144
+ end
145
+
146
+ private
147
+
148
+ # Generate slug if @title attribute is a string.
149
+ #
150
+ # Note: mode other than those expected by Jekyll returns the given string after
151
+ # downcasing it.
152
+ def slugify_string_title
153
+ return unless title.is_a?(String)
154
+
155
+ mode = @config["slug_mode"] || @config["slug"]
156
+
157
+ Utils.slugify(title, :mode => mode)
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Archives
5
+ VERSION = "2.2.1"
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'jekyll-archives'
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sutty-archives
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Alfred Xing
8
+ - f
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2020-06-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: jekyll
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '3.6'
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '5.0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: '3.6'
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ - !ruby/object:Gem::Dependency
35
+ name: bundler
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :development
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: minitest
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: rdoc
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: rubocop-jekyll
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.9'
104
+ - !ruby/object:Gem::Dependency
105
+ name: shoulda
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ description: Automatically generate post archives by dates, and any front matter attribute.
119
+ email:
120
+ executables: []
121
+ extensions: []
122
+ extra_rdoc_files: []
123
+ files:
124
+ - lib/jekyll-archives.rb
125
+ - lib/jekyll-archives/archive.rb
126
+ - lib/jekyll-archives/version.rb
127
+ - lib/sutty-archives.rb
128
+ homepage: https://0xacab.org/sutty/jekyll/sutty-archives
129
+ licenses:
130
+ - MIT
131
+ metadata: {}
132
+ post_install_message:
133
+ rdoc_options: []
134
+ require_paths:
135
+ - lib
136
+ required_ruby_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: 2.3.0
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ requirements: []
147
+ rubygems_version: 3.0.3
148
+ signing_key:
149
+ specification_version: 4
150
+ summary: Post archives for Jekyll. Fork of jekyll-archives.
151
+ test_files: []