summaryrefslogtreecommitdiff
path: root/lib/page_index.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/page_index.rb')
-rw-r--r--lib/page_index.rb121
1 files changed, 121 insertions, 0 deletions
diff --git a/lib/page_index.rb b/lib/page_index.rb
new file mode 100644
index 0000000..66b528a
--- /dev/null
+++ b/lib/page_index.rb
@@ -0,0 +1,121 @@
+# coding: utf-8
+require 'erb'
+require 'set'
+require 'yaml'
+
+require 'config'
+require 'page_local'
+require 'page_remote'
+require 'person'
+
+class IndexPage < LocalPage
+ def initialize(dirname)
+ super(dirname)
+ end
+
+ def _metadata
+ if @metadata.nil?
+ yamlfile = local_infile+"/index.yaml"
+ if File::exist?(yamlfile)
+ @metadata = YAML::load(File::read(yamlfile))
+ else
+ @metadata = {}
+ end
+ end
+ @metadata
+ end
+ def _ls
+ @ls ||= Dir::entries(local_infile)
+ .select{|fname|not fname.start_with?(".")}
+ .map{|fname|"#{local_infile}/#{fname}"}
+ .select{|path|Dir::exist?(path) or Config::get.html_suffixes.include?(File::extname(path).gsub(/^[.]/, ''))}
+ end
+ def index_pages
+ if @pages.nil?
+ @pages = Set[]
+ for path in _ls
+ @pages.add( Dir::exist?(path) ? IndexPage::new(path) : LocalPage::new(path) )
+ end
+ for data in (_metadata['external'] || [])
+ @pages.add(RemotePage::new(data))
+ end
+ end
+ @pages
+ end
+ def index_pages_leaves
+ ret = Set[]
+ index_pages.each do |page|
+ if page.is_a?(IndexPage)
+ ret.merge(page.index_pages)
+ else
+ ret.add(page)
+ end
+ end
+ return ret
+ end
+
+ def index_link(cururl, depth)
+ ret = ''
+ unless depth <= 1
+ ret += "<h#{depth}>[#{atom_title}](#{cururl.route_to(url)})</h#{depth}>\n\n"
+ end
+ for page in index_pages.select{|page|not page.is_a?(IndexPage)}.sort_by{|page|page.atom_published}
+ ret += page.index_link(cururl, depth+1)
+ end
+ ret += "\n"
+ for page in index_pages.select{|page|page.is_a?(IndexPage)}.sort_by{|page|page.atom_title}
+ ret += page.index_link(cururl, depth+1)
+ end
+ ret += "\n"
+ return ret.gsub(/\n\n+/, "\n\n")
+ end
+ def atom_title
+ _metadata['title']
+ end
+ def atom_author
+ Person::new(_metadata['author'] || Config::get.default_author)
+ end
+
+ def local_intype
+ return 'markdown'
+ end
+ def local_outfile
+ local_infile.sub(/^src/, 'out')+"/index.html"
+ end
+ def local_depends
+ if @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[''])}
+ @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"]),
+ }
+ end
+ @depends
+ end
+ def url
+ @outurl ||= Config::get.url + local_outfile.sub(/^out/, '').sub(/\/index\.html$/, '/')
+ end
+ def local_srcurl
+ return nil
+ end
+
+ def page_published
+ return nil
+ end
+ def page_updated
+ return nil
+ end
+ def page_years
+ return Set[]
+ end
+end
+
+ERB::new(File::read("tmpl/index.atom.erb")).def_method(IndexPage, 'atom()', "tmpl/index.atom.erb")
+ERB::new(File::read("tmpl/index.md.erb")).def_method(IndexPage, 'local_input()', "tmpl/index.md.erb")