diff options
Diffstat (limited to 'lib/page_index.rb')
-rw-r--r-- | lib/page_index.rb | 121 |
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") |