summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-12-03 09:02:26 +0200
committerLars Wirzenius <liw@liw.fi>2022-12-03 10:44:06 +0200
commit142851a969f7502bcd2779b0a35d7bc6e80de909 (patch)
treeb400ae42d122dec9193bcf9db3b5a762e3afb1de
parentafcea855723136707a791167e7823b5dfdc0fd8a (diff)
downloadriki-142851a969f7502bcd2779b0a35d7bc6e80de909.tar.gz
refactor: add a simpler Page data type for clarity
Sponsored-by: author
-rw-r--r--src/page.rs19
-rw-r--r--src/site.rs39
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<MarkdownPage, SiteError> {
+ 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<String, Shortcut>,
- builder: NameBuilder,
- unprocessed_pages: Vec<UnprocessedPage>,
+ name_builder: NameBuilder,
+ pages: Vec<Page>,
markdown_pages: Vec<MarkdownPage>,
pages_that_will_exist: PageSet,
files: Names,
@@ -30,8 +30,8 @@ impl Site {
P: AsRef<Path>,
{
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<bool, SiteError> {
- 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<Vec<Name>, 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())
}