summaryrefslogtreecommitdiff
path: root/lib/page_index.rb
blob: 43bf36789c34daa3dd8b946cb6fc048777973330 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# 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 index_title
		_metadata['title'] || File::basename(local_infile)
	end
	def index_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 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
			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 = {
				'' => 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
	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")