summaryrefslogtreecommitdiff
path: root/lib/page_index.rb
blob: 42c9e215e00d78d9831fde62953538631bcbbced (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
130
131
132
# 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 += "<section><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_updated}.reverse
			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"
		unless depth <= 1
			ret += "</section>\n\n"
		end
		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")