blob: 28afd13e91a2888055a328eed78ac1a01e18c0d8 (
plain)
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
|
class Meta < Jekyll::Generator
def generate(site)
# convert yaml @0123456789 (unix timestamps) into ruby Date
site.data = parse_unix_dates(site.data)
posts = site.collections['items']
for page in posts do
# convert generated page metadata and add directly to `page.meta` in liquid
page.data['meta'] = transform_data(site, page.slug)
# set page.authors to author metadata from git+yaml
page.data['authors'] = site.data['authors'].filter do |author|
author['git'].intersect?(page.data['meta']['authors'])
end
# set page.date to generated date_initial
page.data['date'] = page.data['meta']['date']
end
# count tags on all posts
site.data['tags'] = count_tags(posts)
end
def parse_unix_dates(data)
# recurse deeper
return data.transform_values { |val| parse_unix_dates(val) } if data.is_a? Hash
return data.map { |val| parse_unix_dates(val) } if data.is_a? Array
# convert strings matching regex
return Time.at(Integer(data[1..])) if data.is_a? String and data =~ /^@\d+$/
# base case
return data
end
def transform_data(site, slug)
data = site.data['post'][slug]
data['git_log'] = data['git_log'].sort { |c| c['date'].to_i }
git_log = data['git_log'].filter do |commit|
!site.data['git']['ignore_commits'].include?(commit['hash'])
end
data['authors'] = git_log.map{ |c| c['author'] }.uniq
data['date_initial'] = git_log.first['date']
data['date'] = git_log.last['date']
data['edits'] = git_log.length - 1 # original commit is not an edit
return data
end
def count_tags(posts)
tags = {}
# tally tags
for post in posts do
for tag in post.tags do
tags[tag] = tags.fetch(tag, 0) + 1
end
end
# sort by post count descending
tags = tags.sort_by {|key,value| -value}
return tags
end
end
|