summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/collect_files.rs53
-rw-r--r--src/main.rs25
2 files changed, 44 insertions, 34 deletions
diff --git a/src/collect_files.rs b/src/collect_files.rs
index de577cf..4eee1dc 100644
--- a/src/collect_files.rs
+++ b/src/collect_files.rs
@@ -10,19 +10,20 @@ pub struct Website {
pub config: HashMap<String, String>,
pub pages: Vec<Page>,
pub redirects: Vec<Redirect>,
- pub static_files: Vec<StaticItem>,
- pub static_dirs: Vec<StaticItem>,
+ pub static_files: Vec<StaticItem>, // Redirects, !-prefixed-dir contents
+ pub static_dirs: Vec<StaticItem>, // Only !-prefixed static dirs
}
pub struct Page {
- pub name: String, // Display name of this page
- pub name_url: String, // URL name for this page, no extension
- pub full_url: String, // Full URL for this page, no extension
- pub parents: Vec<String>, // Parent directory components, unsafe
- pub parent_url: String, // Base URL for links in this page
- pub source_path: PathBuf, // Absolute path to source file
- pub document: MarkdownDocument, // File content parsed as markdown
- pub headings: Vec<Heading>, // Ordered list of all headings in page
+ pub name: String, // Display name of this page
+ pub name_url: String, // URL name for this page, no extension
+ pub full_url: String, // Full URL for this page, no extension
+ pub parents: Vec<String>, // Parent directory components, unsafe
+ pub parent_url: String, // Base URL for links in this page
+ pub source_path: PathBuf, // Absolute path to source file
+ pub document: MarkdownDocument, // File content parsed as markdown
+ pub headings: Vec<Heading>, // Ordered list of all headings in page
+ pub last_modified: Option<SystemTime>, // last-modified time of source file
}
pub struct Heading {
@@ -32,16 +33,18 @@ pub struct Heading {
}
pub struct StaticItem {
- pub full_url: String, // Safe full URL, with extension
- pub source_path: PathBuf, // Absolute path to source file
+ pub full_url: String, // Safe full URL, with extension
+ pub source_path: PathBuf, // Absolute path to source file
+ pub last_modified: Option<SystemTime>, // last-modified time of source file
}
pub struct Redirect {
- pub name: String, // Display name of this redirect
- pub full_url: String, // Safe full URL, no extension
- pub parents: Vec<String>, // Parent directory components, unsafe
- pub parent_url: String, // Base URL for relative redirects
- pub redirect: String, // Page to redirect to, as an internal link
+ pub name: String, // Display name of this redirect
+ pub full_url: String, // Safe full URL, no extension
+ pub parents: Vec<String>, // Parent directory components, unsafe
+ pub parent_url: String, // Base URL for relative redirects
+ pub redirect: String, // Page to redirect to, as an internal link
+ pub last_modified: Option<SystemTime>, // last-modified time of source file
}
pub trait LinkFrom {
@@ -110,6 +113,8 @@ impl Website {
}
}
let name_url = make_url_safe(&name);
+ // Get last-modified time.
+ let last_modified = entry.last_modified;
// Generate parent URL, used only for files.
let source_path = entry.original_path.clone();
let relative_path = source_path.strip_prefix(prefix).unwrap_or_else(
@@ -128,10 +133,10 @@ impl Website {
|_| error!("Path doesn't start with {prefix:?}: {source_path:?}"))
.as_os_str().to_string_lossy().to_string();
let full_url = format!("{stripped}/{relative_path}");
- self.static_files.push(StaticItem { full_url, source_path })
+ self.static_files.push(StaticItem { full_url, source_path, last_modified })
}
let full_url = make_url_safe(stripped);
- self.static_dirs.push(StaticItem { full_url, source_path });
+ self.static_dirs.push(StaticItem { full_url, source_path, last_modified });
} else {
for child in list_directory(entry.original_path).unwrap() {
self.collect_entry(&child.original_path, prefix);
@@ -191,6 +196,7 @@ impl Website {
source_path,
document,
headings,
+ last_modified,
});
} else {
// This is an index file for a directory.
@@ -213,6 +219,7 @@ impl Website {
source_path,
document,
headings,
+ last_modified,
});
}
} else {
@@ -229,6 +236,7 @@ impl Website {
parents, parent_url,
source_path,
document, headings,
+ last_modified,
});
}
},
@@ -242,7 +250,10 @@ impl Website {
full_url.push_str(&name_url);
let redirect = std::fs::read_to_string(&source_path)
.unwrap().trim().to_string();
- self.redirects.push(Redirect { name, full_url, parents, parent_url, redirect });
+ self.redirects.push(Redirect {
+ name, full_url, parents, parent_url,
+ redirect, last_modified,
+ });
}
_ => {
let mut parent_url = String::new();
@@ -251,7 +262,7 @@ impl Website {
parent_url.push('/');
}
let full_url = format!("{parent_url}{name_url}.{extension}");
- self.static_files.push(StaticItem { full_url, source_path });
+ self.static_files.push(StaticItem { full_url, source_path, last_modified });
},
}
}
diff --git a/src/main.rs b/src/main.rs
index 2920917..25d1528 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,6 +9,7 @@ use markdown::*;
use vagabond::*;
use std::collections::HashSet;
+use std::time::SystemTime;
const NORMAL: &str = "\x1b[0m";
@@ -95,7 +96,7 @@ fn main() {
// Convert document to different formats.
if args.html {
let html = generate_html(&page.document, page, &website);
- write_file(&html, &destination, "html");
+ write_file(&html, &destination, "html", page.last_modified);
}
// Copy original markdown file.
destination.add_extension("md");
@@ -115,15 +116,7 @@ fn main() {
static_file.source_path, destination));
}
- for static_dir in &website.static_dirs {
- let mut destination = destination.clone();
- destination.push(&static_dir.full_url);
- verbose!("Copying static directory to {destination:?}");
- make_parent_directory(&destination).unwrap();
- copy(&static_dir.source_path, &destination).unwrap_or_else(|_|
- error!("Failed to copy static directory {:?} to {:?}",
- static_dir.source_path, destination));
- }
+ // NOTE: Static dir contents are copied as part of all static files.
for redirect in &website.redirects {
let mut destination = destination.clone();
@@ -132,12 +125,12 @@ fn main() {
if args.html {
if !path.contains("://") {
if let Some(path) = website.has_page(redirect, &path, "html") {
- write_file(&generate_html_redirect(&path), &destination, "html");
+ write_file(&generate_html_redirect(&path), &destination, "html", redirect.last_modified);
} else {
warn!("Redirect {:?} links to nonexistent page {path:?}", redirect.name);
}
} else {
- write_file(&generate_html_redirect(&path), &destination, "html");
+ write_file(&generate_html_redirect(&path), &destination, "html", redirect.last_modified);
}
}
}
@@ -145,7 +138,7 @@ fn main() {
-pub fn write_file(text: &str, destination: &PathBuf, ext: &str) {
+pub fn write_file(text: &str, destination: &PathBuf, ext: &str, last_modified: Option<SystemTime>) {
let mut destination = destination.clone();
destination.add_extension(ext);
verbose!("Generating {destination:?}");
@@ -153,6 +146,12 @@ pub fn write_file(text: &str, destination: &PathBuf, ext: &str) {
error!("Failed to create parent directories for {destination:?}"));
write_to_file(&destination, text).unwrap_or_else(|_|
error!("Failed to write generated {ext} file to {destination:?}"));
+ // Set the last-modified time of the new file to the time provided.
+ if let Some(time) = last_modified {
+ if let Ok(dest) = std::fs::File::open(&destination) {
+ let _ = dest.set_modified(time);
+ }
+ }
}
pub fn make_url_safe(text: &str) -> String {