From 142851a969f7502bcd2779b0a35d7bc6e80de909 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 3 Dec 2022 09:02:26 +0200 Subject: refactor: add a simpler Page data type for clarity Sponsored-by: author --- src/page.rs | 19 +++++++++++++++++++ src/site.rs | 39 ++++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/page.rs b/src/page.rs index 832e71e..2e555c8 100644 --- a/src/page.rs +++ b/src/page.rs @@ -10,6 +10,25 @@ use log::{info, trace}; use std::path::{Path, PathBuf}; use std::time::SystemTime; +pub struct Page { + meta: PageMeta, + unprocessed: UnprocessedPage, +} + +impl Page { + pub fn new(meta: PageMeta, unprocessed: UnprocessedPage) -> Self { + Self { meta, unprocessed } + } + + pub fn meta(&self) -> &PageMeta { + &self.meta + } + + pub fn markdown(&self, site: &mut Site) -> Result { + self.unprocessed.process(site) + } +} + #[derive(Debug, Eq, PartialEq)] pub struct WikitextPage { meta: PageMeta, diff --git a/src/site.rs b/src/site.rs index 0b03c85..739cffb 100644 --- a/src/site.rs +++ b/src/site.rs @@ -1,7 +1,7 @@ use crate::error::SiteError; use crate::git::git_whatchanged; use crate::name::{Name, NameBuilder, Names}; -use crate::page::{MarkdownPage, UnprocessedPage, WikitextPage}; +use crate::page::{MarkdownPage, Page, UnprocessedPage, WikitextPage}; use crate::parser::WikitextParser; use crate::srcdir::{PathFilter, SourceDir}; use crate::token::TokenPatterns; @@ -14,8 +14,8 @@ use std::time::UNIX_EPOCH; pub struct Site { patterns: TokenPatterns, shortcuts: HashMap, - builder: NameBuilder, - unprocessed_pages: Vec, + name_builder: NameBuilder, + pages: Vec, markdown_pages: Vec, pages_that_will_exist: PageSet, files: Names, @@ -30,8 +30,8 @@ impl Site { P: AsRef, { Self { - builder: NameBuilder::new(srcdir.as_ref(), destdir.as_ref()), - unprocessed_pages: vec![], + name_builder: NameBuilder::new(srcdir.as_ref(), destdir.as_ref()), + pages: vec![], markdown_pages: vec![], files: Names::default(), patterns: TokenPatterns::default(), @@ -68,8 +68,9 @@ impl Site { let mut parser = WikitextParser::new(page.wikitext(), &self.patterns); let page = UnprocessedPage::new(page.meta().clone(), &mut parser)?; page.prepare(self)?; + let page = Page::new(page.meta().clone(), page); - self.unprocessed_pages.push(page); + self.pages.push(page); Ok(()) } @@ -91,12 +92,12 @@ impl Site { } fn process_page(&mut self) -> Result { - if let Some(page) = self.unprocessed_pages.pop() { + if let Some(page) = self.pages.pop() { debug!( "processing unprocessed page {}", page.meta().path().display() ); - let page = page.process(self)?; + let page = page.markdown(self)?; self.markdown_pages.push(page); Ok(true) } else { @@ -118,25 +119,25 @@ impl Site { } pub fn is_page(&self, path: &Path) -> bool { - self.pages_that_will_exist.get(path).is_some() + self.pages_that_will_exist.get_path(path).is_some() } fn all_files(&self) -> Result, SiteError> { - let whatchanged = git_whatchanged(self.builder.srcdir())?; + let whatchanged = git_whatchanged(self.name_builder.srcdir())?; - let mut srcdir = SourceDir::new(self.builder.srcdir()); + let mut srcdir = SourceDir::new(self.name_builder.srcdir()); srcdir.scan()?; let filter = PathFilter::new(Self::EXCLUDE_SUBSTRINGS, Self::EXCLUDE_ENDS); let mut names = vec![]; for path in srcdir.files().iter().filter(|x| filter.is_included(x)) { - let relative = path.strip_prefix(self.builder.srcdir()).unwrap(); + let relative = path.strip_prefix(self.name_builder.srcdir()).unwrap(); let mtime = whatchanged.get(relative).copied().unwrap_or(UNIX_EPOCH); if Self::is_markdown(path) { - names.push(self.builder.page(path, mtime)); + names.push(self.name_builder.page(path, mtime)); } else if path.is_file() { - names.push(self.builder.file(path, mtime)); + names.push(self.name_builder.file(path, mtime)); } else { trace!("not a file, ignoring: {}", path.display()); } @@ -177,7 +178,7 @@ impl Site { // Is target absolute? if target.starts_with("/") { - if let Some(path) = self.pages_that_will_exist.get(target) { + if let Some(path) = self.pages_that_will_exist.get_path(target) { trace!("absolute target exists"); return Ok(path.into()); } else { @@ -189,7 +190,7 @@ impl Site { // Does a sub-page or file exist? let wanted = page.join(target); trace!("checking for subpage or file {}", wanted.display()); - if let Some(path) = self.pages_that_will_exist.get(&wanted) { + if let Some(path) = self.pages_that_will_exist.get_path(&wanted) { trace!("subpage exists: {}", path.display()); return Ok(path.into()); } else if self.file_exists(&wanted) { @@ -205,7 +206,7 @@ impl Site { parent.display(), path.display() ); - if let Some(path) = self.pages_that_will_exist.get(path.as_path()) { + if let Some(path) = self.pages_that_will_exist.get_path(path.as_path()) { trace!("sibling page exists: {}", path.display()); return Ok(path.into()); } @@ -219,7 +220,7 @@ impl Site { // Does target exist relative to root? let wanted = Path::new("/").join(target); trace!("checking for absolute path {}", wanted.display()); - if let Some(path) = self.pages_that_will_exist.get(&wanted) { + if let Some(path) = self.pages_that_will_exist.get_path(&wanted) { trace!("page at absolute path exists: {}", path.display()); return Ok(path.into()); } else if self.file_exists(&wanted) { @@ -266,7 +267,7 @@ impl PageSet { self.map.insert(key, path.into()); } - fn get(&self, path: &Path) -> Option<&Path> { + fn get_path(&self, path: &Path) -> Option<&Path> { self.map.get(&Self::normalize(path)).map(|x| x.as_ref()) } -- cgit v1.2.1