jekyll-archives 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|