Add a dependency manager for render-time actions.
This will be used for supporting things like copying static files or rendering code blocks like gnuplot or graphviz.
This commit is contained in:
parent
5cac44c625
commit
3867f965d2
4
rust-toolchain.toml
Normal file
4
rust-toolchain.toml
Normal file
@ -0,0 +1,4 @@
|
||||
[toolchain]
|
||||
channel = "nightly"
|
||||
profile = "default"
|
||||
components = ["clippy", "rustfmt"]
|
@ -7,6 +7,7 @@ use tokio::fs::DirEntry;
|
||||
use tokio::task::JoinHandle;
|
||||
|
||||
use crate::config::Config;
|
||||
use crate::context::DependencyManager;
|
||||
use crate::context::RenderBlogPostPage;
|
||||
use crate::context::RenderBlogPostPageInput;
|
||||
use crate::context::RenderBlogStream;
|
||||
@ -85,11 +86,14 @@ impl SiteRenderer {
|
||||
|
||||
for page in &self.pages {
|
||||
let output_path = self.output_directory.join(page.get_output_path());
|
||||
let dependency_manager =
|
||||
std::sync::Arc::new(std::sync::Mutex::new(DependencyManager::new()));
|
||||
let render_context = RenderContext::new(
|
||||
config,
|
||||
self.output_directory.as_path(),
|
||||
output_path.as_path(),
|
||||
None,
|
||||
dependency_manager,
|
||||
)?;
|
||||
let render_context = RenderPage::new(render_context, page)?;
|
||||
let rendered_output = renderer_integration.render(render_context)?;
|
||||
@ -113,12 +117,15 @@ impl SiteRenderer {
|
||||
.join(config.get_relative_path_to_post(&blog_post.id))
|
||||
.join(blog_post_page.get_output_path());
|
||||
|
||||
let dependency_manager =
|
||||
std::sync::Arc::new(std::sync::Mutex::new(DependencyManager::new()));
|
||||
let convert_input = RenderBlogPostPageInput::new(blog_post, blog_post_page);
|
||||
let render_context = RenderContext::new(
|
||||
config,
|
||||
self.output_directory.as_path(),
|
||||
output_path.as_path(),
|
||||
None,
|
||||
dependency_manager,
|
||||
)?;
|
||||
let render_context = RenderBlogPostPage::new(render_context, &convert_input)?;
|
||||
let rendered_output = renderer_integration.render(render_context)?;
|
||||
@ -127,6 +134,9 @@ impl SiteRenderer {
|
||||
.ok_or("Output file should have a containing directory.")?;
|
||||
tokio::fs::create_dir_all(parent_directory).await?;
|
||||
tokio::fs::write(output_path, rendered_output).await?;
|
||||
|
||||
// TODO: Copy post files to output.
|
||||
// TODO: Update link src to generate path correct for where the page is rendered.
|
||||
}
|
||||
}
|
||||
|
||||
@ -194,12 +204,15 @@ impl SiteRenderer {
|
||||
)?)
|
||||
};
|
||||
|
||||
let dependency_manager =
|
||||
std::sync::Arc::new(std::sync::Mutex::new(DependencyManager::new()));
|
||||
let convert_input = RenderBlogStreamInput::new(chunk, older_link, newer_link);
|
||||
let render_context = RenderContext::new(
|
||||
config,
|
||||
self.output_directory.as_path(),
|
||||
output_file.as_path(),
|
||||
None,
|
||||
dependency_manager,
|
||||
)?;
|
||||
let blog_stream = RenderBlogStream::new(render_context, &convert_input)?;
|
||||
|
||||
|
19
src/context/dependency_manager.rs
Normal file
19
src/context/dependency_manager.rs
Normal file
@ -0,0 +1,19 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
pub(crate) type RefDependencyManager = std::sync::Arc<std::sync::Mutex<DependencyManager>>;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct DependencyManager {
|
||||
/// A stack of paths for the files being visited.
|
||||
///
|
||||
/// The last entry is the current file being processed. This can be used for handling relative-path links.
|
||||
file_stack: Vec<PathBuf>,
|
||||
}
|
||||
|
||||
impl DependencyManager {
|
||||
pub(crate) fn new() -> Self {
|
||||
DependencyManager {
|
||||
file_stack: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
@ -11,6 +11,7 @@ mod clock;
|
||||
mod code;
|
||||
mod comment;
|
||||
mod comment_block;
|
||||
mod dependency_manager;
|
||||
mod diary_sexp;
|
||||
mod document_element;
|
||||
mod drawer;
|
||||
@ -72,6 +73,7 @@ pub(crate) use blog_post_page::RenderBlogPostPage;
|
||||
pub(crate) use blog_post_page::RenderBlogPostPageInput;
|
||||
pub(crate) use blog_stream::RenderBlogStream;
|
||||
pub(crate) use blog_stream::RenderBlogStreamInput;
|
||||
pub(crate) use dependency_manager::DependencyManager;
|
||||
pub(crate) use document_element::RenderDocumentElement;
|
||||
pub(crate) use element::RenderElement;
|
||||
pub(crate) use footnote_definition::RenderRealFootnoteDefinition;
|
||||
|
@ -3,6 +3,8 @@ use std::path::Path;
|
||||
use crate::config::Config;
|
||||
use crate::error::CustomError;
|
||||
|
||||
use super::dependency_manager::RefDependencyManager;
|
||||
|
||||
/// The supporting information used for converting the intermediate representation into the dust context for rendering.
|
||||
#[derive(Debug, Clone)]
|
||||
pub(crate) struct RenderContext<'intermediate> {
|
||||
@ -16,6 +18,13 @@ pub(crate) struct RenderContext<'intermediate> {
|
||||
/// IDs, for example, multiple blog posts with footnotes in a blog
|
||||
/// stream.
|
||||
pub(crate) id_addition: Option<&'intermediate str>,
|
||||
|
||||
/// Tracks dependencies from rendering Org document(s).
|
||||
///
|
||||
/// Examples of dependencies would be:
|
||||
/// - Static files that need to be copied to the output folder
|
||||
/// - Code blocks that need to be executed (for example, gnuplot graphs)
|
||||
pub(crate) dependency_manager: RefDependencyManager,
|
||||
}
|
||||
|
||||
impl<'intermediate> RenderContext<'intermediate> {
|
||||
@ -24,12 +33,14 @@ impl<'intermediate> RenderContext<'intermediate> {
|
||||
output_directory: &'intermediate Path,
|
||||
output_file: &'intermediate Path,
|
||||
id_addition: Option<&'intermediate str>,
|
||||
dependency_manager: RefDependencyManager,
|
||||
) -> Result<RenderContext<'intermediate>, CustomError> {
|
||||
Ok(RenderContext {
|
||||
config,
|
||||
output_root_directory: output_directory,
|
||||
output_file,
|
||||
id_addition,
|
||||
dependency_manager,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user