From f1b364abf455b3654580718972a77572ca29be02 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 9 Jan 2017 19:19:19 -0500 Subject: Implement tag pages (finally!) --- lib/page.rb | 4 ++++ lib/page_index.rb | 20 ++++++++++++------ lib/page_local.rb | 10 ++++----- lib/page_remote.rb | 1 + lib/page_tag.rb | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/sitegen.rb | 23 +++++++++++++-------- lib/siteutil.rb | 2 +- 7 files changed, 100 insertions(+), 20 deletions(-) create mode 100644 lib/page_tag.rb (limited to 'lib') diff --git a/lib/page.rb b/lib/page.rb index 20f9701..b349dc8 100644 --- a/lib/page.rb +++ b/lib/page.rb @@ -3,6 +3,7 @@ require 'erb' require 'set' require 'category' +require 'sitegen' class Page # Page is an abstract class. @@ -20,6 +21,9 @@ class Page # def page_published => Time | nil # def page_updated => Time | nil # def page_years => Enumerable + def initialize + Sitegen::add(self) + end def atom_categories # => Enumerable if @categories.nil? diff --git a/lib/page_index.rb b/lib/page_index.rb index 66b528a..3c2f504 100644 --- a/lib/page_index.rb +++ b/lib/page_index.rb @@ -82,19 +82,27 @@ class IndexPage < LocalPage def local_outfile local_infile.sub(/^src/, 'out')+"/index.html" end - def local_depends - if @depends.nil? + def index_depends + if @index_depends.nil? basename = local_infile.sub(/^src/, 'out') deps = Set[local_infile] yamlfile = local_infile+"/index.yaml" if File::exist?(yamlfile) deps.add(yamlfile) end - index_pages.select{|p|!p.is_a?(RemotePage)}.each{|p|deps.merge(p.local_depends[''])} + deps.add('config.yaml') + index_pages.select{|p|p.is_a?(LocalPage)}.each{|p|deps.merge(p.local_depends[''])} + @index_depends = deps + end + @index_depends + end + def local_depends + if @depends.nil? + basename = local_infile.sub(/^src/, 'out') @depends = { - '' => deps, - "#{basename}/index.html" => deps.clone.merge(["tmpl/index.md.erb", "tmpl/page.html.erb"]), - "#{basename}/index.atom" => deps.clone.merge(["tmpl/index.atom.erb", "tmpl/page.atom.erb"]), + '' => index_depends, + "#{basename}/index.html" => index_depends.clone.merge(["tmpl/index.md.erb", "tmpl/page.html.erb"]), + "#{basename}/index.atom" => index_depends.clone.merge(["tmpl/index.atom.erb", "tmpl/page.atom.erb"]), } end @depends diff --git a/lib/page_local.rb b/lib/page_local.rb index 7121c8e..c4bd158 100644 --- a/lib/page_local.rb +++ b/lib/page_local.rb @@ -7,12 +7,11 @@ require 'license' require 'page' require 'pandoc' require 'person' -require 'sitegen' class LocalPage < Page def initialize(infile) @infile = infile - Sitegen::add(self) + super() end # Some of this code looks a little weird because it is @@ -104,10 +103,11 @@ class LocalPage < Page def local_depends if @depends.nil? basename = local_infile.sub(/^src/, 'out').sub(/\.[^\/.]*$/, '') + deps = Set['config.yaml', local_infile] @depends = { - '' => Set[local_infile], - "#{basename}.html" => Set[local_infile, "tmpl/page.html.erb"], - #"#{basename}.atom" => Set[local_infile, "tmpl/page.atom.erb"] + '' => deps, + "#{basename}.html" => deps.clone.merge(["tmpl/page.html.erb"]), + #"#{basename}.atom" => deps.clone.merge([local_infile, "tmpl/page.atom.erb"]), } end @depends diff --git a/lib/page_remote.rb b/lib/page_remote.rb index 5425944..9617754 100644 --- a/lib/page_remote.rb +++ b/lib/page_remote.rb @@ -7,6 +7,7 @@ require 'page' class RemotePage < Page def initialize(metadata) @metadata = metadata + super() end def url diff --git a/lib/page_tag.rb b/lib/page_tag.rb new file mode 100644 index 0000000..01ef31d --- /dev/null +++ b/lib/page_tag.rb @@ -0,0 +1,60 @@ +# coding: utf-8 +require 'category' +require 'page_index' +require 'page_remote' +require 'sitegen' + +class TagPage < IndexPage + def initialize(abbr) + @category = Category::new(abbr) + super("src/tags/#{@category.abbr}.phony") + end + def atom_title + return "Tag: #{@category.name}" + end + def index_pages + return Sitegen::pages + .select{|p|!p.is_a?(IndexPage)} + .select{|p|p.atom_categories.any?{|c|c.abbr == @category.abbr}} + .to_set + end + def local_outfile + return "out/tags/#{@category.abbr}.html" + end + def index_depends + if @depends.nil? + deps = Set['config.yaml'] + Sitegen::pages.select{|p|!p.is_a?(RemotePage)}.each{|p|deps.merge(p.local_depends[''])} + @depends = deps + end + @depends + end + def local_depends + return { + '' => index_depends, + local_outfile => index_depends.clone.merge(["tmpl/index.md.erb", "tmpl/page.html.erb"]), + } + end +end + +class TagIndexPage < IndexPage + def initialize + super("src/tags") + end + def atom_title + return "Tags" + end + def index_pages + return Sitegen::pages + .select{|p|p.is_a?(TagPage)} + .to_set + end + def index_depends + if @depends.nil? + deps = Set[] + Sitegen::pages.select{|p|p.is_a?(LocalPage)}.each{|p|deps.merge(p.local_depends[''])} + @depends = deps + end + @depends + end +end diff --git a/lib/sitegen.rb b/lib/sitegen.rb index ca0c4bf..78222a3 100644 --- a/lib/sitegen.rb +++ b/lib/sitegen.rb @@ -3,19 +3,26 @@ require 'date' require 'fileutils' require 'set' +require 'page_local' + module Sitegen def self.init - @mk = {} + @local = {} + @remote = {} @want = Set[] end def self.add(page) @deps = nil - page.local_depends.keys.each do |filename| - @mk[filename] = page unless filename.empty? + if page.is_a?(LocalPage) + page.local_depends.keys.each do |filename| + @local[filename] = page unless filename.empty? + end + else + @remote[page.url] = page end end def self.pages - @mk.values.to_set + @local.values.to_set.merge(@remote.values) end def self.want(filename) @deps = nil @@ -27,7 +34,7 @@ module Sitegen ret = {} ret[:all] = @want @want.each do |filename| - ret[filename] = libfiles.clone.merge(@mk[filename].local_depends[filename]) + ret[filename] = libfiles.clone.merge(@local[filename].local_depends[filename]) end @deps = ret end @@ -62,18 +69,18 @@ module Sitegen def self.generate(target) case - when @mk[target].nil? + when @local[target].nil? raise "No rule to make target '#{target}'. Stop." when target.end_with?(".atom") puts "atom #{target}" write_atomic(target) do |file| file.puts('') - file.print(@mk[target].atom) + file.print(@local[target].atom) end when target.end_with?(".html") puts "html #{target}" write_atomic(target) do |file| - file.print(@mk[target].html) + file.print(@local[target].html) end else raise "No rule to make target '#{target}'. Stop." diff --git a/lib/siteutil.rb b/lib/siteutil.rb index 3f36ff2..0c0bb69 100644 --- a/lib/siteutil.rb +++ b/lib/siteutil.rb @@ -17,7 +17,7 @@ module Sitegen while true a = 'out'+path b = ('out'+path+'/index.html').gsub('//', '/') - page = @mk[a] || @mk[b] + page = @local[a] || @local[b] bc.unshift("#{page.atom_title}") break if path == "/" path = File::dirname(path) -- cgit v1.2.3