Paginated Archives in Nanoc 4.x
Created on 2020-09-01T05:02:12.799917
Uses the preprocess hook to find all site entries which are articles, sorts them by creation date, and creates archive pages which are paginated.
The archive pages are generated as though the user had written them in markdown by hand.
#!/usr/bin/env ruby
compile '/**/*.html' do
layout '/default.*'
if item.identifier =~ '**/index.*'
write item.identifier.to_s
else
write item.identifier.without_ext + '/index.html'
end
end
# This is an example rule that matches Markdown (.md) files, and filters them
# using the :kramdown filter. It is commented out by default, because kramdown
# is not bundled with Nanoc or Ruby.
#
compile '/**/*.md' do
filter :erb # or erubis, if you need moar speed
filter :kramdown
layout '/default.*'
if item.identifier =~ '**/index.*'
write item.identifier.to_s
else
write item.identifier.without_ext + '/index.html'
end
end
compile '/**/*' do
write item.identifier.to_s
end
layout '/**/*', :erb
preprocess do
# find all articles
poasts = @items.find_all do |e| e[:kind] == 'article' end
# sort oldest article first
oldpoasts = poasts.sort_by do|p| p[:'created-at'] end
# zip so we have an array of [post index, item]
# then group by index modulo entries per page
# we can then iterate over grouped indices to create the paginated archives
per_page = 1
pages = (0..oldpoasts.length-1).zip(oldpoasts).group_by do |e| e[0] % (per_page+1) end
pages.each do |index, page|
# since item.path is not known until routing is done, we have to
# engage in brain melting UwU. we output some eruby that injects
# the path of the item being listed, later, when the archive page
# is being compiled
text = page.collect do |index, item|
<)
MARKDOWN
# the newline is implied because MARKDOWN is on its own line
end
# now create navigation pointers, but use unshift so they are at the top
if index > 0 then
text.unshift "- [Previous](/metapoast/poast-#{index-1})\n"
end
if index < pages.length-1 then
text.unshift "- [Next](/metapoast/poast-#{index+1})\n"
end
@items.create(text.join("\n"), {}, "/metapoast/poast-#{index}.md")
end
end