summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2017-01-09 19:19:19 -0500
committerLuke Shumaker <lukeshu@sbcglobal.net>2017-01-09 19:19:19 -0500
commitf1b364abf455b3654580718972a77572ca29be02 (patch)
tree875108b3c8c3ca8af7c8430f37f78be00a91684f /lib
parent955387e6af782e1dabd4d68ad12904263c4e8023 (diff)
Implement tag pages (finally!)
Diffstat (limited to 'lib')
-rw-r--r--lib/page.rb4
-rw-r--r--lib/page_index.rb20
-rw-r--r--lib/page_local.rb10
-rw-r--r--lib/page_remote.rb1
-rw-r--r--lib/page_tag.rb60
-rw-r--r--lib/sitegen.rb23
-rw-r--r--lib/siteutil.rb2
7 files changed, 100 insertions, 20 deletions
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<Fixnum>
+ def initialize
+ Sitegen::add(self)
+ end
def atom_categories # => Enumerable<Category>
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('<?xml version="1.0" encoding="utf-8"?>')
- 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("<a href=\"#{url.route_to(page.url)}\">#{page.atom_title}</a>")
break if path == "/"
path = File::dirname(path)