-
Notifications
You must be signed in to change notification settings - Fork 99
/
archive.rb
141 lines (122 loc) · 3.79 KB
/
archive.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# frozen_string_literal: true
module Jekyll
module Archives
class Archive < Jekyll::Page
attr_accessor :posts, :type, :slug
# Attributes for Liquid templates
ATTRIBUTES_FOR_LIQUID = %w(
posts
type
title
date
name
path
url
permalink
).freeze
# Initialize a new Archive page
#
# site - The Site object.
# title - The name of the tag/category or a Hash of the year/month/day in case of date.
# e.g. { :year => 2014, :month => 08 } or "my-category" or "my-tag".
# type - The type of archive. Can be one of "year", "month", "day", "category", or "tag"
# posts - The array of posts that belong in this archive.
def initialize(site, title, type, posts)
@site = site
@posts = posts
@type = type
@title = title
@config = site.config["jekyll-archives"]
@slug = slugify_string_title
# Use ".html" for file extension and url for path
@ext = File.extname(relative_path)
@path = relative_path
@name = File.basename(relative_path, @ext)
@data = {
"layout" => layout,
}
@content = ""
end
# The template of the permalink.
#
# Returns the template String.
def template
@config.dig("permalinks", type)
end
# The layout to use for rendering
#
# Returns the layout as a String
def layout
@config.dig("layouts", type) || @config["layout"]
end
# Returns a hash of URL placeholder names (as symbols) mapping to the
# desired placeholder replacements. For details see "url.rb".
def url_placeholders
if @title.is_a? Hash
@title.merge(:type => @type)
else
{ :name => @slug, :type => @type }
end
end
# The generated relative url of this page. e.g. /about.html.
#
# Returns the String url.
def url
@url ||= URL.new(
:template => template,
:placeholders => url_placeholders,
:permalink => nil
).to_s
rescue ArgumentError
raise ArgumentError, "Template \"#{template}\" provided is invalid."
end
def permalink
data&.is_a?(Hash) && data["permalink"]
end
# Produce a title object suitable for Liquid based on type of archive.
#
# Returns a String (for tag and category archives) and nil for
# date-based archives.
def title
@title if @title.is_a? String
end
# Produce a date object if a date-based archive
#
# Returns a Date.
def date
return unless @title.is_a?(Hash)
@date ||= begin
args = @title.values.map(&:to_i)
Date.new(*args)
end
end
# Obtain the write path relative to the destination directory
#
# Returns the destination relative path String.
def relative_path
@relative_path ||= begin
path = URL.unescape_path(url).gsub(%r!^/!, "")
path = File.join(path, "index.html") if url.end_with?("/")
path
end
end
# Returns the object as a debug String.
def inspect
"#<Jekyll:Archive @type=#{@type} @title=#{@title} @data=#{@data.inspect}>"
end
# The Liquid representation of this page.
def to_liquid
@to_liquid ||= Jekyll::Archives::PageDrop.new(self)
end
private
# Generate slug if @title attribute is a string.
#
# Note: mode other than those expected by Jekyll returns the given string after
# downcasing it.
def slugify_string_title
return unless title.is_a?(String)
Utils.slugify(title, :mode => @config["slug_mode"])
end
end
end
end