From 8695cf17c5b7bc93fd5cb00f065f2507bb4458ae Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Tue, 31 Oct 2023 19:14:36 -0400 Subject: [PATCH] Copy the value of latex fragments through the pipeline. --- src/context/comment.rs | 13 +++------ src/context/latex_fragment.rs | 29 ++++++++++++-------- src/context/macros.rs | 43 ++++++++++++++++++++++++++++++ src/context/mod.rs | 1 + src/intermediate/latex_fragment.rs | 18 +++++++++++-- 5 files changed, 81 insertions(+), 23 deletions(-) create mode 100644 src/context/macros.rs diff --git a/src/context/comment.rs b/src/context/comment.rs index db44d42..37c81ef 100644 --- a/src/context/comment.rs +++ b/src/context/comment.rs @@ -6,18 +6,11 @@ use crate::config::Config; use crate::error::CustomError; use crate::intermediate::IComment; +use super::macros::rnoop; + #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "comment")] pub(crate) struct RenderComment {} -impl RenderComment { - pub(crate) fn new( - _config: &Config, - _output_directory: &Path, - _output_file: &Path, - _comment: &IComment, - ) -> Result { - Ok(RenderComment {}) - } -} +rnoop!(RenderComment, IComment); diff --git a/src/context/latex_fragment.rs b/src/context/latex_fragment.rs index ceded7f..6226ad5 100644 --- a/src/context/latex_fragment.rs +++ b/src/context/latex_fragment.rs @@ -6,18 +6,25 @@ use crate::config::Config; use crate::error::CustomError; use crate::intermediate::ILatexFragment; +use super::macros::render; + #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "latex_fragment")] -pub(crate) struct RenderLatexFragment {} - -impl RenderLatexFragment { - pub(crate) fn new( - _config: &Config, - _output_directory: &Path, - _output_file: &Path, - _comment: &ILatexFragment, - ) -> Result { - Ok(RenderLatexFragment {}) - } +pub(crate) struct RenderLatexFragment { + value: String, } + +render!( + RenderLatexFragment, + ILatexFragment, + original, + _config, + _output_directory, + _output_file, + { + Ok(RenderLatexFragment { + value: original.value.clone(), + }) + } +); diff --git a/src/context/macros.rs b/src/context/macros.rs new file mode 100644 index 0000000..aa6bf2f --- /dev/null +++ b/src/context/macros.rs @@ -0,0 +1,43 @@ +/// Write the implementation for the render ast node. +/// +/// This exists to make changing the type signature easier. +macro_rules! render { + ($rstruct:ident, $istruct:ident, $original:ident, $config:ident, $output_directory:ident, $output_file:ident, $fnbody:tt) => { + impl $rstruct { + pub(crate) fn new( + config: &Config, + output_directory: &Path, + output_file: &Path, + original: &$istruct, + ) -> Result<$rstruct, CustomError> { + let $original = original; + let $config = config; + let $output_directory = output_directory; + let $output_file = output_file; + $fnbody + } + } + }; +} + +pub(crate) use render; + +/// Write the implementation for a render ast node that has no fields. +/// +/// This exists to make changing the type signature easier. +macro_rules! rnoop { + ($rstruct:ident, $istruct:ident) => { + impl $rstruct { + pub(crate) fn new( + _config: &Config, + _output_directory: &Path, + _output_file: &Path, + _original: &$istruct, + ) -> Result<$rstruct, CustomError> { + Ok($rstruct {}) + } + } + }; +} + +pub(crate) use rnoop; diff --git a/src/context/mod.rs b/src/context/mod.rs index 129ebca..f6203d8 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -32,6 +32,7 @@ mod keyword; mod latex_environment; mod latex_fragment; mod line_break; +mod macros; mod object; mod org_macro; mod paragraph; diff --git a/src/intermediate/latex_fragment.rs b/src/intermediate/latex_fragment.rs index d76a3a0..14721fd 100644 --- a/src/intermediate/latex_fragment.rs +++ b/src/intermediate/latex_fragment.rs @@ -1,5 +1,19 @@ -use super::macros::inoop; +use super::macros::intermediate; use crate::error::CustomError; -inoop!(ILatexFragment, LatexFragment); +#[derive(Debug, Clone)] +pub(crate) struct ILatexFragment { + pub(crate) value: String, +} + +intermediate!(ILatexFragment, LatexFragment, original, _registry, { + let value: String = if original.value.starts_with("$$") && original.value.ends_with("$$") { + format!("\\[{}\\]", &original.value[2..(original.value.len() - 2)]) + } else if original.value.starts_with("$") && original.value.ends_with("$") { + format!("\\({}\\)", &original.value[1..(original.value.len() - 1)]) + } else { + original.value.to_owned() + }; + Ok(ILatexFragment { value }) +});