Compare commits

..

No commits in common. "7b012302342669dff430d50b9243d14aede2a8c6" and "e3b5f7f74f8c5b53ed369f46416067add6b70a6b" have entirely different histories.

12 changed files with 14 additions and 135 deletions

View File

@ -6,7 +6,6 @@ mod heading;
mod object; mod object;
mod plain_text; mod plain_text;
mod section; mod section;
mod target;
pub(crate) use blog_post_page::RenderBlogPostPage; pub(crate) use blog_post_page::RenderBlogPostPage;
pub(crate) use document_element::RenderDocumentElement; pub(crate) use document_element::RenderDocumentElement;

View File

@ -7,13 +7,11 @@ use crate::error::CustomError;
use crate::intermediate::IObject; use crate::intermediate::IObject;
use super::plain_text::RenderPlainText; use super::plain_text::RenderPlainText;
use super::target::RenderTarget;
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
#[serde(untagged)] #[serde(untagged)]
pub(crate) enum RenderObject { pub(crate) enum RenderObject {
PlainText(RenderPlainText), PlainText(RenderPlainText),
Target(RenderTarget),
} }
impl RenderObject { impl RenderObject {
@ -30,12 +28,6 @@ impl RenderObject {
output_file, output_file,
inner, inner,
)?)), )?)),
IObject::Target(inner) => Ok(RenderObject::Target(RenderTarget::new(
config,
output_directory,
output_file,
inner,
)?)),
} }
} }
} }

View File

@ -1,27 +0,0 @@
use std::path::Path;
use serde::Serialize;
use crate::config::Config;
use crate::error::CustomError;
use crate::intermediate::ITarget;
#[derive(Debug, Serialize)]
#[serde(tag = "type")]
#[serde(rename = "target")]
pub(crate) struct RenderTarget {
id: String,
}
impl RenderTarget {
pub(crate) fn new<D: AsRef<Path>, F: AsRef<Path>>(
config: &Config,
output_directory: D,
output_file: F,
target: &ITarget,
) -> Result<RenderTarget, CustomError> {
Ok(RenderTarget {
id: target.id.clone(),
})
}
}

View File

@ -5,14 +5,15 @@ use tokio::task::JoinHandle;
use walkdir::WalkDir; use walkdir::WalkDir;
use crate::error::CustomError; use crate::error::CustomError;
use crate::intermediate::registry::Registry;
use super::BlogPostPage; use super::BlogPostPage;
use super::IDocumentElement;
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct BlogPost { pub(crate) struct BlogPost {
pub(crate) id: String, pub(crate) id: String,
pub(crate) pages: Vec<BlogPostPage>, pub(crate) pages: Vec<BlogPostPage>,
pub(crate) children: Vec<IDocumentElement>,
} }
impl BlogPost { impl BlogPost {
@ -43,27 +44,12 @@ impl BlogPost {
ret ret
}; };
let mut registry = Registry::new();
// Assign IDs to the targets
for (_real_path, _contents, parsed_document) in parsed_org_files.iter() {
organic::types::AstNode::from(parsed_document)
.iter_all_ast_nodes()
.for_each(|node| match node {
organic::types::AstNode::Target(target) => {
registry.get_target(target.value);
}
_ => {}
});
}
let pages = { let pages = {
let mut ret = Vec::new(); let mut ret = Vec::new();
for (real_path, _contents, parsed_document) in parsed_org_files.iter() { for (real_path, _contents, parsed_document) in parsed_org_files {
let relative_to_post_dir_path = real_path.strip_prefix(post_dir)?; let relative_to_post_dir_path = real_path.strip_prefix(post_dir)?;
ret.push(BlogPostPage::new( ret.push(BlogPostPage::new(
relative_to_post_dir_path, relative_to_post_dir_path,
&mut registry,
parsed_document, parsed_document,
)?); )?);
} }
@ -73,6 +59,7 @@ impl BlogPost {
Ok(BlogPost { Ok(BlogPost {
id: post_id.to_string_lossy().into_owned(), id: post_id.to_string_lossy().into_owned(),
pages, pages,
children: Vec::new(),
}) })
} }
inner(root_dir.as_ref(), post_dir.as_ref()).await inner(root_dir.as_ref(), post_dir.as_ref()).await

View File

@ -1,6 +1,5 @@
use crate::error::CustomError; use crate::error::CustomError;
use super::registry::Registry;
use super::IObject; use super::IObject;
#[derive(Debug)] #[derive(Debug)]
@ -10,14 +9,11 @@ pub(crate) struct IHeading {
} }
impl IHeading { impl IHeading {
pub(crate) fn new<'parse>( pub(crate) fn new(heading: &organic::types::Heading<'_>) -> Result<IHeading, CustomError> {
registry: &mut Registry<'parse>,
heading: &organic::types::Heading<'parse>,
) -> Result<IHeading, CustomError> {
let title = heading let title = heading
.title .title
.iter() .iter()
.map(|obj| IObject::new(registry, obj)) .map(IObject::new)
.collect::<Result<Vec<_>, _>>()?; .collect::<Result<Vec<_>, _>>()?;
Ok(IHeading { Ok(IHeading {
title, title,

View File

@ -6,9 +6,7 @@ mod heading;
mod object; mod object;
mod page; mod page;
mod plain_text; mod plain_text;
mod registry;
mod section; mod section;
mod target;
mod util; mod util;
pub(crate) use convert::convert_blog_post_page_to_render_context; pub(crate) use convert::convert_blog_post_page_to_render_context;
pub(crate) use definition::BlogPost; pub(crate) use definition::BlogPost;
@ -19,4 +17,3 @@ pub(crate) use object::IObject;
pub(crate) use page::BlogPostPage; pub(crate) use page::BlogPostPage;
pub(crate) use plain_text::IPlainText; pub(crate) use plain_text::IPlainText;
pub(crate) use section::ISection; pub(crate) use section::ISection;
pub(crate) use target::ITarget;

View File

@ -1,20 +1,14 @@
use crate::error::CustomError; use crate::error::CustomError;
use super::plain_text::IPlainText; use super::plain_text::IPlainText;
use super::registry::Registry;
use super::ITarget;
#[derive(Debug)] #[derive(Debug)]
pub(crate) enum IObject { pub(crate) enum IObject {
PlainText(IPlainText), PlainText(IPlainText),
Target(ITarget),
} }
impl IObject { impl IObject {
pub(crate) fn new<'parse>( pub(crate) fn new(obj: &organic::types::Object<'_>) -> Result<IObject, CustomError> {
registry: &mut Registry<'parse>,
obj: &organic::types::Object<'parse>,
) -> Result<IObject, CustomError> {
match obj { match obj {
organic::types::Object::Bold(_) => todo!(), organic::types::Object::Bold(_) => todo!(),
organic::types::Object::Italic(_) => todo!(), organic::types::Object::Italic(_) => todo!(),
@ -23,7 +17,7 @@ impl IObject {
organic::types::Object::Code(_) => todo!(), organic::types::Object::Code(_) => todo!(),
organic::types::Object::Verbatim(_) => todo!(), organic::types::Object::Verbatim(_) => todo!(),
organic::types::Object::PlainText(plain_text) => { organic::types::Object::PlainText(plain_text) => {
Ok(IObject::PlainText(IPlainText::new(registry, plain_text)?)) Ok(IObject::PlainText(IPlainText::new(plain_text)?))
} }
organic::types::Object::RegularLink(_) => todo!(), organic::types::Object::RegularLink(_) => todo!(),
organic::types::Object::RadioLink(_) => todo!(), organic::types::Object::RadioLink(_) => todo!(),
@ -40,9 +34,7 @@ impl IObject {
organic::types::Object::InlineBabelCall(_) => todo!(), organic::types::Object::InlineBabelCall(_) => todo!(),
organic::types::Object::InlineSourceBlock(_) => todo!(), organic::types::Object::InlineSourceBlock(_) => todo!(),
organic::types::Object::LineBreak(_) => todo!(), organic::types::Object::LineBreak(_) => todo!(),
organic::types::Object::Target(target) => { organic::types::Object::Target(_) => todo!(),
Ok(IObject::Target(ITarget::new(registry, target)?))
}
organic::types::Object::StatisticsCookie(_) => todo!(), organic::types::Object::StatisticsCookie(_) => todo!(),
organic::types::Object::Subscript(_) => todo!(), organic::types::Object::Subscript(_) => todo!(),
organic::types::Object::Superscript(_) => todo!(), organic::types::Object::Superscript(_) => todo!(),

View File

@ -2,7 +2,6 @@ use std::path::PathBuf;
use crate::error::CustomError; use crate::error::CustomError;
use super::registry::Registry;
use super::IDocumentElement; use super::IDocumentElement;
use super::IHeading; use super::IHeading;
use super::ISection; use super::ISection;
@ -18,18 +17,17 @@ pub(crate) struct BlogPostPage {
} }
impl BlogPostPage { impl BlogPostPage {
pub(crate) fn new<'parse, P: Into<PathBuf>>( pub(crate) fn new<P: Into<PathBuf>>(
path: P, path: P,
registry: &mut Registry<'parse>, document: organic::types::Document<'_>,
document: &organic::types::Document<'parse>,
) -> Result<BlogPostPage, CustomError> { ) -> Result<BlogPostPage, CustomError> {
let path = path.into(); let path = path.into();
let mut children = Vec::new(); let mut children = Vec::new();
if let Some(section) = document.zeroth_section.as_ref() { if let Some(section) = document.zeroth_section.as_ref() {
children.push(IDocumentElement::Section(ISection::new(registry, section)?)); children.push(IDocumentElement::Section(ISection::new(section)?));
} }
for heading in document.children.iter() { for heading in document.children.iter() {
children.push(IDocumentElement::Heading(IHeading::new(registry, heading)?)); children.push(IDocumentElement::Heading(IHeading::new(heading)?));
} }
Ok(BlogPostPage { Ok(BlogPostPage {

View File

@ -1,8 +1,6 @@
use crate::error::CustomError; use crate::error::CustomError;
use crate::intermediate::util::coalesce_whitespace; use crate::intermediate::util::coalesce_whitespace;
use super::registry::Registry;
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct IPlainText { pub(crate) struct IPlainText {
source: String, source: String,
@ -10,7 +8,6 @@ pub(crate) struct IPlainText {
impl IPlainText { impl IPlainText {
pub(crate) fn new( pub(crate) fn new(
registry: &mut Registry<'_>,
plain_text: &organic::types::PlainText<'_>, plain_text: &organic::types::PlainText<'_>,
) -> Result<IPlainText, CustomError> { ) -> Result<IPlainText, CustomError> {
Ok(IPlainText { Ok(IPlainText {

View File

@ -1,24 +0,0 @@
use std::collections::HashMap;
type IdCounter = u16;
pub(crate) struct Registry<'parse> {
id_counter: IdCounter,
targets: HashMap<&'parse str, String>,
}
impl<'parse> Registry<'parse> {
pub(crate) fn new() -> Registry<'parse> {
Registry {
id_counter: 0,
targets: HashMap::new(),
}
}
pub(crate) fn get_target<'b>(&'b mut self, body: &'parse str) -> &'b String {
self.targets.entry(body).or_insert_with(|| {
self.id_counter += 1;
format!("target_{}", self.id_counter)
})
}
}

View File

@ -1,15 +1,10 @@
use crate::error::CustomError; use crate::error::CustomError;
use super::registry::Registry;
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct ISection {} pub(crate) struct ISection {}
impl ISection { impl ISection {
pub(crate) fn new( pub(crate) fn new(section: &organic::types::Section<'_>) -> Result<ISection, CustomError> {
registry: &mut Registry<'_>,
section: &organic::types::Section<'_>,
) -> Result<ISection, CustomError> {
Ok(ISection {}) Ok(ISection {})
} }
} }

View File

@ -1,23 +0,0 @@
use crate::error::CustomError;
use crate::intermediate::util::coalesce_whitespace;
use super::registry::Registry;
#[derive(Debug)]
pub(crate) struct ITarget {
pub(crate) id: String,
value: String,
}
impl ITarget {
pub(crate) fn new<'parse>(
registry: &mut Registry<'parse>,
target: &organic::types::Target<'parse>,
) -> Result<ITarget, CustomError> {
let id = registry.get_target(target.value);
Ok(ITarget {
id: id.clone(),
value: target.value.to_owned(),
})
}
}