diff --git a/default_environment/templates/html/latex_fragment.dust b/default_environment/templates/html/latex_fragment.dust index 3dfeb76..f43d4df 100644 --- a/default_environment/templates/html/latex_fragment.dust +++ b/default_environment/templates/html/latex_fragment.dust @@ -1 +1,2 @@ -!!!!!!!! latex_fragment +{! TODO: Should I be including MathJax somewhere? !} +{.value} diff --git a/org_test_documents/footnotes/reference_in_definition.org b/org_test_documents/footnote/reference_in_definition.org similarity index 100% rename from org_test_documents/footnotes/reference_in_definition.org rename to org_test_documents/footnote/reference_in_definition.org diff --git a/org_test_documents/footnotes/simple.org b/org_test_documents/footnote/simple.org similarity index 100% rename from org_test_documents/footnotes/simple.org rename to org_test_documents/footnote/simple.org diff --git a/org_test_documents/latex_fragment/notes.org b/org_test_documents/latex_fragment/notes.org new file mode 100644 index 0000000..14934df --- /dev/null +++ b/org_test_documents/latex_fragment/notes.org @@ -0,0 +1,36 @@ +* Double dollar +#+begin_src org + $$CONTENTS$$ +#+end_src +becomes +#+begin_src text + \[CONTENTS\] +#+end_src + +#+begin_src org + $$1+1=2$$ +#+end_src + +#+begin_src text + \[1+1=2\] +#+end_src + +This gets interpreted by mathjax. +* Single Dollar +#+begin_src org + PRE$BORDER1 BODY BORDER2$POST +#+end_src +becomes +#+begin_src text + \(BORDER1 BODY BORDER2\) +#+end_src + +#+begin_src org + foo$a bar b$. +#+end_src +becomes +#+begin_src text + foo\(a bar b\). +#+end_src + +This gets interpreted by mathjax. 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 }) +});