jekyll/plugins/toc_generator.rb (57 lines of code) (raw):
require 'yaml'
require 'json'
require 'kramdown'
class TocPage < Jekyll::Page
# Initialize a new RedirectPage.
#
# site - The Site object.
# base - The String path to the source.
# dir - The String path between the source and the file.
# name - The String filename of the file.
def initialize(site, base, dir, name, content)
@site = site
@base = base
@dir = dir
@name = name
@content = @output = content
self.process(name)
self.data = {}
end
end
class TocGenerator < Jekyll::Generator
ITEM_TYPE_HEADER = 'header'
ITEM_TYPE_PLACEHOLDER = 'placeholder'
def generate(site)
toc_output = site.config['toc_output'] || 'HelpTOC.json'
# This comes from toc_builder_hook.rb
toc_content = site.data['toc']
toc_page = TocPage.new(site, site.source, '/', toc_output, toc_content.to_json)
site.pages << toc_page
populate_prev_next(site, toc_content)
end
def populate_prev_next(site, toc)
hash = Hash.new
site.pages.each { |p| hash[p.path] = p }
missing_titles = Set.new
do_populate_prev_next(hash, toc, missing_titles)
missing_titles.each do |x|
puts "Page is missing titles for next/prev navigation: #{x}"
end
raise "Site has missing #{missing_titles.count} missing titles" if not missing_titles.empty?
end
def do_populate_prev_next(pages, toc, missing_titles)
p = nil
toc.each_with_index do |t,i|
j = i + 1
n = toc[j] if j < toc.length
while j < toc.length and not n.nil? and not n.key?(:path) do
j = j + 1
n = toc[j]
end
if t.key?(:path)
this_page = pages[t[:path]]
this_page.data["previous"] = pages[p[:path]] unless p.nil?
this_page.data["next"] = pages[n[:path]] unless n.nil?
return if not n.nil? and n[:path].start_with?('http')
raise "unknown page: #{n.inspect}" if not n.nil? and pages[n[:path]].nil?
missing_titles << p[:path] if not p.nil? and not pages[p[:path]].data.key?("title")
missing_titles << n[:path] if not n.nil? and not pages[n[:path]].data.key?("title")
do_populate_prev_next(pages, t[:pages], missing_titles) if t.key?(:pages)
p = t
end
end
end
end