jekyll-archives 0.1.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 +7 -0
- data/lib/jekyll-archives.rb +83 -0
- data/lib/jekyll-archives/archive.rb +111 -0
- metadata +59 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5e5597290843350c0f349a0625e966c5b253d914
|
4
|
+
data.tar.gz: 3b2f8221b82d532d32f2dc038554176d65a380a5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 17b68ddb19f27ce71fa0bc4fd41cd5da92cbc51f11e74bfdb77b30b63629cd307f0312c4f6740aea94da38d1893e4a7122d4e4966dc1ce99235922baedb62b0f
|
7
|
+
data.tar.gz: e9c28eb8ac183bee610d471e1b304ba6d2aec20c90654b1df7be20b3fff9948cda26941b87f70ca6f4e2eace331b189ab49306a2aaf620b317dcf87588b2cc1a
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Jekyll
|
2
|
+
# Internal requires
|
3
|
+
autoload :Archive, 'jekyll-archives/archive'
|
4
|
+
|
5
|
+
class JekyllArchives < Jekyll::Generator
|
6
|
+
safe true
|
7
|
+
|
8
|
+
DEFAULTS = {
|
9
|
+
'layout' => 'archive',
|
10
|
+
'permalinks' => {
|
11
|
+
'year' => '/archive/:name/',
|
12
|
+
'tag' => '/tag/:name/',
|
13
|
+
'category' => '/category/:name/'
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
def initialize(config = nil)
|
18
|
+
@config = Utils.deep_merge_hashes(DEFAULTS, config['jekyll-archives'])
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate(site)
|
22
|
+
@site = site
|
23
|
+
@posts = site.posts
|
24
|
+
@archives = []
|
25
|
+
|
26
|
+
@site.config['jekyll-archives'] = @config
|
27
|
+
|
28
|
+
read_archives
|
29
|
+
@site.pages += @archives
|
30
|
+
end
|
31
|
+
|
32
|
+
# Read archive data from posts
|
33
|
+
def read_archives
|
34
|
+
tags.each do |tag|
|
35
|
+
@archives << Archive.new(@site, tag[1], "tag", tag[0])
|
36
|
+
end
|
37
|
+
categories.each do |category|
|
38
|
+
@archives << Archive.new(@site, category[1], "category", category[0])
|
39
|
+
end
|
40
|
+
years.each do |year|
|
41
|
+
@archives << Archive.new(@site, year[1], "year", year[0])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Construct a Hash of Posts indexed by the specified Post attribute.
|
46
|
+
#
|
47
|
+
# post_attr - The String name of the Post attribute.
|
48
|
+
#
|
49
|
+
# Examples
|
50
|
+
#
|
51
|
+
# post_attr_hash('categories')
|
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
|
66
|
+
|
67
|
+
def tags
|
68
|
+
post_attr_hash('tags')
|
69
|
+
end
|
70
|
+
|
71
|
+
def categories
|
72
|
+
post_attr_hash('categories')
|
73
|
+
end
|
74
|
+
|
75
|
+
# Custom `post_attr_hash` method for years
|
76
|
+
def years
|
77
|
+
hash = Hash.new { |h, key| h[key] = [] }
|
78
|
+
@posts.each { |p| hash[p.date.year.to_s] << p }
|
79
|
+
hash.values.each { |posts| posts.sort!.reverse! }
|
80
|
+
hash
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module Jekyll
|
2
|
+
class Archive
|
3
|
+
include Convertible
|
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
|
38
|
+
|
39
|
+
# The template of the permalink.
|
40
|
+
#
|
41
|
+
# Returns the template String.
|
42
|
+
def template
|
43
|
+
site.config['jekyll-archives']['permalinks'][type]
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns a hash of URL placeholder names (as symbols) mapping to the
|
47
|
+
# desired placeholder replacements. For details see "url.rb".
|
48
|
+
def url_placeholders
|
49
|
+
{ :name => @name, :type => @type.to_s }
|
50
|
+
end
|
51
|
+
|
52
|
+
# The generated relative url of this page. e.g. /about.html.
|
53
|
+
#
|
54
|
+
# Returns the String url.
|
55
|
+
def url
|
56
|
+
@url ||= URL.new({
|
57
|
+
:template => template,
|
58
|
+
:placeholders => url_placeholders,
|
59
|
+
:permalink => nil
|
60
|
+
}).to_s
|
61
|
+
rescue ArgumentError
|
62
|
+
raise ArgumentError.new "Template \"#{template}\" provided is invalid."
|
63
|
+
end
|
64
|
+
|
65
|
+
# Add any necessary layouts to this post
|
66
|
+
#
|
67
|
+
# layouts - The Hash of {"name" => "layout"}.
|
68
|
+
# site_payload - The site payload Hash.
|
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
|
78
|
+
|
79
|
+
# Convert this Convertible's data to a Hash suitable for use by Liquid.
|
80
|
+
#
|
81
|
+
# Returns the Hash representation of this Convertible.
|
82
|
+
def to_liquid(attrs = nil)
|
83
|
+
further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map { |attribute|
|
84
|
+
[attribute, send(attribute)]
|
85
|
+
}]
|
86
|
+
|
87
|
+
Utils.deep_merge_hashes(data, further_data)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Obtain destination path.
|
91
|
+
#
|
92
|
+
# dest - The String path to the destination dir.
|
93
|
+
#
|
94
|
+
# Returns the destination file path String.
|
95
|
+
def destination(dest)
|
96
|
+
path = Jekyll.sanitized_path(dest, URL.unescape_path(url))
|
97
|
+
path = File.join(path, "index.html") if url =~ /\/$/
|
98
|
+
path
|
99
|
+
end
|
100
|
+
|
101
|
+
# Returns the object as a debug String.
|
102
|
+
def inspect
|
103
|
+
"#<Jekyll:Archive @type=#{@type.to_s} @name=#{@name}>"
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the Boolean of whether this Page is HTML or not.
|
107
|
+
def html?
|
108
|
+
true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-archives
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alfred Xing
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: jekyll
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description: Automatically generate post archives by dates, tags, and categories.
|
28
|
+
email: support@github.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/jekyll-archives.rb
|
34
|
+
- lib/jekyll-archives/archive.rb
|
35
|
+
homepage: https://github.com/alfredxing/jekyll-archives
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.2.2
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Post archives for Jekyll.
|
59
|
+
test_files: []
|