/
index.rs
70 lines (50 loc) · 2.29 KB
/
index.rs
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
// Helianto -- static website generator
// Copyright © 2015-2016 Mickaël RAYBAUD-ROIG
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
use std::rc::Rc;
use std::collections::HashMap;
use std::path::PathBuf;
use super::super::{Result, Document, DocumentMetadata, DocumentContent};
pub struct IndexGenerator;
impl super::Generator for IndexGenerator {
fn new() -> IndexGenerator { IndexGenerator }
fn generate(&self, docs: &[Rc<DocumentMetadata>]) -> Result<Vec<Rc<Document>>> {
let mut indexes: HashMap<String, Vec<Rc<DocumentMetadata>>> = HashMap::new();
for doc in docs.iter() {
let mut path: PathBuf = PathBuf::from(&doc.url);
while let Some(parent) = path.clone().parent() {
let index_url = match parent.to_str() {
Some(string) => string.into(),
None => continue,
};
let documents = indexes.entry(index_url).or_insert_with(Vec::new);
documents.push(doc.clone());
path = parent.into();
}
}
Ok(indexes.into_iter()
.map(|(url, mut docs)| {
let meta = DocumentMetadata {
url: format!("{}/index.html", url),
title: format!("Index of {}", if url != "" { url } else { "/".into() }),
..DocumentMetadata::default()
};
docs.sort_by(|b, a| a.created.cmp(&b.created));
let content = DocumentContent::Index(docs);
Rc::new(Document::new(meta, content))
})
.collect())
}
}