diff options
Diffstat (limited to 'src/page.rs')
-rw-r--r-- | src/page.rs | 68 |
1 files changed, 23 insertions, 45 deletions
diff --git a/src/page.rs b/src/page.rs index 41a8584..d3bc8e7 100644 --- a/src/page.rs +++ b/src/page.rs @@ -1,8 +1,9 @@ use crate::error::SiteError; use crate::html::{parse, Content, Element, ElementTag, HtmlPage}; +use crate::name::Name; use crate::parser::WikitextParser; use crate::site::Site; -use crate::util::{get_mtime, join_subpath, make_path_relative_to}; +use crate::util::get_mtime; use crate::wikitext::Snippet; use log::{info, trace}; use std::path::{Path, PathBuf}; @@ -19,21 +20,16 @@ impl WikitextPage { Self { meta, wikitext } } - pub fn read(srcdir: &Path, filename: &Path) -> Result<Self, SiteError> { - info!("input file: {}", filename.display()); - let relative = make_path_relative_to(srcdir, filename).with_extension(""); - let absolute = Path::new("/").join(&relative); - let name = relative - .file_name() - .unwrap_or_else(|| panic!("get filename from {}", relative.display())) - .to_string_lossy() - .to_string(); - let data = std::fs::read(filename).map_err(|e| SiteError::FileRead(filename.into(), e))?; - let wikitext = String::from_utf8(data).map_err(|e| SiteError::Utf8(filename.into(), e))?; - let mtime = get_mtime(filename)?; + pub fn read(name: &Name) -> Result<Self, SiteError> { + info!("input file: {}", name); + + let src = name.source_path(); + let data = std::fs::read(&src).map_err(|e| SiteError::FileRead(src.into(), e))?; + let wikitext = String::from_utf8(data).map_err(|e| SiteError::Utf8(src.into(), e))?; + let mtime = get_mtime(src)?; + let meta = MetaBuilder::default() - .name(name) - .path(absolute) + .name(name.clone()) .mtime(mtime) .build(); Ok(Self::new(meta, wikitext)) @@ -125,35 +121,24 @@ impl MarkdownPage { #[derive(Debug, Clone, Eq, PartialEq)] pub struct PageMeta { - name: String, + name: Name, title: Option<String>, - path: PathBuf, mtime: SystemTime, } impl PageMeta { - fn new(name: String, title: Option<String>, path: PathBuf, mtime: SystemTime) -> Self { + fn new(name: Name, title: Option<String>, mtime: SystemTime) -> Self { trace!( - "PageMeta: name={:?} title={:?} path={:?} mtime={:?}", + "PageMeta: name={:?} title={:?} mtime={:?}", name, title, - path, mtime, ); - Self { - name, - title, - path, - mtime, - } + Self { name, title, mtime } } - pub fn destination_filename(&self, destdir: &Path) -> PathBuf { - join_subpath(destdir, &self.path).with_extension("html") - } - - pub fn name(&self) -> &str { - &self.name + pub fn destination_filename(&self) -> PathBuf { + self.name.destination_path().into() } pub fn set_title(&mut self, title: String) { @@ -165,12 +150,12 @@ impl PageMeta { if let Some(title) = &self.title { title } else { - &self.name + self.name.page_name() } } pub fn path(&self) -> &Path { - &self.path + self.name.page_path() } pub fn mtime(&self) -> SystemTime { @@ -180,24 +165,22 @@ impl PageMeta { #[derive(Debug, Default)] pub struct MetaBuilder { - name: String, + name: Option<Name>, title: Option<String>, - path: Option<PathBuf>, mtime: Option<SystemTime>, } impl MetaBuilder { pub fn build(self) -> PageMeta { PageMeta::new( - self.name, + self.name.expect("name set on MetaBuilder"), self.title, - self.path.expect("path set on MetaBuilder"), self.mtime.expect("mtime set on MetaBuilder"), ) } - pub fn name(mut self, name: String) -> Self { - self.name = name; + pub fn name(mut self, name: Name) -> Self { + self.name = Some(name); self } @@ -206,11 +189,6 @@ impl MetaBuilder { self } - pub fn path(mut self, path: PathBuf) -> Self { - self.path = Some(path); - self - } - pub fn mtime(mut self, mtime: SystemTime) -> Self { self.mtime = Some(mtime); self |