jekyll-archives 0.1.0 → 1.0.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 +4 -4
- data/lib/jekyll-archives.rb +145 -66
- data/lib/jekyll-archives/archive.rb +148 -98
- metadata +61 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b678cbc857435a0606f6903249ffafa2d0bc4c6
|
4
|
+
data.tar.gz: c31fe905416a36b9809252359eae9c6374552f6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9e5dff177b866ea05d3195a35b46410882167453683e3275de7b368bec26e6bfec8e11528b088448c02a5e18d0587baadfeac95bf817546154afe0bd924b6ad
|
7
|
+
data.tar.gz: 9fc71856cd97ceb5186d05f661bd8bfe9ff4802499aec4ae6b7665cfd9ddbf766b6bf594c48d9a07d2747c3c8f3fd72f65cb38b758fc1e654367bcdcdb82b5f8
|
data/lib/jekyll-archives.rb
CHANGED
@@ -1,83 +1,162 @@
|
|
1
|
+
require 'jekyll'
|
2
|
+
|
1
3
|
module Jekyll
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
'
|
12
|
-
'
|
13
|
-
'
|
4
|
+
module Archives
|
5
|
+
# Internal requires
|
6
|
+
autoload :Archive, 'jekyll-archives/archive'
|
7
|
+
autoload :VERSION, 'jekyll-archives/version'
|
8
|
+
|
9
|
+
class Archives < Jekyll::Generator
|
10
|
+
safe true
|
11
|
+
|
12
|
+
DEFAULTS = {
|
13
|
+
'layout' => 'archive',
|
14
|
+
'enabled' => [],
|
15
|
+
'permalinks' => {
|
16
|
+
'year' => '/:year/',
|
17
|
+
'month' => '/:year/:month/',
|
18
|
+
'day' => '/:year/:month/:day/',
|
19
|
+
'tag' => '/tag/:name/',
|
20
|
+
'category' => '/category/:name/'
|
21
|
+
}
|
14
22
|
}
|
15
|
-
}
|
16
23
|
|
17
|
-
|
18
|
-
|
19
|
-
|
24
|
+
def initialize(config = nil)
|
25
|
+
if config['jekyll-archives'].nil?
|
26
|
+
@config = DEFAULTS
|
27
|
+
else
|
28
|
+
@config = Utils.deep_merge_hashes(DEFAULTS, config['jekyll-archives'])
|
29
|
+
end
|
30
|
+
end
|
20
31
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
32
|
+
def generate(site)
|
33
|
+
@site = site
|
34
|
+
@posts = site.posts
|
35
|
+
@archives = []
|
25
36
|
|
26
|
-
|
37
|
+
@site.config['jekyll-archives'] = @config
|
27
38
|
|
28
|
-
|
29
|
-
|
30
|
-
|
39
|
+
read
|
40
|
+
render
|
41
|
+
write
|
31
42
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
43
|
+
@site.keep_files ||= []
|
44
|
+
@archives.each do |archive|
|
45
|
+
@site.keep_files << archive.relative_path
|
46
|
+
end
|
47
|
+
@site.config["archives"] = @archives
|
36
48
|
end
|
37
|
-
|
38
|
-
|
49
|
+
|
50
|
+
# Read archive data from posts
|
51
|
+
def read
|
52
|
+
read_tags
|
53
|
+
read_categories
|
54
|
+
read_dates
|
39
55
|
end
|
40
|
-
|
41
|
-
|
56
|
+
|
57
|
+
def read_tags
|
58
|
+
if enabled? "tags"
|
59
|
+
tags.each do |title, posts|
|
60
|
+
@archives << Archive.new(@site, title, "tag", posts)
|
61
|
+
end
|
62
|
+
end
|
42
63
|
end
|
43
|
-
end
|
44
64
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
# # => { 'tech' => [<Post A>, <Post B>],
|
53
|
-
# # 'ruby' => [<Post B>] }
|
54
|
-
#
|
55
|
-
# Returns the Hash: { attr => posts } where
|
56
|
-
# attr - One of the values for the requested attribute.
|
57
|
-
# posts - The Array of Posts with the given attr value.
|
58
|
-
def post_attr_hash(post_attr)
|
59
|
-
# Build a hash map based on the specified post attribute ( post attr =>
|
60
|
-
# array of posts ) then sort each array in reverse order.
|
61
|
-
hash = Hash.new { |h, key| h[key] = [] }
|
62
|
-
@posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } }
|
63
|
-
hash.values.each { |posts| posts.sort!.reverse! }
|
64
|
-
hash
|
65
|
-
end
|
65
|
+
def read_categories
|
66
|
+
if enabled? "categories"
|
67
|
+
categories.each do |title, posts|
|
68
|
+
@archives << Archive.new(@site, title, "category", posts)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
66
72
|
|
67
|
-
|
68
|
-
|
69
|
-
|
73
|
+
def read_dates
|
74
|
+
years.each do |year, posts|
|
75
|
+
@archives << Archive.new(@site, { :year => year }, "year", posts) if enabled? "year"
|
76
|
+
months(posts).each do |month, posts|
|
77
|
+
@archives << Archive.new(@site, { :year => year, :month => month }, "month", posts) if enabled? "month"
|
78
|
+
days(posts).each do |day, posts|
|
79
|
+
@archives << Archive.new(@site, { :year => year, :month => month, :day => day }, "day", posts) if enabled? "day"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
70
84
|
|
71
|
-
|
72
|
-
|
73
|
-
|
85
|
+
# Checks if archive type is enabled in config
|
86
|
+
def enabled?(archive)
|
87
|
+
@config["enabled"] == true || @config["enabled"] == "all" || if @config["enabled"].is_a? Array
|
88
|
+
@config["enabled"].include? archive
|
89
|
+
end
|
90
|
+
end
|
74
91
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
92
|
+
# Renders the archives into the layouts
|
93
|
+
def render
|
94
|
+
payload = @site.site_payload
|
95
|
+
@archives.each do |archive|
|
96
|
+
archive.render(@site.layouts, payload)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Write archives to their destination
|
101
|
+
def write
|
102
|
+
@archives.each do |archive|
|
103
|
+
archive.write(@site.dest)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# Construct a Hash of Posts indexed by the specified Post attribute.
|
108
|
+
#
|
109
|
+
# post_attr - The String name of the Post attribute.
|
110
|
+
#
|
111
|
+
# Examples
|
112
|
+
#
|
113
|
+
# post_attr_hash('categories')
|
114
|
+
# # => { 'tech' => [<Post A>, <Post B>],
|
115
|
+
# # 'ruby' => [<Post B>] }
|
116
|
+
#
|
117
|
+
# Returns the Hash: { attr => posts } where
|
118
|
+
# attr - One of the values for the requested attribute.
|
119
|
+
# posts - The Array of Posts with the given attr value.
|
120
|
+
#
|
121
|
+
# Taken from jekyll/jekyll (Copyright (c) 2014 Tom Preston-Werner under the MIT).
|
122
|
+
def post_attr_hash(post_attr)
|
123
|
+
# Build a hash map based on the specified post attribute ( post attr =>
|
124
|
+
# array of posts ) then sort each array in reverse order.
|
125
|
+
hash = Hash.new { |h, key| h[key] = [] }
|
126
|
+
@posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } }
|
127
|
+
hash.values.each { |posts| posts.sort!.reverse! }
|
128
|
+
hash
|
129
|
+
end
|
130
|
+
|
131
|
+
def tags
|
132
|
+
post_attr_hash('tags')
|
133
|
+
end
|
134
|
+
|
135
|
+
def categories
|
136
|
+
post_attr_hash('categories')
|
137
|
+
end
|
138
|
+
|
139
|
+
# Custom `post_attr_hash` method for years
|
140
|
+
def years
|
141
|
+
hash = Hash.new { |h, key| h[key] = [] }
|
142
|
+
@posts.each { |p| hash[p.date.strftime("%Y")] << p }
|
143
|
+
hash.values.each { |posts| posts.sort!.reverse! }
|
144
|
+
hash
|
145
|
+
end
|
146
|
+
|
147
|
+
def months(year_posts)
|
148
|
+
hash = Hash.new { |h, key| h[key] = [] }
|
149
|
+
year_posts.each { |p| hash[p.date.strftime("%m")] << p }
|
150
|
+
hash.values.each { |posts| posts.sort!.reverse! }
|
151
|
+
hash
|
152
|
+
end
|
153
|
+
|
154
|
+
def days(month_posts)
|
155
|
+
hash = Hash.new { |h, key| h[key] = [] }
|
156
|
+
month_posts.each { |p| hash[p.date.strftime("%d")] << p }
|
157
|
+
hash.values.each { |posts| posts.sort!.reverse! }
|
158
|
+
hash
|
159
|
+
end
|
81
160
|
end
|
82
161
|
end
|
83
162
|
end
|
@@ -1,111 +1,161 @@
|
|
1
1
|
module Jekyll
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
attr_accessor :posts, :type, :name
|
6
|
-
attr_accessor :data, :content, :output
|
7
|
-
attr_accessor :path, :ext
|
8
|
-
attr_accessor :site
|
9
|
-
|
10
|
-
# Attributes for Liquid templates
|
11
|
-
ATTRIBUTES_FOR_LIQUID = %w[
|
12
|
-
posts
|
13
|
-
type
|
14
|
-
name
|
15
|
-
]
|
16
|
-
|
17
|
-
# Initialize a new Archive page
|
18
|
-
#
|
19
|
-
# site - The Site object.
|
20
|
-
# posts - The array of posts that belong in this archive.
|
21
|
-
# type - The type of archive. Can be one of "year", "category", or "tag"
|
22
|
-
# name - The name of the archive (e.g. "2014" or "my-category" or "my-tag").
|
23
|
-
def initialize(site, posts, type, name)
|
24
|
-
@site = site
|
25
|
-
@posts = posts
|
26
|
-
@type = type
|
27
|
-
@name = name
|
28
|
-
|
29
|
-
# Use ".html" for file extension and url for path
|
30
|
-
@ext = ".html"
|
31
|
-
@path = url
|
32
|
-
|
33
|
-
@data = {
|
34
|
-
"layout" => site.config['jekyll-archives']['layout']
|
35
|
-
}
|
36
|
-
@content = ""
|
37
|
-
end
|
2
|
+
module Archives
|
3
|
+
class Archive
|
4
|
+
include Convertible
|
38
5
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
site.config['jekyll-archives']['permalinks'][type]
|
44
|
-
end
|
6
|
+
attr_accessor :posts, :type, :name, :slug
|
7
|
+
attr_accessor :data, :content, :output
|
8
|
+
attr_accessor :path, :ext
|
9
|
+
attr_accessor :site
|
45
10
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
11
|
+
# Attributes for Liquid templates
|
12
|
+
ATTRIBUTES_FOR_LIQUID = %w[
|
13
|
+
posts
|
14
|
+
type
|
15
|
+
title
|
16
|
+
name
|
17
|
+
path
|
18
|
+
url
|
19
|
+
]
|
51
20
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
21
|
+
# Initialize a new Archive page
|
22
|
+
#
|
23
|
+
# site - The Site object.
|
24
|
+
# title - The name of the tag/category or a Hash of the year/month/day in case of date.
|
25
|
+
# e.g. { :year => 2014, :month => 08 } or "my-category" or "my-tag".
|
26
|
+
# type - The type of archive. Can be one of "year", "month", "day", "category", or "tag"
|
27
|
+
# posts - The array of posts that belong in this archive.
|
28
|
+
def initialize(site, title, type, posts)
|
29
|
+
@site = site
|
30
|
+
@posts = posts
|
31
|
+
@type = type
|
32
|
+
@title = title
|
33
|
+
@config = site.config['jekyll-archives']
|
64
34
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
#
|
70
|
-
# Returns nothing.
|
71
|
-
def render(layouts, site_payload)
|
72
|
-
payload = Utils.deep_merge_hashes({
|
73
|
-
"page" => to_liquid
|
74
|
-
}, site_payload)
|
75
|
-
|
76
|
-
do_layout(payload, layouts)
|
77
|
-
end
|
35
|
+
# Generate slug if tag or category (taken from jekyll/jekyll/features/support/env.rb)
|
36
|
+
if title.is_a? String
|
37
|
+
@slug = Utils.slugify(title)
|
38
|
+
end
|
78
39
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map { |attribute|
|
84
|
-
[attribute, send(attribute)]
|
85
|
-
}]
|
40
|
+
# Use ".html" for file extension and url for path
|
41
|
+
@ext = File.extname(relative_path)
|
42
|
+
@path = relative_path
|
43
|
+
@name = File.basename(relative_path, @ext)
|
86
44
|
|
87
|
-
|
88
|
-
|
45
|
+
@data = {
|
46
|
+
"layout" => layout
|
47
|
+
}
|
48
|
+
@content = ""
|
49
|
+
end
|
89
50
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
path = Jekyll.sanitized_path(dest, URL.unescape_path(url))
|
97
|
-
path = File.join(path, "index.html") if url =~ /\/$/
|
98
|
-
path
|
99
|
-
end
|
51
|
+
# The template of the permalink.
|
52
|
+
#
|
53
|
+
# Returns the template String.
|
54
|
+
def template
|
55
|
+
@config['permalinks'][type]
|
56
|
+
end
|
100
57
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
58
|
+
# The layout to use for rendering
|
59
|
+
#
|
60
|
+
# Returns the layout as a String
|
61
|
+
def layout
|
62
|
+
if @config['layouts'] && @config['layouts'][type]
|
63
|
+
@config['layouts'][type]
|
64
|
+
else
|
65
|
+
@config['layout']
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns a hash of URL placeholder names (as symbols) mapping to the
|
70
|
+
# desired placeholder replacements. For details see "url.rb".
|
71
|
+
def url_placeholders
|
72
|
+
if @title.is_a? Hash
|
73
|
+
@title.merge({ :type => @type })
|
74
|
+
else
|
75
|
+
{ :name => @slug, :type => @type }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# The generated relative url of this page. e.g. /about.html.
|
80
|
+
#
|
81
|
+
# Returns the String url.
|
82
|
+
def url
|
83
|
+
@url ||= URL.new({
|
84
|
+
:template => template,
|
85
|
+
:placeholders => url_placeholders,
|
86
|
+
:permalink => nil
|
87
|
+
}).to_s
|
88
|
+
rescue ArgumentError
|
89
|
+
raise ArgumentError.new "Template \"#{template}\" provided is invalid."
|
90
|
+
end
|
91
|
+
|
92
|
+
# Add any necessary layouts to this post
|
93
|
+
#
|
94
|
+
# layouts - The Hash of {"name" => "layout"}.
|
95
|
+
# site_payload - The site payload Hash.
|
96
|
+
#
|
97
|
+
# Returns nothing.
|
98
|
+
def render(layouts, site_payload)
|
99
|
+
payload = Utils.deep_merge_hashes({
|
100
|
+
"page" => to_liquid
|
101
|
+
}, site_payload)
|
102
|
+
|
103
|
+
do_layout(payload, layouts)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Convert this Convertible's data to a Hash suitable for use by Liquid.
|
107
|
+
#
|
108
|
+
# Returns the Hash representation of this Convertible.
|
109
|
+
def to_liquid(attrs = nil)
|
110
|
+
further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map { |attribute|
|
111
|
+
[attribute, send(attribute)]
|
112
|
+
}]
|
113
|
+
|
114
|
+
Utils.deep_merge_hashes(data, further_data)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Produce a title object suitable for Liquid based on type of archive.
|
118
|
+
#
|
119
|
+
# Returns the title as a Date (for date-based archives) or a
|
120
|
+
# String (for tag and category archives)
|
121
|
+
def title
|
122
|
+
if @title.is_a? Hash
|
123
|
+
args = @title.values.map { |s| s.to_i }
|
124
|
+
Date.new(*args)
|
125
|
+
else
|
126
|
+
@title
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Obtain destination path.
|
131
|
+
#
|
132
|
+
# dest - The String path to the destination dir.
|
133
|
+
#
|
134
|
+
# Returns the destination file path String.
|
135
|
+
def destination(dest)
|
136
|
+
path = Jekyll.sanitized_path(dest, URL.unescape_path(url))
|
137
|
+
path = File.join(path, "index.html") if url =~ /\/$/
|
138
|
+
path
|
139
|
+
end
|
140
|
+
|
141
|
+
# Obtain the write path relative to the destination directory
|
142
|
+
#
|
143
|
+
# Returns the destination relative path String.
|
144
|
+
def relative_path
|
145
|
+
path = URL.unescape_path(url).gsub(/^\//, '')
|
146
|
+
path = File.join(path, "index.html") if url =~ /\/$/
|
147
|
+
path
|
148
|
+
end
|
149
|
+
|
150
|
+
# Returns the object as a debug String.
|
151
|
+
def inspect
|
152
|
+
"#<Jekyll:Archive @type=#{@type.to_s} @title=#{@title} @data=#{@data.inspect}>"
|
153
|
+
end
|
105
154
|
|
106
|
-
|
107
|
-
|
108
|
-
|
155
|
+
# Returns the Boolean of whether this Page is HTML or not.
|
156
|
+
def html?
|
157
|
+
true
|
158
|
+
end
|
109
159
|
end
|
110
160
|
end
|
111
161
|
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:
|
4
|
+
version: 1.0.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: 2014-
|
11
|
+
date: 2014-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -24,15 +24,71 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
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
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !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
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
27
83
|
description: Automatically generate post archives by dates, tags, and categories.
|
28
|
-
email:
|
84
|
+
email:
|
29
85
|
executables: []
|
30
86
|
extensions: []
|
31
87
|
extra_rdoc_files: []
|
32
88
|
files:
|
33
89
|
- lib/jekyll-archives.rb
|
34
90
|
- lib/jekyll-archives/archive.rb
|
35
|
-
homepage: https://github.com/
|
91
|
+
homepage: https://github.com/jekyll/jekyll-archives
|
36
92
|
licenses:
|
37
93
|
- MIT
|
38
94
|
metadata: {}
|
@@ -52,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
108
|
version: '0'
|
53
109
|
requirements: []
|
54
110
|
rubyforge_project:
|
55
|
-
rubygems_version: 2.
|
111
|
+
rubygems_version: 2.4.1
|
56
112
|
signing_key:
|
57
113
|
specification_version: 4
|
58
114
|
summary: Post archives for Jekyll.
|