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")
|