From 52ca300de3e52b01ff55167c6b59f4cd4ed9174c Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 12:06:40 -0400 Subject: [PATCH 01/24] Beginning to hand out footnote ids. --- .../templates/html/footnote_reference.dust | 2 +- org_test_documents/footnote_definitions.org | 25 ++++++++++++ src/intermediate/footnote_reference.rs | 7 +++- src/intermediate/registry.rs | 39 ++++++++++++++++++- 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 org_test_documents/footnote_definitions.org diff --git a/default_environment/templates/html/footnote_reference.dust b/default_environment/templates/html/footnote_reference.dust index ae1f616..a218064 100644 --- a/default_environment/templates/html/footnote_reference.dust +++ b/default_environment/templates/html/footnote_reference.dust @@ -1 +1 @@ -!!!!!!!! footnote_reference +{.label} diff --git a/org_test_documents/footnote_definitions.org b/org_test_documents/footnote_definitions.org new file mode 100644 index 0000000..8a15e71 --- /dev/null +++ b/org_test_documents/footnote_definitions.org @@ -0,0 +1,25 @@ +# Test proves that: +# +# - Anonymous references with identical content get unique IDs. +# - Unreferenced footnote definitions are dropped. +# - Footnote definitions that come before their first reference are dropped. + +foo[fn:2:something] + +bar[fn::something] + +baz[fn::something] + +cat[fn::something] + +dog[fn:3] + +[fn:3] ipsum + +[fn:4] lorem + +[fn:3] dolar + +[fn:5] not referenced + +stuff[fn:4] and things diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index cb393c2..b660a9c 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -3,13 +3,16 @@ use crate::error::CustomError; use super::registry::Registry; #[derive(Debug)] -pub(crate) struct IFootnoteReference {} +pub(crate) struct IFootnoteReference { + footnote_id: usize, +} impl IFootnoteReference { pub(crate) async fn new<'parse>( registry: &mut Registry<'parse>, original: &organic::types::FootnoteReference<'parse>, ) -> Result { - Ok(IFootnoteReference {}) + let footnote_id = registry.get_footnote_reference_id(original.label, &original.definition); + Ok(IFootnoteReference { footnote_id }) } } diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index d53e2ba..b7988d2 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -1,10 +1,13 @@ use std::collections::HashMap; +use organic::types::Object; + type IdCounter = u16; -pub(crate) struct Registry<'parse> { +pub(crate) struct Registry<'intermediate, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, + footnote_ids: Vec<(Option<&'parse str>, &Vec>)>, } impl<'parse> Registry<'parse> { @@ -12,6 +15,7 @@ impl<'parse> Registry<'parse> { Registry { id_counter: 0, targets: HashMap::new(), + footnote_ids: Vec::new(), } } @@ -21,4 +25,37 @@ impl<'parse> Registry<'parse> { format!("target_{}", self.id_counter) }) } + + /// Get a 0-indexed ID for a footnote. + /// + /// This needs to be incremented to be 1-indexed for render. + pub(crate) fn get_footnote_reference_id<'b>( + &'b mut self, + label: Option<&'parse str>, + definition: &'parse Vec>, + ) -> usize { + if let None = label { + // If it has no label then it must always get a new ID. + self.footnote_ids.push((None, definition)); + return self.footnote_ids.len(); + } + + if let Some(existing_id) = self + .footnote_ids + .iter() + .position(|(id, _definition)| *id == label) + { + if !definition.is_empty() { + let entry = self + .footnote_ids + .get_mut(existing_id) + .expect("If-statement proves this to be Some."); + entry.1 = definition; + } + existing_id + } else { + self.footnote_ids.push((label, definition)); + self.footnote_ids.len() + } + } } From cb7c28c1aeace589a848e225a2db1fd2cf128335 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 12:15:07 -0400 Subject: [PATCH 02/24] Add intermediate lifetime. --- src/intermediate/angle_link.rs | 4 ++-- src/intermediate/babel_call.rs | 4 ++-- src/intermediate/bold.rs | 4 ++-- src/intermediate/center_block.rs | 4 ++-- src/intermediate/citation.rs | 4 ++-- src/intermediate/citation_reference.rs | 4 ++-- src/intermediate/clock.rs | 4 ++-- src/intermediate/code.rs | 4 ++-- src/intermediate/comment.rs | 4 ++-- src/intermediate/comment_block.rs | 4 ++-- src/intermediate/diary_sexp.rs | 4 ++-- src/intermediate/document_element.rs | 6 +++--- src/intermediate/drawer.rs | 4 ++-- src/intermediate/dynamic_block.rs | 4 ++-- src/intermediate/element.rs | 6 +++--- src/intermediate/entity.rs | 4 ++-- src/intermediate/example_block.rs | 4 ++-- src/intermediate/export_block.rs | 4 ++-- src/intermediate/export_snippet.rs | 4 ++-- src/intermediate/fixed_width_area.rs | 4 ++-- src/intermediate/footnote_definition.rs | 4 ++-- src/intermediate/footnote_reference.rs | 6 +++--- src/intermediate/heading.rs | 12 ++++++------ src/intermediate/horizontal_rule.rs | 4 ++-- src/intermediate/inline_babel_call.rs | 4 ++-- src/intermediate/inline_source_block.rs | 4 ++-- src/intermediate/italic.rs | 4 ++-- src/intermediate/keyword.rs | 4 ++-- src/intermediate/latex_environment.rs | 4 ++-- src/intermediate/latex_fragment.rs | 4 ++-- src/intermediate/line_break.rs | 4 ++-- src/intermediate/object.rs | 6 +++--- src/intermediate/org_macro.rs | 4 ++-- src/intermediate/page.rs | 6 +++--- src/intermediate/paragraph.rs | 8 ++++---- src/intermediate/plain_link.rs | 4 ++-- src/intermediate/plain_list.rs | 10 +++++----- src/intermediate/plain_list_item.rs | 10 +++++----- src/intermediate/plain_text.rs | 4 ++-- src/intermediate/planning.rs | 4 ++-- src/intermediate/property_drawer.rs | 4 ++-- src/intermediate/quote_block.rs | 6 +++--- src/intermediate/radio_link.rs | 4 ++-- src/intermediate/radio_target.rs | 4 ++-- src/intermediate/registry.rs | 8 ++++---- src/intermediate/regular_link.rs | 6 +++--- src/intermediate/section.rs | 6 +++--- src/intermediate/special_block.rs | 4 ++-- src/intermediate/src_block.rs | 4 ++-- src/intermediate/statistics_cookie.rs | 4 ++-- src/intermediate/strike_through.rs | 4 ++-- src/intermediate/subscript.rs | 4 ++-- src/intermediate/superscript.rs | 4 ++-- src/intermediate/table.rs | 4 ++-- src/intermediate/target.rs | 4 ++-- src/intermediate/timestamp.rs | 4 ++-- src/intermediate/underline.rs | 4 ++-- src/intermediate/verbatim.rs | 4 ++-- src/intermediate/verse_block.rs | 4 ++-- 59 files changed, 140 insertions(+), 140 deletions(-) diff --git a/src/intermediate/angle_link.rs b/src/intermediate/angle_link.rs index bd84243..5cd2cd1 100644 --- a/src/intermediate/angle_link.rs +++ b/src/intermediate/angle_link.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IAngleLink {} impl IAngleLink { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::AngleLink<'parse>, ) -> Result { Ok(IAngleLink {}) diff --git a/src/intermediate/babel_call.rs b/src/intermediate/babel_call.rs index a8d542c..6414178 100644 --- a/src/intermediate/babel_call.rs +++ b/src/intermediate/babel_call.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IBabelCall {} impl IBabelCall { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::BabelCall<'parse>, ) -> Result { Ok(IBabelCall {}) diff --git a/src/intermediate/bold.rs b/src/intermediate/bold.rs index c00f94b..d6dc019 100644 --- a/src/intermediate/bold.rs +++ b/src/intermediate/bold.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IBold {} impl IBold { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Bold<'parse>, ) -> Result { Ok(IBold {}) diff --git a/src/intermediate/center_block.rs b/src/intermediate/center_block.rs index 2e4d777..4f104aa 100644 --- a/src/intermediate/center_block.rs +++ b/src/intermediate/center_block.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ICenterBlock {} impl ICenterBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::CenterBlock<'parse>, ) -> Result { Ok(ICenterBlock {}) diff --git a/src/intermediate/citation.rs b/src/intermediate/citation.rs index 1209241..70902b9 100644 --- a/src/intermediate/citation.rs +++ b/src/intermediate/citation.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ICitation {} impl ICitation { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Citation<'parse>, ) -> Result { Ok(ICitation {}) diff --git a/src/intermediate/citation_reference.rs b/src/intermediate/citation_reference.rs index 1030158..ebcbe70 100644 --- a/src/intermediate/citation_reference.rs +++ b/src/intermediate/citation_reference.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ICitationReference {} impl ICitationReference { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::CitationReference<'parse>, ) -> Result { Ok(ICitationReference {}) diff --git a/src/intermediate/clock.rs b/src/intermediate/clock.rs index 5f3b8eb..1dddb04 100644 --- a/src/intermediate/clock.rs +++ b/src/intermediate/clock.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IClock {} impl IClock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Clock<'parse>, ) -> Result { Ok(IClock {}) diff --git a/src/intermediate/code.rs b/src/intermediate/code.rs index 6a137ba..e2da068 100644 --- a/src/intermediate/code.rs +++ b/src/intermediate/code.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ICode {} impl ICode { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Code<'parse>, ) -> Result { Ok(ICode {}) diff --git a/src/intermediate/comment.rs b/src/intermediate/comment.rs index 70649f2..d79837a 100644 --- a/src/intermediate/comment.rs +++ b/src/intermediate/comment.rs @@ -7,8 +7,8 @@ use super::registry::Registry; pub(crate) struct IComment {} impl IComment { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, comment: &organic::types::Comment<'parse>, ) -> Result { Ok(IComment {}) diff --git a/src/intermediate/comment_block.rs b/src/intermediate/comment_block.rs index 71602eb..0e085d8 100644 --- a/src/intermediate/comment_block.rs +++ b/src/intermediate/comment_block.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ICommentBlock {} impl ICommentBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::CommentBlock<'parse>, ) -> Result { Ok(ICommentBlock {}) diff --git a/src/intermediate/diary_sexp.rs b/src/intermediate/diary_sexp.rs index 5f4d4a4..9c66cff 100644 --- a/src/intermediate/diary_sexp.rs +++ b/src/intermediate/diary_sexp.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IDiarySexp {} impl IDiarySexp { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::DiarySexp<'parse>, ) -> Result { Ok(IDiarySexp {}) diff --git a/src/intermediate/document_element.rs b/src/intermediate/document_element.rs index d348269..9f4b488 100644 --- a/src/intermediate/document_element.rs +++ b/src/intermediate/document_element.rs @@ -12,9 +12,9 @@ pub(crate) enum IDocumentElement { } impl IDocumentElement { - pub(crate) fn new<'parse, 'b>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::DocumentElement<'parse>, + pub(crate) fn new<'intermediate, 'parse, 'b>( + registry: &'b mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::DocumentElement<'parse>, ) -> BoxFuture<'b, Result> { async move { match original { diff --git a/src/intermediate/drawer.rs b/src/intermediate/drawer.rs index b55fd71..0572ae5 100644 --- a/src/intermediate/drawer.rs +++ b/src/intermediate/drawer.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IDrawer {} impl IDrawer { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Drawer<'parse>, ) -> Result { Ok(IDrawer {}) diff --git a/src/intermediate/dynamic_block.rs b/src/intermediate/dynamic_block.rs index 6086e9d..4a8180b 100644 --- a/src/intermediate/dynamic_block.rs +++ b/src/intermediate/dynamic_block.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IDynamicBlock {} impl IDynamicBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::DynamicBlock<'parse>, ) -> Result { Ok(IDynamicBlock {}) diff --git a/src/intermediate/element.rs b/src/intermediate/element.rs index 1fe3360..1d81943 100644 --- a/src/intermediate/element.rs +++ b/src/intermediate/element.rs @@ -56,9 +56,9 @@ pub(crate) enum IElement { } impl IElement { - pub(crate) fn new<'parse, 'b>( - registry: &'b mut Registry<'parse>, - elem: &'b organic::types::Element<'parse>, + pub(crate) fn new<'intermediate, 'parse, 'b>( + registry: &'b mut Registry<'intermediate, 'parse>, + elem: &'intermediate organic::types::Element<'parse>, ) -> BoxFuture<'b, Result> { async move { match elem { diff --git a/src/intermediate/entity.rs b/src/intermediate/entity.rs index 088a8e5..547ed0e 100644 --- a/src/intermediate/entity.rs +++ b/src/intermediate/entity.rs @@ -8,8 +8,8 @@ pub(crate) struct IEntity { } impl IEntity { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Entity<'parse>, ) -> Result { Ok(IEntity { diff --git a/src/intermediate/example_block.rs b/src/intermediate/example_block.rs index 2c65752..8fda94e 100644 --- a/src/intermediate/example_block.rs +++ b/src/intermediate/example_block.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IExampleBlock {} impl IExampleBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::ExampleBlock<'parse>, ) -> Result { Ok(IExampleBlock {}) diff --git a/src/intermediate/export_block.rs b/src/intermediate/export_block.rs index ff24258..4915e2d 100644 --- a/src/intermediate/export_block.rs +++ b/src/intermediate/export_block.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IExportBlock {} impl IExportBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::ExportBlock<'parse>, ) -> Result { Ok(IExportBlock {}) diff --git a/src/intermediate/export_snippet.rs b/src/intermediate/export_snippet.rs index 6a2c331..ceb30e1 100644 --- a/src/intermediate/export_snippet.rs +++ b/src/intermediate/export_snippet.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IExportSnippet {} impl IExportSnippet { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::ExportSnippet<'parse>, ) -> Result { Ok(IExportSnippet {}) diff --git a/src/intermediate/fixed_width_area.rs b/src/intermediate/fixed_width_area.rs index 6cdf376..cc6e769 100644 --- a/src/intermediate/fixed_width_area.rs +++ b/src/intermediate/fixed_width_area.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IFixedWidthArea {} impl IFixedWidthArea { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::FixedWidthArea<'parse>, ) -> Result { Ok(IFixedWidthArea {}) diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index 35964bb..601472b 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IFootnoteDefinition {} impl IFootnoteDefinition { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::FootnoteDefinition<'parse>, ) -> Result { Ok(IFootnoteDefinition {}) diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index b660a9c..1ca4575 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -8,9 +8,9 @@ pub(crate) struct IFootnoteReference { } impl IFootnoteReference { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - original: &organic::types::FootnoteReference<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::FootnoteReference<'parse>, ) -> Result { let footnote_id = registry.get_footnote_reference_id(original.label, &original.definition); Ok(IFootnoteReference { footnote_id }) diff --git a/src/intermediate/heading.rs b/src/intermediate/heading.rs index 4ed510e..49e4f0b 100644 --- a/src/intermediate/heading.rs +++ b/src/intermediate/heading.rs @@ -12,27 +12,27 @@ pub(crate) struct IHeading { } impl IHeading { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - heading: &organic::types::Heading<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::Heading<'parse>, ) -> Result { let title = { let mut ret = Vec::new(); - for obj in heading.title.iter() { + for obj in original.title.iter() { ret.push(IObject::new(registry, obj).await?); } ret }; let children = { let mut ret = Vec::new(); - for obj in heading.children.iter() { + for obj in original.children.iter() { ret.push(IDocumentElement::new(registry, obj).await?); } ret }; Ok(IHeading { title, - level: heading.level, + level: original.level, children, }) } diff --git a/src/intermediate/horizontal_rule.rs b/src/intermediate/horizontal_rule.rs index 0be08c6..6e8b8e5 100644 --- a/src/intermediate/horizontal_rule.rs +++ b/src/intermediate/horizontal_rule.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IHorizontalRule {} impl IHorizontalRule { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::HorizontalRule<'parse>, ) -> Result { Ok(IHorizontalRule {}) diff --git a/src/intermediate/inline_babel_call.rs b/src/intermediate/inline_babel_call.rs index 874f5c4..956a5f0 100644 --- a/src/intermediate/inline_babel_call.rs +++ b/src/intermediate/inline_babel_call.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IInlineBabelCall {} impl IInlineBabelCall { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::InlineBabelCall<'parse>, ) -> Result { Ok(IInlineBabelCall {}) diff --git a/src/intermediate/inline_source_block.rs b/src/intermediate/inline_source_block.rs index 29071b3..48d5bf7 100644 --- a/src/intermediate/inline_source_block.rs +++ b/src/intermediate/inline_source_block.rs @@ -8,8 +8,8 @@ pub(crate) struct IInlineSourceBlock { } impl IInlineSourceBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::InlineSourceBlock<'parse>, ) -> Result { Ok(IInlineSourceBlock { diff --git a/src/intermediate/italic.rs b/src/intermediate/italic.rs index 79ce541..e71048c 100644 --- a/src/intermediate/italic.rs +++ b/src/intermediate/italic.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IItalic {} impl IItalic { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Italic<'parse>, ) -> Result { Ok(IItalic {}) diff --git a/src/intermediate/keyword.rs b/src/intermediate/keyword.rs index bd26939..8ec3df7 100644 --- a/src/intermediate/keyword.rs +++ b/src/intermediate/keyword.rs @@ -7,8 +7,8 @@ use super::registry::Registry; pub(crate) struct IKeyword {} impl IKeyword { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, keyword: &organic::types::Keyword<'parse>, ) -> Result { Ok(IKeyword {}) diff --git a/src/intermediate/latex_environment.rs b/src/intermediate/latex_environment.rs index c6ccaac..1370d48 100644 --- a/src/intermediate/latex_environment.rs +++ b/src/intermediate/latex_environment.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ILatexEnvironment {} impl ILatexEnvironment { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::LatexEnvironment<'parse>, ) -> Result { Ok(ILatexEnvironment {}) diff --git a/src/intermediate/latex_fragment.rs b/src/intermediate/latex_fragment.rs index bf8d2af..b1c069a 100644 --- a/src/intermediate/latex_fragment.rs +++ b/src/intermediate/latex_fragment.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ILatexFragment {} impl ILatexFragment { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::LatexFragment<'parse>, ) -> Result { Ok(ILatexFragment {}) diff --git a/src/intermediate/line_break.rs b/src/intermediate/line_break.rs index da94610..f0869ac 100644 --- a/src/intermediate/line_break.rs +++ b/src/intermediate/line_break.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ILineBreak {} impl ILineBreak { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::LineBreak<'parse>, ) -> Result { Ok(ILineBreak {}) diff --git a/src/intermediate/object.rs b/src/intermediate/object.rs index c51584a..67dad58 100644 --- a/src/intermediate/object.rs +++ b/src/intermediate/object.rs @@ -62,9 +62,9 @@ pub(crate) enum IObject { } impl IObject { - pub(crate) fn new<'parse, 'b>( - registry: &'b mut Registry<'parse>, - obj: &'b organic::types::Object<'parse>, + pub(crate) fn new<'intermediate, 'parse, 'b>( + registry: &'b mut Registry<'intermediate, 'parse>, + obj: &'intermediate organic::types::Object<'parse>, ) -> BoxFuture<'b, Result> { async move { match obj { diff --git a/src/intermediate/org_macro.rs b/src/intermediate/org_macro.rs index 328d89a..2c0fa4e 100644 --- a/src/intermediate/org_macro.rs +++ b/src/intermediate/org_macro.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IOrgMacro {} impl IOrgMacro { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::OrgMacro<'parse>, ) -> Result { Ok(IOrgMacro {}) diff --git a/src/intermediate/page.rs b/src/intermediate/page.rs index c512d46..ba2f754 100644 --- a/src/intermediate/page.rs +++ b/src/intermediate/page.rs @@ -18,10 +18,10 @@ pub(crate) struct BlogPostPage { } impl BlogPostPage { - pub(crate) async fn new<'parse, P: Into>( + pub(crate) async fn new<'intermediate, 'parse, P: Into>( path: P, - registry: &mut Registry<'parse>, - document: &organic::types::Document<'parse>, + registry: &mut Registry<'intermediate, 'parse>, + document: &'intermediate organic::types::Document<'parse>, ) -> Result { let path = path.into(); let mut children = Vec::new(); diff --git a/src/intermediate/paragraph.rs b/src/intermediate/paragraph.rs index 09cf1be..9536190 100644 --- a/src/intermediate/paragraph.rs +++ b/src/intermediate/paragraph.rs @@ -9,13 +9,13 @@ pub(crate) struct IParagraph { } impl IParagraph { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - paragraph: &organic::types::Paragraph<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::Paragraph<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); - for obj in paragraph.children.iter() { + for obj in original.children.iter() { ret.push(IObject::new(registry, obj).await?); } ret diff --git a/src/intermediate/plain_link.rs b/src/intermediate/plain_link.rs index 8e702ed..9c3ec4c 100644 --- a/src/intermediate/plain_link.rs +++ b/src/intermediate/plain_link.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IPlainLink {} impl IPlainLink { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::PlainLink<'parse>, ) -> Result { Ok(IPlainLink {}) diff --git a/src/intermediate/plain_list.rs b/src/intermediate/plain_list.rs index 2065403..71ec77e 100644 --- a/src/intermediate/plain_list.rs +++ b/src/intermediate/plain_list.rs @@ -10,20 +10,20 @@ pub(crate) struct IPlainList { } impl IPlainList { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - plain_list: &organic::types::PlainList<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::PlainList<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); - for obj in plain_list.children.iter() { + for obj in original.children.iter() { ret.push(IPlainListItem::new(registry, obj).await?); } ret }; Ok(IPlainList { - list_type: plain_list.list_type, + list_type: original.list_type, children, }) } diff --git a/src/intermediate/plain_list_item.rs b/src/intermediate/plain_list_item.rs index 8a77b9a..0554db7 100644 --- a/src/intermediate/plain_list_item.rs +++ b/src/intermediate/plain_list_item.rs @@ -11,13 +11,13 @@ pub(crate) struct IPlainListItem { } impl IPlainListItem { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - plain_list_item: &organic::types::PlainListItem<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::PlainListItem<'parse>, ) -> Result { let tag = { let mut ret = Vec::new(); - for obj in plain_list_item.tag.iter() { + for obj in original.tag.iter() { ret.push(IObject::new(registry, obj).await?); } ret @@ -25,7 +25,7 @@ impl IPlainListItem { let children = { let mut ret = Vec::new(); - for elem in plain_list_item.children.iter() { + for elem in original.children.iter() { ret.push(IElement::new(registry, elem).await?); } ret diff --git a/src/intermediate/plain_text.rs b/src/intermediate/plain_text.rs index d8d5558..3be73ac 100644 --- a/src/intermediate/plain_text.rs +++ b/src/intermediate/plain_text.rs @@ -9,8 +9,8 @@ pub(crate) struct IPlainText { } impl IPlainText { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, plain_text: &organic::types::PlainText<'parse>, ) -> Result { Ok(IPlainText { diff --git a/src/intermediate/planning.rs b/src/intermediate/planning.rs index d34c607..063fb86 100644 --- a/src/intermediate/planning.rs +++ b/src/intermediate/planning.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IPlanning {} impl IPlanning { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Planning<'parse>, ) -> Result { Ok(IPlanning {}) diff --git a/src/intermediate/property_drawer.rs b/src/intermediate/property_drawer.rs index 422ab0d..0bb7e96 100644 --- a/src/intermediate/property_drawer.rs +++ b/src/intermediate/property_drawer.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IPropertyDrawer {} impl IPropertyDrawer { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::PropertyDrawer<'parse>, ) -> Result { Ok(IPropertyDrawer {}) diff --git a/src/intermediate/quote_block.rs b/src/intermediate/quote_block.rs index 7d471b2..504cecd 100644 --- a/src/intermediate/quote_block.rs +++ b/src/intermediate/quote_block.rs @@ -9,9 +9,9 @@ pub(crate) struct IQuoteBlock { } impl IQuoteBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - original: &organic::types::QuoteBlock<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::QuoteBlock<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/radio_link.rs b/src/intermediate/radio_link.rs index 6886169..8303fb4 100644 --- a/src/intermediate/radio_link.rs +++ b/src/intermediate/radio_link.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IRadioLink {} impl IRadioLink { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::RadioLink<'parse>, ) -> Result { Ok(IRadioLink {}) diff --git a/src/intermediate/radio_target.rs b/src/intermediate/radio_target.rs index 4077c29..e89238a 100644 --- a/src/intermediate/radio_target.rs +++ b/src/intermediate/radio_target.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IRadioTarget {} impl IRadioTarget { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::RadioTarget<'parse>, ) -> Result { Ok(IRadioTarget {}) diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index b7988d2..9996893 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -7,11 +7,11 @@ type IdCounter = u16; pub(crate) struct Registry<'intermediate, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, - footnote_ids: Vec<(Option<&'parse str>, &Vec>)>, + footnote_ids: Vec<(Option<&'parse str>, &'intermediate Vec>)>, } -impl<'parse> Registry<'parse> { - pub(crate) fn new() -> Registry<'parse> { +impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { + pub(crate) fn new() -> Registry<'intermediate, 'parse> { Registry { id_counter: 0, targets: HashMap::new(), @@ -32,7 +32,7 @@ impl<'parse> Registry<'parse> { pub(crate) fn get_footnote_reference_id<'b>( &'b mut self, label: Option<&'parse str>, - definition: &'parse Vec>, + definition: &'intermediate Vec>, ) -> usize { if let None = label { // If it has no label then it must always get a new ID. diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index af1413c..4c513b9 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -10,9 +10,9 @@ pub(crate) struct IRegularLink { } impl IRegularLink { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - original: &organic::types::RegularLink<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + original: &'intermediate organic::types::RegularLink<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/section.rs b/src/intermediate/section.rs index c9426e6..9a73485 100644 --- a/src/intermediate/section.rs +++ b/src/intermediate/section.rs @@ -9,9 +9,9 @@ pub(crate) struct ISection { } impl ISection { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, - section: &organic::types::Section<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + section: &'intermediate organic::types::Section<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/special_block.rs b/src/intermediate/special_block.rs index 252c347..8e14fc4 100644 --- a/src/intermediate/special_block.rs +++ b/src/intermediate/special_block.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ISpecialBlock {} impl ISpecialBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::SpecialBlock<'parse>, ) -> Result { Ok(ISpecialBlock {}) diff --git a/src/intermediate/src_block.rs b/src/intermediate/src_block.rs index c54dc4a..868c653 100644 --- a/src/intermediate/src_block.rs +++ b/src/intermediate/src_block.rs @@ -8,8 +8,8 @@ pub(crate) struct ISrcBlock { } impl ISrcBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::SrcBlock<'parse>, ) -> Result { let lines = original diff --git a/src/intermediate/statistics_cookie.rs b/src/intermediate/statistics_cookie.rs index e9f8043..455373e 100644 --- a/src/intermediate/statistics_cookie.rs +++ b/src/intermediate/statistics_cookie.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IStatisticsCookie {} impl IStatisticsCookie { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::StatisticsCookie<'parse>, ) -> Result { Ok(IStatisticsCookie {}) diff --git a/src/intermediate/strike_through.rs b/src/intermediate/strike_through.rs index 5609432..5b8c9e3 100644 --- a/src/intermediate/strike_through.rs +++ b/src/intermediate/strike_through.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IStrikeThrough {} impl IStrikeThrough { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::StrikeThrough<'parse>, ) -> Result { Ok(IStrikeThrough {}) diff --git a/src/intermediate/subscript.rs b/src/intermediate/subscript.rs index 60f41c5..d99fe81 100644 --- a/src/intermediate/subscript.rs +++ b/src/intermediate/subscript.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ISubscript {} impl ISubscript { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Subscript<'parse>, ) -> Result { Ok(ISubscript {}) diff --git a/src/intermediate/superscript.rs b/src/intermediate/superscript.rs index 2293347..50b6eca 100644 --- a/src/intermediate/superscript.rs +++ b/src/intermediate/superscript.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ISuperscript {} impl ISuperscript { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Superscript<'parse>, ) -> Result { Ok(ISuperscript {}) diff --git a/src/intermediate/table.rs b/src/intermediate/table.rs index 2ce2814..2a94c16 100644 --- a/src/intermediate/table.rs +++ b/src/intermediate/table.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ITable {} impl ITable { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Table<'parse>, ) -> Result { Ok(ITable {}) diff --git a/src/intermediate/target.rs b/src/intermediate/target.rs index 1a594de..d5cefe6 100644 --- a/src/intermediate/target.rs +++ b/src/intermediate/target.rs @@ -10,8 +10,8 @@ pub(crate) struct ITarget { } impl ITarget { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, target: &organic::types::Target<'parse>, ) -> Result { let id = registry.get_target(target.value); diff --git a/src/intermediate/timestamp.rs b/src/intermediate/timestamp.rs index db8d307..bb4ff38 100644 --- a/src/intermediate/timestamp.rs +++ b/src/intermediate/timestamp.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct ITimestamp {} impl ITimestamp { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Timestamp<'parse>, ) -> Result { Ok(ITimestamp {}) diff --git a/src/intermediate/underline.rs b/src/intermediate/underline.rs index 4d147a4..31a5e28 100644 --- a/src/intermediate/underline.rs +++ b/src/intermediate/underline.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IUnderline {} impl IUnderline { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Underline<'parse>, ) -> Result { Ok(IUnderline {}) diff --git a/src/intermediate/verbatim.rs b/src/intermediate/verbatim.rs index e9a2d01..e93e015 100644 --- a/src/intermediate/verbatim.rs +++ b/src/intermediate/verbatim.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IVerbatim {} impl IVerbatim { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::Verbatim<'parse>, ) -> Result { Ok(IVerbatim {}) diff --git a/src/intermediate/verse_block.rs b/src/intermediate/verse_block.rs index 3c8626d..9f14fc0 100644 --- a/src/intermediate/verse_block.rs +++ b/src/intermediate/verse_block.rs @@ -6,8 +6,8 @@ use super::registry::Registry; pub(crate) struct IVerseBlock {} impl IVerseBlock { - pub(crate) async fn new<'parse>( - registry: &mut Registry<'parse>, + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, original: &organic::types::VerseBlock<'parse>, ) -> Result { Ok(IVerseBlock {}) From 795945f0da5d68dd2fa35dcd888e229997a58733 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 12:31:48 -0400 Subject: [PATCH 03/24] Register footnote definitions. --- src/intermediate/footnote_definition.rs | 3 ++- src/intermediate/registry.rs | 35 ++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index 601472b..f6da6c3 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -8,8 +8,9 @@ pub(crate) struct IFootnoteDefinition {} impl IFootnoteDefinition { pub(crate) async fn new<'intermediate, 'parse>( registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::FootnoteDefinition<'parse>, + original: &'intermediate organic::types::FootnoteDefinition<'parse>, ) -> Result { + registry.register_footnote_definition(original.label, &original.children); Ok(IFootnoteDefinition {}) } } diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 9996893..70bb158 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; +use organic::types::Element; use organic::types::Object; type IdCounter = u16; @@ -7,7 +8,10 @@ type IdCounter = u16; pub(crate) struct Registry<'intermediate, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, - footnote_ids: Vec<(Option<&'parse str>, &'intermediate Vec>)>, + footnote_ids: Vec<( + Option<&'parse str>, + FootnoteDefinitionContents<'intermediate, 'parse>, + )>, } impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { @@ -36,7 +40,8 @@ impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { ) -> usize { if let None = label { // If it has no label then it must always get a new ID. - self.footnote_ids.push((None, definition)); + self.footnote_ids + .push((None, FootnoteDefinitionContents::FromReference(definition))); return self.footnote_ids.len(); } @@ -50,12 +55,34 @@ impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { .footnote_ids .get_mut(existing_id) .expect("If-statement proves this to be Some."); - entry.1 = definition; + entry.1 = FootnoteDefinitionContents::FromReference(definition); } existing_id } else { - self.footnote_ids.push((label, definition)); + self.footnote_ids + .push((label, FootnoteDefinitionContents::FromReference(definition))); self.footnote_ids.len() } } + + /// Update the definition to a footnote but do not mark it as referenced. + pub(crate) fn register_footnote_definition<'b>( + &'b mut self, + label: &'parse str, + definition: &'intermediate Vec>, + ) { + if let Some((existing_id, existing_definition)) = self + .footnote_ids + .iter_mut() + .find(|(id, _definition)| *id == Some(label)) + { + *existing_definition = FootnoteDefinitionContents::FromDefinition(definition); + } + } +} + +#[derive(Debug)] +pub(crate) enum FootnoteDefinitionContents<'intermediate, 'parse> { + FromReference(&'intermediate Vec>), + FromDefinition(&'intermediate Vec>), } From cd27869122a4193fc74e3f94874902c7e113c371 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 12:53:28 -0400 Subject: [PATCH 04/24] Populate render context for footnote references. --- src/context/footnote_reference.rs | 14 +++++++++--- src/intermediate/footnote_reference.rs | 30 +++++++++++++++++++++++++- src/intermediate/registry.rs | 4 ++-- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/context/footnote_reference.rs b/src/context/footnote_reference.rs index 300517e..11d1622 100644 --- a/src/context/footnote_reference.rs +++ b/src/context/footnote_reference.rs @@ -9,15 +9,23 @@ use crate::intermediate::IFootnoteReference; #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "footnote_reference")] -pub(crate) struct RenderFootnoteReference {} +pub(crate) struct RenderFootnoteReference { + reference_id: String, + definition_link: String, + label: String, +} impl RenderFootnoteReference { pub(crate) fn new( config: &Config, output_directory: &Path, output_file: &Path, - comment: &IFootnoteReference, + original: &IFootnoteReference, ) -> Result { - Ok(RenderFootnoteReference {}) + Ok(RenderFootnoteReference { + reference_id: original.get_reference_id(), + definition_link: format!("#{}", original.get_definition_id()), + label: original.get_display_label(), + }) } } diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index 1ca4575..e5686c2 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -5,6 +5,7 @@ use super::registry::Registry; #[derive(Debug)] pub(crate) struct IFootnoteReference { footnote_id: usize, + duplicate_offset: usize, } impl IFootnoteReference { @@ -13,6 +14,33 @@ impl IFootnoteReference { original: &'intermediate organic::types::FootnoteReference<'parse>, ) -> Result { let footnote_id = registry.get_footnote_reference_id(original.label, &original.definition); - Ok(IFootnoteReference { footnote_id }) + Ok(IFootnoteReference { + footnote_id, + duplicate_offset: 0, // TODO + }) + } + + pub(crate) fn get_display_label(&self) -> String { + format!("{}", self.footnote_id + 1) + } + + /// Get an ID to refer to this footnote reference. + /// + /// This ID could, for example, be used for the id attribute in HTML for the reference anchor tag. + pub(crate) fn get_reference_id(&self) -> String { + if self.duplicate_offset == 0 { + format!("fnr.{}", self.get_display_label()) + } else { + // Org-mode makes all duplicates use "100" but I figure there is no harm in giving each a unique ID. + let append = 100 + self.duplicate_offset; + format!("fnr.{}.{}", self.get_display_label(), append) + } + } + + /// Get an ID to refer to the footnote definition this footnote reference references. + /// + /// This ID could, for example, be used for the id attribute in HTML for the definition anchor tag. + pub(crate) fn get_definition_id(&self) -> String { + format!("fn.{}", self.get_display_label()) } } diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 70bb158..a56cbc6 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -42,7 +42,7 @@ impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { // If it has no label then it must always get a new ID. self.footnote_ids .push((None, FootnoteDefinitionContents::FromReference(definition))); - return self.footnote_ids.len(); + return self.footnote_ids.len() - 1; } if let Some(existing_id) = self @@ -61,7 +61,7 @@ impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { } else { self.footnote_ids .push((label, FootnoteDefinitionContents::FromReference(definition))); - self.footnote_ids.len() + self.footnote_ids.len() - 1 } } From 61099029453cccf8cfe2c2dc3108a4e0131f3baf Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 13:51:32 -0400 Subject: [PATCH 05/24] Create an intermediate ast node type. --- src/intermediate/ast_node.rs | 322 ++++++++++++++++++++++++ src/intermediate/definition.rs | 26 +- src/intermediate/footnote_definition.rs | 45 ++++ src/intermediate/mod.rs | 1 + src/intermediate/page.rs | 6 + src/intermediate/registry.rs | 7 +- 6 files changed, 389 insertions(+), 18 deletions(-) create mode 100644 src/intermediate/ast_node.rs diff --git a/src/intermediate/ast_node.rs b/src/intermediate/ast_node.rs new file mode 100644 index 0000000..da23f24 --- /dev/null +++ b/src/intermediate/ast_node.rs @@ -0,0 +1,322 @@ +use super::angle_link::IAngleLink; +use super::bold::IBold; +use super::citation::ICitation; +use super::citation_reference::ICitationReference; +use super::code::ICode; +use super::comment::IComment; +use super::entity::IEntity; +use super::export_snippet::IExportSnippet; +use super::footnote_reference::IFootnoteReference; +use super::inline_babel_call::IInlineBabelCall; +use super::inline_source_block::IInlineSourceBlock; +use super::italic::IItalic; +use super::keyword::IKeyword; +use super::latex_fragment::ILatexFragment; +use super::line_break::ILineBreak; +use super::org_macro::IOrgMacro; +use super::plain_link::IPlainLink; +use super::plain_text::IPlainText; +use super::radio_link::IRadioLink; +use super::radio_target::IRadioTarget; +use super::registry::Registry; +use super::regular_link::IRegularLink; +use super::statistics_cookie::IStatisticsCookie; +use super::strike_through::IStrikeThrough; +use super::subscript::ISubscript; +use super::superscript::ISuperscript; +use super::IBabelCall; +use super::ICenterBlock; +use super::IClock; +use super::ICommentBlock; +use super::IDiarySexp; +use super::IDrawer; +use super::IDynamicBlock; +use super::IExampleBlock; +use super::IExportBlock; +use super::IFixedWidthArea; +use super::IFootnoteDefinition; +use super::IHeading; +use super::IHorizontalRule; +use super::ILatexEnvironment; +use super::IParagraph; +use super::IPlainList; +use super::IPlanning; +use super::IPropertyDrawer; +use super::IQuoteBlock; +use super::ISection; +use super::ISpecialBlock; +use super::ISrcBlock; +use super::ITable; +use super::ITarget; +use super::ITimestamp; +use super::IUnderline; +use super::IVerbatim; +use super::IVerseBlock; +use crate::error::CustomError; +use futures::future::{BoxFuture, FutureExt}; + +#[derive(Debug)] +pub(crate) enum IAstNode { + Heading(IHeading), + Section(ISection), + Paragraph(IParagraph), + PlainList(IPlainList), + CenterBlock(ICenterBlock), + QuoteBlock(IQuoteBlock), + SpecialBlock(ISpecialBlock), + DynamicBlock(IDynamicBlock), + FootnoteDefinition(IFootnoteDefinition), + Comment(IComment), + Drawer(IDrawer), + PropertyDrawer(IPropertyDrawer), + Table(ITable), + VerseBlock(IVerseBlock), + CommentBlock(ICommentBlock), + ExampleBlock(IExampleBlock), + ExportBlock(IExportBlock), + SrcBlock(ISrcBlock), + Clock(IClock), + DiarySexp(IDiarySexp), + Planning(IPlanning), + FixedWidthArea(IFixedWidthArea), + HorizontalRule(IHorizontalRule), + Keyword(IKeyword), + BabelCall(IBabelCall), + LatexEnvironment(ILatexEnvironment), + Bold(IBold), + Italic(IItalic), + Underline(IUnderline), + StrikeThrough(IStrikeThrough), + Code(ICode), + Verbatim(IVerbatim), + PlainText(IPlainText), + RegularLink(IRegularLink), + RadioLink(IRadioLink), + RadioTarget(IRadioTarget), + PlainLink(IPlainLink), + AngleLink(IAngleLink), + OrgMacro(IOrgMacro), + Entity(IEntity), + LatexFragment(ILatexFragment), + ExportSnippet(IExportSnippet), + FootnoteReference(IFootnoteReference), + Citation(ICitation), + CitationReference(ICitationReference), + InlineBabelCall(IInlineBabelCall), + InlineSourceBlock(IInlineSourceBlock), + LineBreak(ILineBreak), + Target(ITarget), + StatisticsCookie(IStatisticsCookie), + Subscript(ISubscript), + Superscript(ISuperscript), + Timestamp(ITimestamp), +} + +trait IntoIAstNode<'intermediate, 'parse> { + fn new<'b>( + &'intermediate self, + registry: &'b mut Registry<'intermediate, 'parse>, + ) -> BoxFuture<'b, Result>; +} + +impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> + for organic::types::DocumentElement<'parse> +{ + fn new<'b>( + &'intermediate self, + registry: &'b mut Registry<'intermediate, 'parse>, + ) -> BoxFuture<'b, Result> { + async move { + match self { + organic::types::DocumentElement::Heading(inner) => { + Ok(IAstNode::Heading(IHeading::new(registry, inner).await?)) + } + organic::types::DocumentElement::Section(inner) => { + Ok(IAstNode::Section(ISection::new(registry, inner).await?)) + } + } + } + .boxed() + } +} + +impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> + for organic::types::Element<'parse> +{ + fn new<'b>( + &'intermediate self, + registry: &'b mut Registry<'intermediate, 'parse>, + ) -> BoxFuture<'b, Result> { + async move { + match self { + organic::types::Element::Paragraph(inner) => { + Ok(IAstNode::Paragraph(IParagraph::new(registry, inner).await?)) + } + organic::types::Element::PlainList(inner) => { + Ok(IAstNode::PlainList(IPlainList::new(registry, inner).await?)) + } + organic::types::Element::CenterBlock(inner) => Ok(IAstNode::CenterBlock( + ICenterBlock::new(registry, inner).await?, + )), + organic::types::Element::QuoteBlock(inner) => Ok(IAstNode::QuoteBlock( + IQuoteBlock::new(registry, inner).await?, + )), + organic::types::Element::SpecialBlock(inner) => Ok(IAstNode::SpecialBlock( + ISpecialBlock::new(registry, inner).await?, + )), + organic::types::Element::DynamicBlock(inner) => Ok(IAstNode::DynamicBlock( + IDynamicBlock::new(registry, inner).await?, + )), + organic::types::Element::FootnoteDefinition(inner) => Ok( + IAstNode::FootnoteDefinition(IFootnoteDefinition::new(registry, inner).await?), + ), + organic::types::Element::Comment(inner) => { + Ok(IAstNode::Comment(IComment::new(registry, inner).await?)) + } + organic::types::Element::Drawer(inner) => { + Ok(IAstNode::Drawer(IDrawer::new(registry, inner).await?)) + } + organic::types::Element::PropertyDrawer(inner) => Ok(IAstNode::PropertyDrawer( + IPropertyDrawer::new(registry, inner).await?, + )), + organic::types::Element::Table(inner) => { + Ok(IAstNode::Table(ITable::new(registry, inner).await?)) + } + organic::types::Element::VerseBlock(inner) => Ok(IAstNode::VerseBlock( + IVerseBlock::new(registry, inner).await?, + )), + organic::types::Element::CommentBlock(inner) => Ok(IAstNode::CommentBlock( + ICommentBlock::new(registry, inner).await?, + )), + organic::types::Element::ExampleBlock(inner) => Ok(IAstNode::ExampleBlock( + IExampleBlock::new(registry, inner).await?, + )), + organic::types::Element::ExportBlock(inner) => Ok(IAstNode::ExportBlock( + IExportBlock::new(registry, inner).await?, + )), + organic::types::Element::SrcBlock(inner) => { + Ok(IAstNode::SrcBlock(ISrcBlock::new(registry, inner).await?)) + } + organic::types::Element::Clock(inner) => { + Ok(IAstNode::Clock(IClock::new(registry, inner).await?)) + } + organic::types::Element::DiarySexp(inner) => { + Ok(IAstNode::DiarySexp(IDiarySexp::new(registry, inner).await?)) + } + organic::types::Element::Planning(inner) => { + Ok(IAstNode::Planning(IPlanning::new(registry, inner).await?)) + } + organic::types::Element::FixedWidthArea(inner) => Ok(IAstNode::FixedWidthArea( + IFixedWidthArea::new(registry, inner).await?, + )), + organic::types::Element::HorizontalRule(inner) => Ok(IAstNode::HorizontalRule( + IHorizontalRule::new(registry, inner).await?, + )), + organic::types::Element::Keyword(inner) => { + Ok(IAstNode::Keyword(IKeyword::new(registry, inner).await?)) + } + organic::types::Element::BabelCall(inner) => { + Ok(IAstNode::BabelCall(IBabelCall::new(registry, inner).await?)) + } + organic::types::Element::LatexEnvironment(inner) => Ok(IAstNode::LatexEnvironment( + ILatexEnvironment::new(registry, inner).await?, + )), + } + } + .boxed() + } +} + +impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> for organic::types::Object<'parse> { + fn new<'b>( + &'intermediate self, + registry: &'b mut Registry<'intermediate, 'parse>, + ) -> BoxFuture<'b, Result> { + async move { + match self { + organic::types::Object::Bold(inner) => { + Ok(IAstNode::Bold(IBold::new(registry, inner).await?)) + } + organic::types::Object::Italic(inner) => { + Ok(IAstNode::Italic(IItalic::new(registry, inner).await?)) + } + organic::types::Object::Underline(inner) => { + Ok(IAstNode::Underline(IUnderline::new(registry, inner).await?)) + } + organic::types::Object::StrikeThrough(inner) => Ok(IAstNode::StrikeThrough( + IStrikeThrough::new(registry, inner).await?, + )), + organic::types::Object::Code(inner) => { + Ok(IAstNode::Code(ICode::new(registry, inner).await?)) + } + organic::types::Object::Verbatim(inner) => { + Ok(IAstNode::Verbatim(IVerbatim::new(registry, inner).await?)) + } + organic::types::Object::PlainText(inner) => { + Ok(IAstNode::PlainText(IPlainText::new(registry, inner).await?)) + } + organic::types::Object::RegularLink(inner) => Ok(IAstNode::RegularLink( + IRegularLink::new(registry, inner).await?, + )), + organic::types::Object::RadioLink(inner) => { + Ok(IAstNode::RadioLink(IRadioLink::new(registry, inner).await?)) + } + organic::types::Object::RadioTarget(inner) => Ok(IAstNode::RadioTarget( + IRadioTarget::new(registry, inner).await?, + )), + organic::types::Object::PlainLink(inner) => { + Ok(IAstNode::PlainLink(IPlainLink::new(registry, inner).await?)) + } + organic::types::Object::AngleLink(inner) => { + Ok(IAstNode::AngleLink(IAngleLink::new(registry, inner).await?)) + } + organic::types::Object::OrgMacro(inner) => { + Ok(IAstNode::OrgMacro(IOrgMacro::new(registry, inner).await?)) + } + organic::types::Object::Entity(inner) => { + Ok(IAstNode::Entity(IEntity::new(registry, inner).await?)) + } + organic::types::Object::LatexFragment(inner) => Ok(IAstNode::LatexFragment( + ILatexFragment::new(registry, inner).await?, + )), + organic::types::Object::ExportSnippet(inner) => Ok(IAstNode::ExportSnippet( + IExportSnippet::new(registry, inner).await?, + )), + organic::types::Object::FootnoteReference(inner) => Ok( + IAstNode::FootnoteReference(IFootnoteReference::new(registry, inner).await?), + ), + organic::types::Object::Citation(inner) => { + Ok(IAstNode::Citation(ICitation::new(registry, inner).await?)) + } + organic::types::Object::CitationReference(inner) => Ok( + IAstNode::CitationReference(ICitationReference::new(registry, inner).await?), + ), + organic::types::Object::InlineBabelCall(inner) => Ok(IAstNode::InlineBabelCall( + IInlineBabelCall::new(registry, inner).await?, + )), + organic::types::Object::InlineSourceBlock(inner) => Ok( + IAstNode::InlineSourceBlock(IInlineSourceBlock::new(registry, inner).await?), + ), + organic::types::Object::LineBreak(inner) => { + Ok(IAstNode::LineBreak(ILineBreak::new(registry, inner).await?)) + } + organic::types::Object::Target(inner) => { + Ok(IAstNode::Target(ITarget::new(registry, inner).await?)) + } + organic::types::Object::StatisticsCookie(inner) => Ok(IAstNode::StatisticsCookie( + IStatisticsCookie::new(registry, inner).await?, + )), + organic::types::Object::Subscript(inner) => { + Ok(IAstNode::Subscript(ISubscript::new(registry, inner).await?)) + } + organic::types::Object::Superscript(inner) => Ok(IAstNode::Superscript( + ISuperscript::new(registry, inner).await?, + )), + organic::types::Object::Timestamp(inner) => { + Ok(IAstNode::Timestamp(ITimestamp::new(registry, inner).await?)) + } + } + } + .boxed() + } +} diff --git a/src/intermediate/definition.rs b/src/intermediate/definition.rs index 2f62ca7..6e21bb6 100644 --- a/src/intermediate/definition.rs +++ b/src/intermediate/definition.rs @@ -43,23 +43,21 @@ impl BlogPost { 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 mut ret = Vec::new(); for (real_path, _contents, parsed_document) in parsed_org_files.iter() { + let mut registry = Registry::new(); + + // Assign IDs to the targets + 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 relative_to_post_dir_path = real_path.strip_prefix(post_dir)?; ret.push( BlogPostPage::new( diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index f6da6c3..2f2b645 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -1,6 +1,10 @@ use crate::error::CustomError; +use super::ast_node::IAstNode; +use super::registry::FootnoteDefinitionContents; use super::registry::Registry; +use super::IElement; +use super::IObject; #[derive(Debug)] pub(crate) struct IFootnoteDefinition {} @@ -14,3 +18,44 @@ impl IFootnoteDefinition { Ok(IFootnoteDefinition {}) } } + +#[derive(Debug)] +pub(crate) struct IRealFootnoteDefinition { + footnote_id: usize, + contents: Vec, +} + +impl IRealFootnoteDefinition { + pub(crate) async fn new<'intermediate, 'parse>( + registry: &mut Registry<'intermediate, 'parse>, + footnote_id: usize, + original: &FootnoteDefinitionContents<'intermediate, 'parse>, + ) -> Result { + let contents = match original { + FootnoteDefinitionContents::FromReference(inner) => { + let contents = { + let mut ret = Vec::new(); + for obj in inner.iter() { + ret.push(IAstNode::Object(IObject::new(registry, obj).await?)); + } + ret + }; + contents + } + FootnoteDefinitionContents::FromDefinition(inner) => { + let contents = { + let mut ret = Vec::new(); + for obj in inner.iter() { + ret.push(IAstNode::Element(IElement::new(registry, obj).await?)); + } + ret + }; + contents + } + }; + Ok(IRealFootnoteDefinition { + footnote_id, + contents, + }) + } +} diff --git a/src/intermediate/mod.rs b/src/intermediate/mod.rs index ac1f411..dd316f9 100644 --- a/src/intermediate/mod.rs +++ b/src/intermediate/mod.rs @@ -1,4 +1,5 @@ mod angle_link; +mod ast_node; mod babel_call; mod bold; mod center_block; diff --git a/src/intermediate/page.rs b/src/intermediate/page.rs index ba2f754..4b83943 100644 --- a/src/intermediate/page.rs +++ b/src/intermediate/page.rs @@ -2,6 +2,7 @@ use std::path::PathBuf; use crate::error::CustomError; +use super::footnote_definition::IRealFootnoteDefinition; use super::registry::Registry; use super::IDocumentElement; use super::IHeading; @@ -15,6 +16,8 @@ pub(crate) struct BlogPostPage { pub(crate) title: Option, pub(crate) children: Vec, + + pub(crate) footnotes: Vec, } impl BlogPostPage { @@ -36,10 +39,13 @@ impl BlogPostPage { )); } + // TODO: Get footnote definitions + Ok(BlogPostPage { path, title: get_title(&document), children, + footnotes: Vec::new(), // TODO }) } diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index a56cbc6..a2d8d33 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -3,15 +3,14 @@ use std::collections::HashMap; use organic::types::Element; use organic::types::Object; +use super::ast_node::IAstNode; + type IdCounter = u16; pub(crate) struct Registry<'intermediate, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, - footnote_ids: Vec<( - Option<&'parse str>, - FootnoteDefinitionContents<'intermediate, 'parse>, - )>, + footnote_ids: Vec<(Option<&'parse str>, Vec)>, } impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { From 645ae267011bcb8d70f8f74abf90d2585babe512 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 14:14:10 -0400 Subject: [PATCH 06/24] Remove intermediate lifetime. --- src/intermediate/angle_link.rs | 6 +- src/intermediate/ast_node.rs | 55 ++++++++++-------- src/intermediate/babel_call.rs | 6 +- src/intermediate/bold.rs | 6 +- src/intermediate/center_block.rs | 6 +- src/intermediate/citation.rs | 6 +- src/intermediate/citation_reference.rs | 6 +- src/intermediate/clock.rs | 6 +- src/intermediate/code.rs | 6 +- src/intermediate/comment.rs | 6 +- src/intermediate/comment_block.rs | 6 +- src/intermediate/diary_sexp.rs | 6 +- src/intermediate/document_element.rs | 6 +- src/intermediate/drawer.rs | 6 +- src/intermediate/dynamic_block.rs | 6 +- src/intermediate/element.rs | 6 +- src/intermediate/entity.rs | 6 +- src/intermediate/example_block.rs | 6 +- src/intermediate/export_block.rs | 6 +- src/intermediate/export_snippet.rs | 6 +- src/intermediate/fixed_width_area.rs | 6 +- src/intermediate/footnote_definition.rs | 39 +++---------- src/intermediate/footnote_reference.rs | 10 ++-- src/intermediate/heading.rs | 6 +- src/intermediate/horizontal_rule.rs | 6 +- src/intermediate/inline_babel_call.rs | 6 +- src/intermediate/inline_source_block.rs | 6 +- src/intermediate/italic.rs | 6 +- src/intermediate/keyword.rs | 6 +- src/intermediate/latex_environment.rs | 6 +- src/intermediate/latex_fragment.rs | 6 +- src/intermediate/line_break.rs | 6 +- src/intermediate/object.rs | 6 +- src/intermediate/org_macro.rs | 6 +- src/intermediate/page.rs | 6 +- src/intermediate/paragraph.rs | 6 +- src/intermediate/plain_link.rs | 6 +- src/intermediate/plain_list.rs | 6 +- src/intermediate/plain_list_item.rs | 6 +- src/intermediate/plain_text.rs | 6 +- src/intermediate/planning.rs | 6 +- src/intermediate/property_drawer.rs | 6 +- src/intermediate/quote_block.rs | 6 +- src/intermediate/radio_link.rs | 6 +- src/intermediate/radio_target.rs | 6 +- src/intermediate/registry.rs | 75 +++++++++++++++++-------- src/intermediate/regular_link.rs | 6 +- src/intermediate/section.rs | 6 +- src/intermediate/special_block.rs | 6 +- src/intermediate/src_block.rs | 6 +- src/intermediate/statistics_cookie.rs | 6 +- src/intermediate/strike_through.rs | 6 +- src/intermediate/subscript.rs | 6 +- src/intermediate/superscript.rs | 6 +- src/intermediate/table.rs | 6 +- src/intermediate/target.rs | 6 +- src/intermediate/timestamp.rs | 6 +- src/intermediate/underline.rs | 6 +- src/intermediate/verbatim.rs | 6 +- src/intermediate/verse_block.rs | 6 +- 60 files changed, 266 insertions(+), 249 deletions(-) diff --git a/src/intermediate/angle_link.rs b/src/intermediate/angle_link.rs index 5cd2cd1..a92e3a7 100644 --- a/src/intermediate/angle_link.rs +++ b/src/intermediate/angle_link.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IAngleLink {} impl IAngleLink { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::AngleLink<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::AngleLink<'parse>, ) -> Result { Ok(IAngleLink {}) } diff --git a/src/intermediate/ast_node.rs b/src/intermediate/ast_node.rs index da23f24..82bd540 100644 --- a/src/intermediate/ast_node.rs +++ b/src/intermediate/ast_node.rs @@ -112,20 +112,23 @@ pub(crate) enum IAstNode { Timestamp(ITimestamp), } -trait IntoIAstNode<'intermediate, 'parse> { - fn new<'b>( - &'intermediate self, - registry: &'b mut Registry<'intermediate, 'parse>, - ) -> BoxFuture<'b, Result>; +pub(crate) trait IntoIAstNode { + fn into_ast_node<'parse, 'b>( + &'b self, + registry: &'b mut Registry<'parse>, + ) -> BoxFuture<'b, Result> + where + Self: 'parse; } -impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> - for organic::types::DocumentElement<'parse> -{ - fn new<'b>( - &'intermediate self, - registry: &'b mut Registry<'intermediate, 'parse>, - ) -> BoxFuture<'b, Result> { +impl IntoIAstNode for organic::types::DocumentElement<'_> { + fn into_ast_node<'parse, 'b>( + &'b self, + registry: &'b mut Registry<'parse>, + ) -> BoxFuture<'b, Result> + where + Self: 'parse, + { async move { match self { organic::types::DocumentElement::Heading(inner) => { @@ -140,13 +143,14 @@ impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> } } -impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> - for organic::types::Element<'parse> -{ - fn new<'b>( - &'intermediate self, - registry: &'b mut Registry<'intermediate, 'parse>, - ) -> BoxFuture<'b, Result> { +impl IntoIAstNode for organic::types::Element<'_> { + fn into_ast_node<'parse, 'b>( + &'b self, + registry: &'b mut Registry<'parse>, + ) -> BoxFuture<'b, Result> + where + Self: 'parse, + { async move { match self { organic::types::Element::Paragraph(inner) => { @@ -227,11 +231,14 @@ impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> } } -impl<'intermediate, 'parse> IntoIAstNode<'intermediate, 'parse> for organic::types::Object<'parse> { - fn new<'b>( - &'intermediate self, - registry: &'b mut Registry<'intermediate, 'parse>, - ) -> BoxFuture<'b, Result> { +impl IntoIAstNode for organic::types::Object<'_> { + fn into_ast_node<'parse, 'b>( + &'b self, + registry: &'b mut Registry<'parse>, + ) -> BoxFuture<'b, Result> + where + Self: 'parse, + { async move { match self { organic::types::Object::Bold(inner) => { diff --git a/src/intermediate/babel_call.rs b/src/intermediate/babel_call.rs index 6414178..8e92165 100644 --- a/src/intermediate/babel_call.rs +++ b/src/intermediate/babel_call.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IBabelCall {} impl IBabelCall { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::BabelCall<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::BabelCall<'parse>, ) -> Result { Ok(IBabelCall {}) } diff --git a/src/intermediate/bold.rs b/src/intermediate/bold.rs index d6dc019..3d94ae7 100644 --- a/src/intermediate/bold.rs +++ b/src/intermediate/bold.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IBold {} impl IBold { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Bold<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Bold<'parse>, ) -> Result { Ok(IBold {}) } diff --git a/src/intermediate/center_block.rs b/src/intermediate/center_block.rs index 4f104aa..8b95dab 100644 --- a/src/intermediate/center_block.rs +++ b/src/intermediate/center_block.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ICenterBlock {} impl ICenterBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::CenterBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::CenterBlock<'parse>, ) -> Result { Ok(ICenterBlock {}) } diff --git a/src/intermediate/citation.rs b/src/intermediate/citation.rs index 70902b9..e14cffd 100644 --- a/src/intermediate/citation.rs +++ b/src/intermediate/citation.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ICitation {} impl ICitation { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Citation<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Citation<'parse>, ) -> Result { Ok(ICitation {}) } diff --git a/src/intermediate/citation_reference.rs b/src/intermediate/citation_reference.rs index ebcbe70..30e2a77 100644 --- a/src/intermediate/citation_reference.rs +++ b/src/intermediate/citation_reference.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ICitationReference {} impl ICitationReference { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::CitationReference<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::CitationReference<'parse>, ) -> Result { Ok(ICitationReference {}) } diff --git a/src/intermediate/clock.rs b/src/intermediate/clock.rs index 1dddb04..4db4185 100644 --- a/src/intermediate/clock.rs +++ b/src/intermediate/clock.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IClock {} impl IClock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Clock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Clock<'parse>, ) -> Result { Ok(IClock {}) } diff --git a/src/intermediate/code.rs b/src/intermediate/code.rs index e2da068..0eb3a76 100644 --- a/src/intermediate/code.rs +++ b/src/intermediate/code.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ICode {} impl ICode { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Code<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Code<'parse>, ) -> Result { Ok(ICode {}) } diff --git a/src/intermediate/comment.rs b/src/intermediate/comment.rs index d79837a..d54cee7 100644 --- a/src/intermediate/comment.rs +++ b/src/intermediate/comment.rs @@ -7,9 +7,9 @@ use super::registry::Registry; pub(crate) struct IComment {} impl IComment { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - comment: &organic::types::Comment<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + comment: &'b organic::types::Comment<'parse>, ) -> Result { Ok(IComment {}) } diff --git a/src/intermediate/comment_block.rs b/src/intermediate/comment_block.rs index 0e085d8..b2cdc73 100644 --- a/src/intermediate/comment_block.rs +++ b/src/intermediate/comment_block.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ICommentBlock {} impl ICommentBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::CommentBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::CommentBlock<'parse>, ) -> Result { Ok(ICommentBlock {}) } diff --git a/src/intermediate/diary_sexp.rs b/src/intermediate/diary_sexp.rs index 9c66cff..664bdec 100644 --- a/src/intermediate/diary_sexp.rs +++ b/src/intermediate/diary_sexp.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IDiarySexp {} impl IDiarySexp { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::DiarySexp<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::DiarySexp<'parse>, ) -> Result { Ok(IDiarySexp {}) } diff --git a/src/intermediate/document_element.rs b/src/intermediate/document_element.rs index 9f4b488..d348269 100644 --- a/src/intermediate/document_element.rs +++ b/src/intermediate/document_element.rs @@ -12,9 +12,9 @@ pub(crate) enum IDocumentElement { } impl IDocumentElement { - pub(crate) fn new<'intermediate, 'parse, 'b>( - registry: &'b mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::DocumentElement<'parse>, + pub(crate) fn new<'parse, 'b>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::DocumentElement<'parse>, ) -> BoxFuture<'b, Result> { async move { match original { diff --git a/src/intermediate/drawer.rs b/src/intermediate/drawer.rs index 0572ae5..506428f 100644 --- a/src/intermediate/drawer.rs +++ b/src/intermediate/drawer.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IDrawer {} impl IDrawer { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Drawer<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Drawer<'parse>, ) -> Result { Ok(IDrawer {}) } diff --git a/src/intermediate/dynamic_block.rs b/src/intermediate/dynamic_block.rs index 4a8180b..6e31c19 100644 --- a/src/intermediate/dynamic_block.rs +++ b/src/intermediate/dynamic_block.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IDynamicBlock {} impl IDynamicBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::DynamicBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::DynamicBlock<'parse>, ) -> Result { Ok(IDynamicBlock {}) } diff --git a/src/intermediate/element.rs b/src/intermediate/element.rs index 1d81943..1fe3360 100644 --- a/src/intermediate/element.rs +++ b/src/intermediate/element.rs @@ -56,9 +56,9 @@ pub(crate) enum IElement { } impl IElement { - pub(crate) fn new<'intermediate, 'parse, 'b>( - registry: &'b mut Registry<'intermediate, 'parse>, - elem: &'intermediate organic::types::Element<'parse>, + pub(crate) fn new<'parse, 'b>( + registry: &'b mut Registry<'parse>, + elem: &'b organic::types::Element<'parse>, ) -> BoxFuture<'b, Result> { async move { match elem { diff --git a/src/intermediate/entity.rs b/src/intermediate/entity.rs index 547ed0e..a2fa594 100644 --- a/src/intermediate/entity.rs +++ b/src/intermediate/entity.rs @@ -8,9 +8,9 @@ pub(crate) struct IEntity { } impl IEntity { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Entity<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Entity<'parse>, ) -> Result { Ok(IEntity { html: original.html.to_owned(), diff --git a/src/intermediate/example_block.rs b/src/intermediate/example_block.rs index 8fda94e..c10c77c 100644 --- a/src/intermediate/example_block.rs +++ b/src/intermediate/example_block.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IExampleBlock {} impl IExampleBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::ExampleBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::ExampleBlock<'parse>, ) -> Result { Ok(IExampleBlock {}) } diff --git a/src/intermediate/export_block.rs b/src/intermediate/export_block.rs index 4915e2d..d9fa9f8 100644 --- a/src/intermediate/export_block.rs +++ b/src/intermediate/export_block.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IExportBlock {} impl IExportBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::ExportBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::ExportBlock<'parse>, ) -> Result { Ok(IExportBlock {}) } diff --git a/src/intermediate/export_snippet.rs b/src/intermediate/export_snippet.rs index ceb30e1..3759564 100644 --- a/src/intermediate/export_snippet.rs +++ b/src/intermediate/export_snippet.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IExportSnippet {} impl IExportSnippet { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::ExportSnippet<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::ExportSnippet<'parse>, ) -> Result { Ok(IExportSnippet {}) } diff --git a/src/intermediate/fixed_width_area.rs b/src/intermediate/fixed_width_area.rs index cc6e769..6147514 100644 --- a/src/intermediate/fixed_width_area.rs +++ b/src/intermediate/fixed_width_area.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IFixedWidthArea {} impl IFixedWidthArea { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::FixedWidthArea<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::FixedWidthArea<'parse>, ) -> Result { Ok(IFixedWidthArea {}) } diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index 2f2b645..ea2774a 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -1,7 +1,6 @@ use crate::error::CustomError; use super::ast_node::IAstNode; -use super::registry::FootnoteDefinitionContents; use super::registry::Registry; use super::IElement; use super::IObject; @@ -10,11 +9,13 @@ use super::IObject; pub(crate) struct IFootnoteDefinition {} impl IFootnoteDefinition { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::FootnoteDefinition<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::FootnoteDefinition<'parse>, ) -> Result { - registry.register_footnote_definition(original.label, &original.children); + registry + .register_footnote_definition(original.label, &original.children) + .await?; Ok(IFootnoteDefinition {}) } } @@ -26,33 +27,11 @@ pub(crate) struct IRealFootnoteDefinition { } impl IRealFootnoteDefinition { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, footnote_id: usize, - original: &FootnoteDefinitionContents<'intermediate, 'parse>, + contents: Vec, ) -> Result { - let contents = match original { - FootnoteDefinitionContents::FromReference(inner) => { - let contents = { - let mut ret = Vec::new(); - for obj in inner.iter() { - ret.push(IAstNode::Object(IObject::new(registry, obj).await?)); - } - ret - }; - contents - } - FootnoteDefinitionContents::FromDefinition(inner) => { - let contents = { - let mut ret = Vec::new(); - for obj in inner.iter() { - ret.push(IAstNode::Element(IElement::new(registry, obj).await?)); - } - ret - }; - contents - } - }; Ok(IRealFootnoteDefinition { footnote_id, contents, diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index e5686c2..d0ef6bb 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -9,11 +9,13 @@ pub(crate) struct IFootnoteReference { } impl IFootnoteReference { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::FootnoteReference<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::FootnoteReference<'parse>, ) -> Result { - let footnote_id = registry.get_footnote_reference_id(original.label, &original.definition); + let footnote_id = registry + .get_footnote_reference_id(original.label, &original.definition) + .await?; Ok(IFootnoteReference { footnote_id, duplicate_offset: 0, // TODO diff --git a/src/intermediate/heading.rs b/src/intermediate/heading.rs index 49e4f0b..2d6bfd9 100644 --- a/src/intermediate/heading.rs +++ b/src/intermediate/heading.rs @@ -12,9 +12,9 @@ pub(crate) struct IHeading { } impl IHeading { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::Heading<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Heading<'parse>, ) -> Result { let title = { let mut ret = Vec::new(); diff --git a/src/intermediate/horizontal_rule.rs b/src/intermediate/horizontal_rule.rs index 6e8b8e5..ca7b2e5 100644 --- a/src/intermediate/horizontal_rule.rs +++ b/src/intermediate/horizontal_rule.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IHorizontalRule {} impl IHorizontalRule { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::HorizontalRule<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::HorizontalRule<'parse>, ) -> Result { Ok(IHorizontalRule {}) } diff --git a/src/intermediate/inline_babel_call.rs b/src/intermediate/inline_babel_call.rs index 956a5f0..659a7c7 100644 --- a/src/intermediate/inline_babel_call.rs +++ b/src/intermediate/inline_babel_call.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IInlineBabelCall {} impl IInlineBabelCall { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::InlineBabelCall<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::InlineBabelCall<'parse>, ) -> Result { Ok(IInlineBabelCall {}) } diff --git a/src/intermediate/inline_source_block.rs b/src/intermediate/inline_source_block.rs index 48d5bf7..2f798f1 100644 --- a/src/intermediate/inline_source_block.rs +++ b/src/intermediate/inline_source_block.rs @@ -8,9 +8,9 @@ pub(crate) struct IInlineSourceBlock { } impl IInlineSourceBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::InlineSourceBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::InlineSourceBlock<'parse>, ) -> Result { Ok(IInlineSourceBlock { value: original.value.to_owned(), diff --git a/src/intermediate/italic.rs b/src/intermediate/italic.rs index e71048c..91677b8 100644 --- a/src/intermediate/italic.rs +++ b/src/intermediate/italic.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IItalic {} impl IItalic { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Italic<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Italic<'parse>, ) -> Result { Ok(IItalic {}) } diff --git a/src/intermediate/keyword.rs b/src/intermediate/keyword.rs index 8ec3df7..c0d7567 100644 --- a/src/intermediate/keyword.rs +++ b/src/intermediate/keyword.rs @@ -7,9 +7,9 @@ use super::registry::Registry; pub(crate) struct IKeyword {} impl IKeyword { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - keyword: &organic::types::Keyword<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + keyword: &'b organic::types::Keyword<'parse>, ) -> Result { Ok(IKeyword {}) } diff --git a/src/intermediate/latex_environment.rs b/src/intermediate/latex_environment.rs index 1370d48..05d82cb 100644 --- a/src/intermediate/latex_environment.rs +++ b/src/intermediate/latex_environment.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ILatexEnvironment {} impl ILatexEnvironment { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::LatexEnvironment<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::LatexEnvironment<'parse>, ) -> Result { Ok(ILatexEnvironment {}) } diff --git a/src/intermediate/latex_fragment.rs b/src/intermediate/latex_fragment.rs index b1c069a..804985c 100644 --- a/src/intermediate/latex_fragment.rs +++ b/src/intermediate/latex_fragment.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ILatexFragment {} impl ILatexFragment { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::LatexFragment<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::LatexFragment<'parse>, ) -> Result { Ok(ILatexFragment {}) } diff --git a/src/intermediate/line_break.rs b/src/intermediate/line_break.rs index f0869ac..9534d07 100644 --- a/src/intermediate/line_break.rs +++ b/src/intermediate/line_break.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ILineBreak {} impl ILineBreak { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::LineBreak<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::LineBreak<'parse>, ) -> Result { Ok(ILineBreak {}) } diff --git a/src/intermediate/object.rs b/src/intermediate/object.rs index 67dad58..c51584a 100644 --- a/src/intermediate/object.rs +++ b/src/intermediate/object.rs @@ -62,9 +62,9 @@ pub(crate) enum IObject { } impl IObject { - pub(crate) fn new<'intermediate, 'parse, 'b>( - registry: &'b mut Registry<'intermediate, 'parse>, - obj: &'intermediate organic::types::Object<'parse>, + pub(crate) fn new<'parse, 'b>( + registry: &'b mut Registry<'parse>, + obj: &'b organic::types::Object<'parse>, ) -> BoxFuture<'b, Result> { async move { match obj { diff --git a/src/intermediate/org_macro.rs b/src/intermediate/org_macro.rs index 2c0fa4e..f231a38 100644 --- a/src/intermediate/org_macro.rs +++ b/src/intermediate/org_macro.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IOrgMacro {} impl IOrgMacro { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::OrgMacro<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::OrgMacro<'parse>, ) -> Result { Ok(IOrgMacro {}) } diff --git a/src/intermediate/page.rs b/src/intermediate/page.rs index 4b83943..66514e2 100644 --- a/src/intermediate/page.rs +++ b/src/intermediate/page.rs @@ -21,10 +21,10 @@ pub(crate) struct BlogPostPage { } impl BlogPostPage { - pub(crate) async fn new<'intermediate, 'parse, P: Into>( + pub(crate) async fn new<'b, 'parse, P: Into>( path: P, - registry: &mut Registry<'intermediate, 'parse>, - document: &'intermediate organic::types::Document<'parse>, + registry: &'b mut Registry<'parse>, + document: &'b organic::types::Document<'parse>, ) -> Result { let path = path.into(); let mut children = Vec::new(); diff --git a/src/intermediate/paragraph.rs b/src/intermediate/paragraph.rs index 9536190..f41dc70 100644 --- a/src/intermediate/paragraph.rs +++ b/src/intermediate/paragraph.rs @@ -9,9 +9,9 @@ pub(crate) struct IParagraph { } impl IParagraph { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::Paragraph<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Paragraph<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/plain_link.rs b/src/intermediate/plain_link.rs index 9c3ec4c..f79d0de 100644 --- a/src/intermediate/plain_link.rs +++ b/src/intermediate/plain_link.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IPlainLink {} impl IPlainLink { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::PlainLink<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::PlainLink<'parse>, ) -> Result { Ok(IPlainLink {}) } diff --git a/src/intermediate/plain_list.rs b/src/intermediate/plain_list.rs index 71ec77e..5b74769 100644 --- a/src/intermediate/plain_list.rs +++ b/src/intermediate/plain_list.rs @@ -10,9 +10,9 @@ pub(crate) struct IPlainList { } impl IPlainList { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::PlainList<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::PlainList<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/plain_list_item.rs b/src/intermediate/plain_list_item.rs index 0554db7..b0308fb 100644 --- a/src/intermediate/plain_list_item.rs +++ b/src/intermediate/plain_list_item.rs @@ -11,9 +11,9 @@ pub(crate) struct IPlainListItem { } impl IPlainListItem { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::PlainListItem<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::PlainListItem<'parse>, ) -> Result { let tag = { let mut ret = Vec::new(); diff --git a/src/intermediate/plain_text.rs b/src/intermediate/plain_text.rs index 3be73ac..c75ae2d 100644 --- a/src/intermediate/plain_text.rs +++ b/src/intermediate/plain_text.rs @@ -9,9 +9,9 @@ pub(crate) struct IPlainText { } impl IPlainText { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - plain_text: &organic::types::PlainText<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + plain_text: &'b organic::types::PlainText<'parse>, ) -> Result { Ok(IPlainText { source: coalesce_whitespace(plain_text.source).into_owned(), diff --git a/src/intermediate/planning.rs b/src/intermediate/planning.rs index 063fb86..f6a689c 100644 --- a/src/intermediate/planning.rs +++ b/src/intermediate/planning.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IPlanning {} impl IPlanning { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Planning<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Planning<'parse>, ) -> Result { Ok(IPlanning {}) } diff --git a/src/intermediate/property_drawer.rs b/src/intermediate/property_drawer.rs index 0bb7e96..70bea94 100644 --- a/src/intermediate/property_drawer.rs +++ b/src/intermediate/property_drawer.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IPropertyDrawer {} impl IPropertyDrawer { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::PropertyDrawer<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::PropertyDrawer<'parse>, ) -> Result { Ok(IPropertyDrawer {}) } diff --git a/src/intermediate/quote_block.rs b/src/intermediate/quote_block.rs index 504cecd..b08429e 100644 --- a/src/intermediate/quote_block.rs +++ b/src/intermediate/quote_block.rs @@ -9,9 +9,9 @@ pub(crate) struct IQuoteBlock { } impl IQuoteBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::QuoteBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::QuoteBlock<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/radio_link.rs b/src/intermediate/radio_link.rs index 8303fb4..fff2e36 100644 --- a/src/intermediate/radio_link.rs +++ b/src/intermediate/radio_link.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IRadioLink {} impl IRadioLink { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::RadioLink<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::RadioLink<'parse>, ) -> Result { Ok(IRadioLink {}) } diff --git a/src/intermediate/radio_target.rs b/src/intermediate/radio_target.rs index e89238a..0efcbce 100644 --- a/src/intermediate/radio_target.rs +++ b/src/intermediate/radio_target.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IRadioTarget {} impl IRadioTarget { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::RadioTarget<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::RadioTarget<'parse>, ) -> Result { Ok(IRadioTarget {}) } diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index a2d8d33..da5183b 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -1,5 +1,7 @@ use std::collections::HashMap; +use super::ast_node::IntoIAstNode; +use crate::error::CustomError; use organic::types::Element; use organic::types::Object; @@ -7,14 +9,14 @@ use super::ast_node::IAstNode; type IdCounter = u16; -pub(crate) struct Registry<'intermediate, 'parse> { +pub(crate) struct Registry<'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, footnote_ids: Vec<(Option<&'parse str>, Vec)>, } -impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { - pub(crate) fn new() -> Registry<'intermediate, 'parse> { +impl<'parse> Registry<'parse> { + pub(crate) fn new() -> Registry<'parse> { Registry { id_counter: 0, targets: HashMap::new(), @@ -32,16 +34,16 @@ impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { /// Get a 0-indexed ID for a footnote. /// /// This needs to be incremented to be 1-indexed for render. - pub(crate) fn get_footnote_reference_id<'b>( + pub(crate) async fn get_footnote_reference_id<'b>( &'b mut self, label: Option<&'parse str>, - definition: &'intermediate Vec>, - ) -> usize { + definition: &'b Vec>, + ) -> Result { if let None = label { // If it has no label then it must always get a new ID. - self.footnote_ids - .push((None, FootnoteDefinitionContents::FromReference(definition))); - return self.footnote_ids.len() - 1; + let contents = convert_reference_contents(self, definition).await?; + self.footnote_ids.push((None, contents)); + return Ok(self.footnote_ids.len() - 1); } if let Some(existing_id) = self @@ -50,38 +52,65 @@ impl<'intermediate, 'parse> Registry<'intermediate, 'parse> { .position(|(id, _definition)| *id == label) { if !definition.is_empty() { + let contents = convert_reference_contents(self, definition).await?; let entry = self .footnote_ids .get_mut(existing_id) .expect("If-statement proves this to be Some."); - entry.1 = FootnoteDefinitionContents::FromReference(definition); + entry.1 = contents; } - existing_id + Ok(existing_id) } else { - self.footnote_ids - .push((label, FootnoteDefinitionContents::FromReference(definition))); - self.footnote_ids.len() - 1 + let contents = convert_reference_contents(self, definition).await?; + self.footnote_ids.push((label, contents)); + Ok(self.footnote_ids.len() - 1) } } /// Update the definition to a footnote but do not mark it as referenced. - pub(crate) fn register_footnote_definition<'b>( + pub(crate) async fn register_footnote_definition<'b>( &'b mut self, label: &'parse str, - definition: &'intermediate Vec>, - ) { - if let Some((existing_id, existing_definition)) = self + definition: &'b Vec>, + ) -> Result<(), CustomError> { + let contents = convert_definition_contents(self, definition).await?; + if let Some((_existing_id, existing_definition)) = self .footnote_ids .iter_mut() .find(|(id, _definition)| *id == Some(label)) { - *existing_definition = FootnoteDefinitionContents::FromDefinition(definition); + *existing_definition = contents; } + Ok(()) } } -#[derive(Debug)] -pub(crate) enum FootnoteDefinitionContents<'intermediate, 'parse> { - FromReference(&'intermediate Vec>), - FromDefinition(&'intermediate Vec>), +async fn convert_reference_contents<'b, 'parse>( + registry: &'b mut Registry<'parse>, + contents: &'b Vec>, +) -> Result, CustomError> { + let contents = { + let mut ret = Vec::new(); + for obj in contents.iter() { + ret.push(obj.into_ast_node(registry).await?); + } + ret + }; + + Ok(contents) +} + +async fn convert_definition_contents<'b, 'parse>( + registry: &'b mut Registry<'parse>, + contents: &'b Vec>, +) -> Result, CustomError> { + let contents = { + let mut ret = Vec::new(); + for obj in contents.iter() { + ret.push(obj.into_ast_node(registry).await?); + } + ret + }; + + Ok(contents) } diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index 4c513b9..36ec9ae 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -10,9 +10,9 @@ pub(crate) struct IRegularLink { } impl IRegularLink { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &'intermediate organic::types::RegularLink<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::RegularLink<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/section.rs b/src/intermediate/section.rs index 9a73485..6642061 100644 --- a/src/intermediate/section.rs +++ b/src/intermediate/section.rs @@ -9,9 +9,9 @@ pub(crate) struct ISection { } impl ISection { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - section: &'intermediate organic::types::Section<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + section: &'b organic::types::Section<'parse>, ) -> Result { let children = { let mut ret = Vec::new(); diff --git a/src/intermediate/special_block.rs b/src/intermediate/special_block.rs index 8e14fc4..b10cff0 100644 --- a/src/intermediate/special_block.rs +++ b/src/intermediate/special_block.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ISpecialBlock {} impl ISpecialBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::SpecialBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::SpecialBlock<'parse>, ) -> Result { Ok(ISpecialBlock {}) } diff --git a/src/intermediate/src_block.rs b/src/intermediate/src_block.rs index 868c653..ddf9534 100644 --- a/src/intermediate/src_block.rs +++ b/src/intermediate/src_block.rs @@ -8,9 +8,9 @@ pub(crate) struct ISrcBlock { } impl ISrcBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::SrcBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::SrcBlock<'parse>, ) -> Result { let lines = original .contents diff --git a/src/intermediate/statistics_cookie.rs b/src/intermediate/statistics_cookie.rs index 455373e..0b0a3db 100644 --- a/src/intermediate/statistics_cookie.rs +++ b/src/intermediate/statistics_cookie.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IStatisticsCookie {} impl IStatisticsCookie { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::StatisticsCookie<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::StatisticsCookie<'parse>, ) -> Result { Ok(IStatisticsCookie {}) } diff --git a/src/intermediate/strike_through.rs b/src/intermediate/strike_through.rs index 5b8c9e3..ca80c17 100644 --- a/src/intermediate/strike_through.rs +++ b/src/intermediate/strike_through.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IStrikeThrough {} impl IStrikeThrough { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::StrikeThrough<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::StrikeThrough<'parse>, ) -> Result { Ok(IStrikeThrough {}) } diff --git a/src/intermediate/subscript.rs b/src/intermediate/subscript.rs index d99fe81..3a79239 100644 --- a/src/intermediate/subscript.rs +++ b/src/intermediate/subscript.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ISubscript {} impl ISubscript { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Subscript<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Subscript<'parse>, ) -> Result { Ok(ISubscript {}) } diff --git a/src/intermediate/superscript.rs b/src/intermediate/superscript.rs index 50b6eca..fef68c1 100644 --- a/src/intermediate/superscript.rs +++ b/src/intermediate/superscript.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ISuperscript {} impl ISuperscript { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Superscript<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Superscript<'parse>, ) -> Result { Ok(ISuperscript {}) } diff --git a/src/intermediate/table.rs b/src/intermediate/table.rs index 2a94c16..43c44f5 100644 --- a/src/intermediate/table.rs +++ b/src/intermediate/table.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ITable {} impl ITable { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Table<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Table<'parse>, ) -> Result { Ok(ITable {}) } diff --git a/src/intermediate/target.rs b/src/intermediate/target.rs index d5cefe6..43013ad 100644 --- a/src/intermediate/target.rs +++ b/src/intermediate/target.rs @@ -10,9 +10,9 @@ pub(crate) struct ITarget { } impl ITarget { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - target: &organic::types::Target<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + target: &'b organic::types::Target<'parse>, ) -> Result { let id = registry.get_target(target.value); Ok(ITarget { diff --git a/src/intermediate/timestamp.rs b/src/intermediate/timestamp.rs index bb4ff38..f6f95f3 100644 --- a/src/intermediate/timestamp.rs +++ b/src/intermediate/timestamp.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct ITimestamp {} impl ITimestamp { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Timestamp<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Timestamp<'parse>, ) -> Result { Ok(ITimestamp {}) } diff --git a/src/intermediate/underline.rs b/src/intermediate/underline.rs index 31a5e28..4c7b5b9 100644 --- a/src/intermediate/underline.rs +++ b/src/intermediate/underline.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IUnderline {} impl IUnderline { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Underline<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Underline<'parse>, ) -> Result { Ok(IUnderline {}) } diff --git a/src/intermediate/verbatim.rs b/src/intermediate/verbatim.rs index e93e015..bddaf37 100644 --- a/src/intermediate/verbatim.rs +++ b/src/intermediate/verbatim.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IVerbatim {} impl IVerbatim { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::Verbatim<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::Verbatim<'parse>, ) -> Result { Ok(IVerbatim {}) } diff --git a/src/intermediate/verse_block.rs b/src/intermediate/verse_block.rs index 9f14fc0..2e725b7 100644 --- a/src/intermediate/verse_block.rs +++ b/src/intermediate/verse_block.rs @@ -6,9 +6,9 @@ use super::registry::Registry; pub(crate) struct IVerseBlock {} impl IVerseBlock { - pub(crate) async fn new<'intermediate, 'parse>( - registry: &mut Registry<'intermediate, 'parse>, - original: &organic::types::VerseBlock<'parse>, + pub(crate) async fn new<'b, 'parse>( + registry: &'b mut Registry<'parse>, + original: &'b organic::types::VerseBlock<'parse>, ) -> Result { Ok(IVerseBlock {}) } From b66ec507ef740061932cfcfecf2161360ad30788 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 15:36:15 -0400 Subject: [PATCH 07/24] Create a render ast node type. --- .../templates/html/ast_node.dust | 0 .../templates/html/blog_post_page.dust | 4 + .../html/real_footnote_definition.dust | 1 + src/context/ast_node.rs | 407 ++++++++++++++++++ src/context/footnote_definition.rs | 36 ++ src/context/heading.rs | 8 +- src/context/mod.rs | 1 + src/context/paragraph.rs | 4 +- src/context/plain_list.rs | 4 +- src/context/plain_list_item.rs | 8 +- src/context/quote_block.rs | 4 +- src/context/regular_link.rs | 4 +- src/context/section.rs | 4 +- src/intermediate/angle_link.rs | 2 +- src/intermediate/ast_node.rs | 2 +- src/intermediate/babel_call.rs | 2 +- src/intermediate/bold.rs | 2 +- src/intermediate/center_block.rs | 2 +- src/intermediate/citation.rs | 2 +- src/intermediate/citation_reference.rs | 2 +- src/intermediate/clock.rs | 2 +- src/intermediate/code.rs | 2 +- src/intermediate/comment.rs | 2 +- src/intermediate/comment_block.rs | 2 +- src/intermediate/diary_sexp.rs | 2 +- src/intermediate/document_element.rs | 2 +- src/intermediate/drawer.rs | 2 +- src/intermediate/dynamic_block.rs | 2 +- src/intermediate/element.rs | 2 +- src/intermediate/entity.rs | 2 +- src/intermediate/example_block.rs | 2 +- src/intermediate/export_block.rs | 2 +- src/intermediate/export_snippet.rs | 2 +- src/intermediate/fixed_width_area.rs | 2 +- src/intermediate/footnote_definition.rs | 24 +- src/intermediate/footnote_reference.rs | 2 +- src/intermediate/heading.rs | 2 +- src/intermediate/horizontal_rule.rs | 2 +- src/intermediate/inline_babel_call.rs | 2 +- src/intermediate/inline_source_block.rs | 2 +- src/intermediate/italic.rs | 2 +- src/intermediate/keyword.rs | 2 +- src/intermediate/latex_environment.rs | 2 +- src/intermediate/latex_fragment.rs | 2 +- src/intermediate/line_break.rs | 2 +- src/intermediate/mod.rs | 2 + src/intermediate/object.rs | 2 +- src/intermediate/org_macro.rs | 2 +- src/intermediate/page.rs | 14 +- src/intermediate/paragraph.rs | 2 +- src/intermediate/plain_link.rs | 2 +- src/intermediate/plain_list.rs | 2 +- src/intermediate/plain_list_item.rs | 2 +- src/intermediate/plain_text.rs | 2 +- src/intermediate/planning.rs | 2 +- src/intermediate/property_drawer.rs | 2 +- src/intermediate/quote_block.rs | 2 +- src/intermediate/radio_link.rs | 2 +- src/intermediate/radio_target.rs | 2 +- src/intermediate/registry.rs | 7 + src/intermediate/regular_link.rs | 2 +- src/intermediate/section.rs | 2 +- src/intermediate/special_block.rs | 2 +- src/intermediate/src_block.rs | 2 +- src/intermediate/statistics_cookie.rs | 2 +- src/intermediate/strike_through.rs | 2 +- src/intermediate/subscript.rs | 2 +- src/intermediate/superscript.rs | 2 +- src/intermediate/table.rs | 2 +- src/intermediate/target.rs | 2 +- src/intermediate/timestamp.rs | 2 +- src/intermediate/underline.rs | 2 +- src/intermediate/verbatim.rs | 2 +- src/intermediate/verse_block.rs | 2 +- 74 files changed, 566 insertions(+), 80 deletions(-) create mode 100644 default_environment/templates/html/ast_node.dust create mode 100644 default_environment/templates/html/real_footnote_definition.dust create mode 100644 src/context/ast_node.rs diff --git a/default_environment/templates/html/ast_node.dust b/default_environment/templates/html/ast_node.dust new file mode 100644 index 0000000..e69de29 diff --git a/default_environment/templates/html/blog_post_page.dust b/default_environment/templates/html/blog_post_page.dust index 361823b..9ca2f8e 100644 --- a/default_environment/templates/html/blog_post_page.dust +++ b/default_environment/templates/html/blog_post_page.dust @@ -10,5 +10,9 @@ {#.children} {>document_element/} {/.children} + + {?.footnotes} + {>real_footnote_definition/} + {/.footnotes} diff --git a/default_environment/templates/html/real_footnote_definition.dust b/default_environment/templates/html/real_footnote_definition.dust new file mode 100644 index 0000000..9c6be4b --- /dev/null +++ b/default_environment/templates/html/real_footnote_definition.dust @@ -0,0 +1 @@ +
{.label}
{#.contents}{>ast_node/}{/.contents}
diff --git a/src/context/ast_node.rs b/src/context/ast_node.rs new file mode 100644 index 0000000..7a2ffcd --- /dev/null +++ b/src/context/ast_node.rs @@ -0,0 +1,407 @@ +use std::path::Path; + +use serde::Serialize; + +use crate::config::Config; +use crate::error::CustomError; +use crate::intermediate::IAstNode; + +use super::angle_link::RenderAngleLink; +use super::babel_call::RenderBabelCall; +use super::bold::RenderBold; +use super::center_block::RenderCenterBlock; +use super::citation::RenderCitation; +use super::citation_reference::RenderCitationReference; +use super::clock::RenderClock; +use super::code::RenderCode; +use super::comment::RenderComment; +use super::comment_block::RenderCommentBlock; +use super::diary_sexp::RenderDiarySexp; +use super::drawer::RenderDrawer; +use super::dynamic_block::RenderDynamicBlock; +use super::entity::RenderEntity; +use super::example_block::RenderExampleBlock; +use super::export_block::RenderExportBlock; +use super::export_snippet::RenderExportSnippet; +use super::fixed_width_area::RenderFixedWidthArea; +use super::footnote_definition::RenderFootnoteDefinition; +use super::footnote_reference::RenderFootnoteReference; +use super::horizontal_rule::RenderHorizontalRule; +use super::inline_babel_call::RenderInlineBabelCall; +use super::inline_source_block::RenderInlineSourceBlock; +use super::italic::RenderItalic; +use super::keyword::RenderKeyword; +use super::latex_environment::RenderLatexEnvironment; +use super::latex_fragment::RenderLatexFragment; +use super::line_break::RenderLineBreak; +use super::org_macro::RenderOrgMacro; +use super::paragraph::RenderParagraph; +use super::plain_link::RenderPlainLink; +use super::plain_list::RenderPlainList; +use super::plain_text::RenderPlainText; +use super::planning::RenderPlanning; +use super::property_drawer::RenderPropertyDrawer; +use super::quote_block::RenderQuoteBlock; +use super::radio_link::RenderRadioLink; +use super::radio_target::RenderRadioTarget; +use super::regular_link::RenderRegularLink; +use super::special_block::RenderSpecialBlock; +use super::src_block::RenderSrcBlock; +use super::statistics_cookie::RenderStatisticsCookie; +use super::strike_through::RenderStrikeThrough; +use super::subscript::RenderSubscript; +use super::superscript::RenderSuperscript; +use super::table::RenderTable; +use super::target::RenderTarget; +use super::timestamp::RenderTimestamp; +use super::underline::RenderUnderline; +use super::verbatim::RenderVerbatim; +use super::verse_block::RenderVerseBlock; +use super::RenderHeading; +use super::RenderSection; + +#[derive(Debug, Serialize)] +#[serde(untagged)] +pub(crate) enum RenderAstNode { + Heading(RenderHeading), + Section(RenderSection), + Paragraph(RenderParagraph), + PlainList(RenderPlainList), + CenterBlock(RenderCenterBlock), + QuoteBlock(RenderQuoteBlock), + SpecialBlock(RenderSpecialBlock), + DynamicBlock(RenderDynamicBlock), + FootnoteDefinition(RenderFootnoteDefinition), + Comment(RenderComment), + Drawer(RenderDrawer), + PropertyDrawer(RenderPropertyDrawer), + Table(RenderTable), + VerseBlock(RenderVerseBlock), + CommentBlock(RenderCommentBlock), + ExampleBlock(RenderExampleBlock), + ExportBlock(RenderExportBlock), + SrcBlock(RenderSrcBlock), + Clock(RenderClock), + DiarySexp(RenderDiarySexp), + Planning(RenderPlanning), + FixedWidthArea(RenderFixedWidthArea), + HorizontalRule(RenderHorizontalRule), + Keyword(RenderKeyword), + BabelCall(RenderBabelCall), + LatexEnvironment(RenderLatexEnvironment), + Bold(RenderBold), + Italic(RenderItalic), + Underline(RenderUnderline), + StrikeThrough(RenderStrikeThrough), + Code(RenderCode), + Verbatim(RenderVerbatim), + PlainText(RenderPlainText), + RegularLink(RenderRegularLink), + RadioLink(RenderRadioLink), + RadioTarget(RenderRadioTarget), + PlainLink(RenderPlainLink), + AngleLink(RenderAngleLink), + OrgMacro(RenderOrgMacro), + Entity(RenderEntity), + LatexFragment(RenderLatexFragment), + ExportSnippet(RenderExportSnippet), + FootnoteReference(RenderFootnoteReference), + Citation(RenderCitation), + CitationReference(RenderCitationReference), + InlineBabelCall(RenderInlineBabelCall), + InlineSourceBlock(RenderInlineSourceBlock), + LineBreak(RenderLineBreak), + Target(RenderTarget), + StatisticsCookie(RenderStatisticsCookie), + Subscript(RenderSubscript), + Superscript(RenderSuperscript), + Timestamp(RenderTimestamp), +} + +pub(crate) trait IntoRenderAstNode { + fn into_render_ast_node( + &self, + config: &Config, + output_directory: &Path, + output_file: &Path, + ) -> Result; +} + +impl IntoRenderAstNode for IAstNode { + fn into_render_ast_node( + &self, + config: &Config, + output_directory: &Path, + output_file: &Path, + ) -> Result { + match self { + IAstNode::Heading(inner) => Ok(RenderAstNode::Heading(RenderHeading::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Section(inner) => Ok(RenderAstNode::Section(RenderSection::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Paragraph(inner) => Ok(RenderAstNode::Paragraph(RenderParagraph::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::PlainList(inner) => Ok(RenderAstNode::PlainList(RenderPlainList::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::CenterBlock(inner) => Ok(RenderAstNode::CenterBlock(RenderCenterBlock::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::QuoteBlock(inner) => Ok(RenderAstNode::QuoteBlock(RenderQuoteBlock::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::SpecialBlock(inner) => Ok(RenderAstNode::SpecialBlock( + RenderSpecialBlock::new(config, output_directory, output_file, inner)?, + )), + IAstNode::DynamicBlock(inner) => Ok(RenderAstNode::DynamicBlock( + RenderDynamicBlock::new(config, output_directory, output_file, inner)?, + )), + IAstNode::FootnoteDefinition(inner) => Ok(RenderAstNode::FootnoteDefinition( + RenderFootnoteDefinition::new(config, output_directory, output_file, inner)?, + )), + IAstNode::Comment(inner) => Ok(RenderAstNode::Comment(RenderComment::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Drawer(inner) => Ok(RenderAstNode::Drawer(RenderDrawer::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::PropertyDrawer(inner) => Ok(RenderAstNode::PropertyDrawer( + RenderPropertyDrawer::new(config, output_directory, output_file, inner)?, + )), + IAstNode::Table(inner) => Ok(RenderAstNode::Table(RenderTable::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::VerseBlock(inner) => Ok(RenderAstNode::VerseBlock(RenderVerseBlock::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::CommentBlock(inner) => Ok(RenderAstNode::CommentBlock( + RenderCommentBlock::new(config, output_directory, output_file, inner)?, + )), + IAstNode::ExampleBlock(inner) => Ok(RenderAstNode::ExampleBlock( + RenderExampleBlock::new(config, output_directory, output_file, inner)?, + )), + IAstNode::ExportBlock(inner) => Ok(RenderAstNode::ExportBlock(RenderExportBlock::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::SrcBlock(inner) => Ok(RenderAstNode::SrcBlock(RenderSrcBlock::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Clock(inner) => Ok(RenderAstNode::Clock(RenderClock::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::DiarySexp(inner) => Ok(RenderAstNode::DiarySexp(RenderDiarySexp::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Planning(inner) => Ok(RenderAstNode::Planning(RenderPlanning::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::FixedWidthArea(inner) => Ok(RenderAstNode::FixedWidthArea( + RenderFixedWidthArea::new(config, output_directory, output_file, inner)?, + )), + IAstNode::HorizontalRule(inner) => Ok(RenderAstNode::HorizontalRule( + RenderHorizontalRule::new(config, output_directory, output_file, inner)?, + )), + IAstNode::Keyword(inner) => Ok(RenderAstNode::Keyword(RenderKeyword::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::BabelCall(inner) => Ok(RenderAstNode::BabelCall(RenderBabelCall::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::LatexEnvironment(inner) => Ok(RenderAstNode::LatexEnvironment( + RenderLatexEnvironment::new(config, output_directory, output_file, inner)?, + )), + IAstNode::Bold(inner) => Ok(RenderAstNode::Bold(RenderBold::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Italic(inner) => Ok(RenderAstNode::Italic(RenderItalic::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Underline(inner) => Ok(RenderAstNode::Underline(RenderUnderline::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::StrikeThrough(inner) => Ok(RenderAstNode::StrikeThrough( + RenderStrikeThrough::new(config, output_directory, output_file, inner)?, + )), + IAstNode::Code(inner) => Ok(RenderAstNode::Code(RenderCode::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Verbatim(inner) => Ok(RenderAstNode::Verbatim(RenderVerbatim::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::PlainText(inner) => Ok(RenderAstNode::PlainText(RenderPlainText::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::RegularLink(inner) => Ok(RenderAstNode::RegularLink(RenderRegularLink::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::RadioLink(inner) => Ok(RenderAstNode::RadioLink(RenderRadioLink::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::RadioTarget(inner) => Ok(RenderAstNode::RadioTarget(RenderRadioTarget::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::PlainLink(inner) => Ok(RenderAstNode::PlainLink(RenderPlainLink::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::AngleLink(inner) => Ok(RenderAstNode::AngleLink(RenderAngleLink::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::OrgMacro(inner) => Ok(RenderAstNode::OrgMacro(RenderOrgMacro::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Entity(inner) => Ok(RenderAstNode::Entity(RenderEntity::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::LatexFragment(inner) => Ok(RenderAstNode::LatexFragment( + RenderLatexFragment::new(config, output_directory, output_file, inner)?, + )), + IAstNode::ExportSnippet(inner) => Ok(RenderAstNode::ExportSnippet( + RenderExportSnippet::new(config, output_directory, output_file, inner)?, + )), + IAstNode::FootnoteReference(inner) => Ok(RenderAstNode::FootnoteReference( + RenderFootnoteReference::new(config, output_directory, output_file, inner)?, + )), + IAstNode::Citation(inner) => Ok(RenderAstNode::Citation(RenderCitation::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::CitationReference(inner) => Ok(RenderAstNode::CitationReference( + RenderCitationReference::new(config, output_directory, output_file, inner)?, + )), + IAstNode::InlineBabelCall(inner) => Ok(RenderAstNode::InlineBabelCall( + RenderInlineBabelCall::new(config, output_directory, output_file, inner)?, + )), + IAstNode::InlineSourceBlock(inner) => Ok(RenderAstNode::InlineSourceBlock( + RenderInlineSourceBlock::new(config, output_directory, output_file, inner)?, + )), + IAstNode::LineBreak(inner) => Ok(RenderAstNode::LineBreak(RenderLineBreak::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Target(inner) => Ok(RenderAstNode::Target(RenderTarget::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::StatisticsCookie(inner) => Ok(RenderAstNode::StatisticsCookie( + RenderStatisticsCookie::new(config, output_directory, output_file, inner)?, + )), + IAstNode::Subscript(inner) => Ok(RenderAstNode::Subscript(RenderSubscript::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Superscript(inner) => Ok(RenderAstNode::Superscript(RenderSuperscript::new( + config, + output_directory, + output_file, + inner, + )?)), + IAstNode::Timestamp(inner) => Ok(RenderAstNode::Timestamp(RenderTimestamp::new( + config, + output_directory, + output_file, + inner, + )?)), + } + } +} diff --git a/src/context/footnote_definition.rs b/src/context/footnote_definition.rs index 589658e..1734c66 100644 --- a/src/context/footnote_definition.rs +++ b/src/context/footnote_definition.rs @@ -5,6 +5,10 @@ use serde::Serialize; use crate::config::Config; use crate::error::CustomError; use crate::intermediate::IFootnoteDefinition; +use crate::intermediate::IRealFootnoteDefinition; + +use super::ast_node::IntoRenderAstNode; +use super::ast_node::RenderAstNode; #[derive(Debug, Serialize)] #[serde(tag = "type")] @@ -21,3 +25,35 @@ impl RenderFootnoteDefinition { Ok(RenderFootnoteDefinition {}) } } + +#[derive(Debug, Serialize)] +#[serde(tag = "type")] +#[serde(rename = "footnote_reference")] +pub(crate) struct RenderRealFootnoteDefinition { + definition_id: String, + reference_link: String, + contents: Vec, +} + +impl RenderRealFootnoteDefinition { + pub(crate) fn new( + config: &Config, + output_directory: &Path, + output_file: &Path, + original: &IRealFootnoteDefinition, + ) -> Result { + let contents = { + let mut ret = Vec::new(); + for obj in original.contents.iter() { + ret.push(obj.into_render_ast_node(config, output_directory, output_file)?); + } + ret + }; + + Ok(RenderRealFootnoteDefinition { + definition_id: original.get_definition_id(), + reference_link: format!("#{}", original.get_reference_id()), + contents, + }) + } +} diff --git a/src/context/heading.rs b/src/context/heading.rs index ec6399f..d69f659 100644 --- a/src/context/heading.rs +++ b/src/context/heading.rs @@ -30,8 +30,8 @@ impl RenderHeading { for obj in heading.title.iter() { ret.push(RenderObject::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } @@ -43,8 +43,8 @@ impl RenderHeading { for obj in heading.children.iter() { ret.push(RenderDocumentElement::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } diff --git a/src/context/mod.rs b/src/context/mod.rs index 25ae64c..eb6a770 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -1,4 +1,5 @@ mod angle_link; +mod ast_node; mod babel_call; mod blog_post_page; mod bold; diff --git a/src/context/paragraph.rs b/src/context/paragraph.rs index 2e0e1c3..c211535 100644 --- a/src/context/paragraph.rs +++ b/src/context/paragraph.rs @@ -27,8 +27,8 @@ impl RenderParagraph { for obj in paragraph.children.iter() { ret.push(RenderObject::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } diff --git a/src/context/plain_list.rs b/src/context/plain_list.rs index b6b61b9..25840b8 100644 --- a/src/context/plain_list.rs +++ b/src/context/plain_list.rs @@ -33,8 +33,8 @@ impl RenderPlainList { for obj in original.children.iter() { ret.push(RenderPlainListItem::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } diff --git a/src/context/plain_list_item.rs b/src/context/plain_list_item.rs index 0cfe106..df18dee 100644 --- a/src/context/plain_list_item.rs +++ b/src/context/plain_list_item.rs @@ -29,8 +29,8 @@ impl RenderPlainListItem { for obj in original.tag.iter() { ret.push(RenderObject::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } @@ -42,8 +42,8 @@ impl RenderPlainListItem { for obj in original.children.iter() { ret.push(RenderElement::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } diff --git a/src/context/quote_block.rs b/src/context/quote_block.rs index 8a5d7f0..5866442 100644 --- a/src/context/quote_block.rs +++ b/src/context/quote_block.rs @@ -27,8 +27,8 @@ impl RenderQuoteBlock { for obj in original.children.iter() { ret.push(RenderElement::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } diff --git a/src/context/regular_link.rs b/src/context/regular_link.rs index 0cecb38..58ccd4a 100644 --- a/src/context/regular_link.rs +++ b/src/context/regular_link.rs @@ -28,8 +28,8 @@ impl RenderRegularLink { for obj in regular_link.children.iter() { ret.push(RenderObject::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } diff --git a/src/context/section.rs b/src/context/section.rs index 45d66bf..87c5a12 100644 --- a/src/context/section.rs +++ b/src/context/section.rs @@ -27,8 +27,8 @@ impl RenderSection { for obj in section.children.iter() { ret.push(RenderElement::new( config, - &output_directory, - &output_file, + output_directory, + output_file, obj, )?); } diff --git a/src/intermediate/angle_link.rs b/src/intermediate/angle_link.rs index a92e3a7..888d339 100644 --- a/src/intermediate/angle_link.rs +++ b/src/intermediate/angle_link.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IAngleLink {} impl IAngleLink { diff --git a/src/intermediate/ast_node.rs b/src/intermediate/ast_node.rs index 82bd540..189bc7b 100644 --- a/src/intermediate/ast_node.rs +++ b/src/intermediate/ast_node.rs @@ -55,7 +55,7 @@ use super::IVerseBlock; use crate::error::CustomError; use futures::future::{BoxFuture, FutureExt}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) enum IAstNode { Heading(IHeading), Section(ISection), diff --git a/src/intermediate/babel_call.rs b/src/intermediate/babel_call.rs index 8e92165..957bd11 100644 --- a/src/intermediate/babel_call.rs +++ b/src/intermediate/babel_call.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IBabelCall {} impl IBabelCall { diff --git a/src/intermediate/bold.rs b/src/intermediate/bold.rs index 3d94ae7..f69cbe7 100644 --- a/src/intermediate/bold.rs +++ b/src/intermediate/bold.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IBold {} impl IBold { diff --git a/src/intermediate/center_block.rs b/src/intermediate/center_block.rs index 8b95dab..bc37461 100644 --- a/src/intermediate/center_block.rs +++ b/src/intermediate/center_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ICenterBlock {} impl ICenterBlock { diff --git a/src/intermediate/citation.rs b/src/intermediate/citation.rs index e14cffd..b9b5176 100644 --- a/src/intermediate/citation.rs +++ b/src/intermediate/citation.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ICitation {} impl ICitation { diff --git a/src/intermediate/citation_reference.rs b/src/intermediate/citation_reference.rs index 30e2a77..ce46683 100644 --- a/src/intermediate/citation_reference.rs +++ b/src/intermediate/citation_reference.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ICitationReference {} impl ICitationReference { diff --git a/src/intermediate/clock.rs b/src/intermediate/clock.rs index 4db4185..30626f0 100644 --- a/src/intermediate/clock.rs +++ b/src/intermediate/clock.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IClock {} impl IClock { diff --git a/src/intermediate/code.rs b/src/intermediate/code.rs index 0eb3a76..634e5f2 100644 --- a/src/intermediate/code.rs +++ b/src/intermediate/code.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ICode {} impl ICode { diff --git a/src/intermediate/comment.rs b/src/intermediate/comment.rs index d54cee7..75b8cf8 100644 --- a/src/intermediate/comment.rs +++ b/src/intermediate/comment.rs @@ -3,7 +3,7 @@ use crate::error::CustomError; use super::registry::Registry; /// Essentially a no-op since the comment is not rendered. -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IComment {} impl IComment { diff --git a/src/intermediate/comment_block.rs b/src/intermediate/comment_block.rs index b2cdc73..2560408 100644 --- a/src/intermediate/comment_block.rs +++ b/src/intermediate/comment_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ICommentBlock {} impl ICommentBlock { diff --git a/src/intermediate/diary_sexp.rs b/src/intermediate/diary_sexp.rs index 664bdec..3a65fbf 100644 --- a/src/intermediate/diary_sexp.rs +++ b/src/intermediate/diary_sexp.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IDiarySexp {} impl IDiarySexp { diff --git a/src/intermediate/document_element.rs b/src/intermediate/document_element.rs index d348269..2e0591e 100644 --- a/src/intermediate/document_element.rs +++ b/src/intermediate/document_element.rs @@ -5,7 +5,7 @@ use super::IHeading; use super::ISection; use futures::future::{BoxFuture, FutureExt}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) enum IDocumentElement { Heading(IHeading), Section(ISection), diff --git a/src/intermediate/drawer.rs b/src/intermediate/drawer.rs index 506428f..6efaf1d 100644 --- a/src/intermediate/drawer.rs +++ b/src/intermediate/drawer.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IDrawer {} impl IDrawer { diff --git a/src/intermediate/dynamic_block.rs b/src/intermediate/dynamic_block.rs index 6e31c19..3f3f419 100644 --- a/src/intermediate/dynamic_block.rs +++ b/src/intermediate/dynamic_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IDynamicBlock {} impl IDynamicBlock { diff --git a/src/intermediate/element.rs b/src/intermediate/element.rs index 1fe3360..2deaf6a 100644 --- a/src/intermediate/element.rs +++ b/src/intermediate/element.rs @@ -27,7 +27,7 @@ use super::ITable; use super::IVerseBlock; use futures::future::{BoxFuture, FutureExt}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) enum IElement { Paragraph(IParagraph), PlainList(IPlainList), diff --git a/src/intermediate/entity.rs b/src/intermediate/entity.rs index a2fa594..1323143 100644 --- a/src/intermediate/entity.rs +++ b/src/intermediate/entity.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IEntity { pub(crate) html: String, } diff --git a/src/intermediate/example_block.rs b/src/intermediate/example_block.rs index c10c77c..7ea73b3 100644 --- a/src/intermediate/example_block.rs +++ b/src/intermediate/example_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IExampleBlock {} impl IExampleBlock { diff --git a/src/intermediate/export_block.rs b/src/intermediate/export_block.rs index d9fa9f8..86afacc 100644 --- a/src/intermediate/export_block.rs +++ b/src/intermediate/export_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IExportBlock {} impl IExportBlock { diff --git a/src/intermediate/export_snippet.rs b/src/intermediate/export_snippet.rs index 3759564..dd0bc5b 100644 --- a/src/intermediate/export_snippet.rs +++ b/src/intermediate/export_snippet.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IExportSnippet {} impl IExportSnippet { diff --git a/src/intermediate/fixed_width_area.rs b/src/intermediate/fixed_width_area.rs index 6147514..e3736c4 100644 --- a/src/intermediate/fixed_width_area.rs +++ b/src/intermediate/fixed_width_area.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IFixedWidthArea {} impl IFixedWidthArea { diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index ea2774a..011242e 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -5,7 +5,7 @@ use super::registry::Registry; use super::IElement; use super::IObject; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IFootnoteDefinition {} impl IFootnoteDefinition { @@ -22,8 +22,8 @@ impl IFootnoteDefinition { #[derive(Debug)] pub(crate) struct IRealFootnoteDefinition { - footnote_id: usize, - contents: Vec, + pub(crate) footnote_id: usize, + pub(crate) contents: Vec, } impl IRealFootnoteDefinition { @@ -37,4 +37,22 @@ impl IRealFootnoteDefinition { contents, }) } + + pub(crate) fn get_display_label(&self) -> String { + format!("{}", self.footnote_id + 1) + } + + /// Get an ID to refer to the first reference to this footnote definition. + /// + /// This ID could, for example, be used for the id attribute in HTML for the reference anchor tag. + pub(crate) fn get_reference_id(&self) -> String { + format!("fnr.{}", self.get_display_label()) + } + + /// Get an ID to refer to the footnote definition. + /// + /// This ID could, for example, be used for the id attribute in HTML for the definition anchor tag. + pub(crate) fn get_definition_id(&self) -> String { + format!("fn.{}", self.get_display_label()) + } } diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index d0ef6bb..c04951a 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IFootnoteReference { footnote_id: usize, duplicate_offset: usize, diff --git a/src/intermediate/heading.rs b/src/intermediate/heading.rs index 2d6bfd9..a5e3e66 100644 --- a/src/intermediate/heading.rs +++ b/src/intermediate/heading.rs @@ -4,7 +4,7 @@ use super::registry::Registry; use super::IDocumentElement; use super::IObject; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IHeading { pub(crate) level: organic::types::HeadlineLevel, pub(crate) title: Vec, diff --git a/src/intermediate/horizontal_rule.rs b/src/intermediate/horizontal_rule.rs index ca7b2e5..59795ee 100644 --- a/src/intermediate/horizontal_rule.rs +++ b/src/intermediate/horizontal_rule.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IHorizontalRule {} impl IHorizontalRule { diff --git a/src/intermediate/inline_babel_call.rs b/src/intermediate/inline_babel_call.rs index 659a7c7..8e5e56d 100644 --- a/src/intermediate/inline_babel_call.rs +++ b/src/intermediate/inline_babel_call.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IInlineBabelCall {} impl IInlineBabelCall { diff --git a/src/intermediate/inline_source_block.rs b/src/intermediate/inline_source_block.rs index 2f798f1..41492bb 100644 --- a/src/intermediate/inline_source_block.rs +++ b/src/intermediate/inline_source_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IInlineSourceBlock { pub(crate) value: String, } diff --git a/src/intermediate/italic.rs b/src/intermediate/italic.rs index 91677b8..8cb0140 100644 --- a/src/intermediate/italic.rs +++ b/src/intermediate/italic.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IItalic {} impl IItalic { diff --git a/src/intermediate/keyword.rs b/src/intermediate/keyword.rs index c0d7567..c187f87 100644 --- a/src/intermediate/keyword.rs +++ b/src/intermediate/keyword.rs @@ -3,7 +3,7 @@ use crate::error::CustomError; use super::registry::Registry; /// Essentially a no-op since the keyword is not rendered and any relevant impact on other elements is pulled from the parsed form of keyword. -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IKeyword {} impl IKeyword { diff --git a/src/intermediate/latex_environment.rs b/src/intermediate/latex_environment.rs index 05d82cb..6699078 100644 --- a/src/intermediate/latex_environment.rs +++ b/src/intermediate/latex_environment.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ILatexEnvironment {} impl ILatexEnvironment { diff --git a/src/intermediate/latex_fragment.rs b/src/intermediate/latex_fragment.rs index 804985c..82e03d9 100644 --- a/src/intermediate/latex_fragment.rs +++ b/src/intermediate/latex_fragment.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ILatexFragment {} impl ILatexFragment { diff --git a/src/intermediate/line_break.rs b/src/intermediate/line_break.rs index 9534d07..8c87978 100644 --- a/src/intermediate/line_break.rs +++ b/src/intermediate/line_break.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ILineBreak {} impl ILineBreak { diff --git a/src/intermediate/mod.rs b/src/intermediate/mod.rs index dd316f9..0281285 100644 --- a/src/intermediate/mod.rs +++ b/src/intermediate/mod.rs @@ -62,6 +62,7 @@ mod util; mod verbatim; mod verse_block; pub(crate) use angle_link::IAngleLink; +pub(crate) use ast_node::IAstNode; pub(crate) use babel_call::IBabelCall; pub(crate) use bold::IBold; pub(crate) use center_block::ICenterBlock; @@ -84,6 +85,7 @@ pub(crate) use export_block::IExportBlock; pub(crate) use export_snippet::IExportSnippet; pub(crate) use fixed_width_area::IFixedWidthArea; pub(crate) use footnote_definition::IFootnoteDefinition; +pub(crate) use footnote_definition::IRealFootnoteDefinition; pub(crate) use footnote_reference::IFootnoteReference; pub(crate) use heading::IHeading; pub(crate) use horizontal_rule::IHorizontalRule; diff --git a/src/intermediate/object.rs b/src/intermediate/object.rs index c51584a..3eee490 100644 --- a/src/intermediate/object.rs +++ b/src/intermediate/object.rs @@ -30,7 +30,7 @@ use super::verbatim::IVerbatim; use super::ITarget; use futures::future::{BoxFuture, FutureExt}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) enum IObject { Bold(IBold), Italic(IItalic), diff --git a/src/intermediate/org_macro.rs b/src/intermediate/org_macro.rs index f231a38..7fb3fe5 100644 --- a/src/intermediate/org_macro.rs +++ b/src/intermediate/org_macro.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IOrgMacro {} impl IOrgMacro { diff --git a/src/intermediate/page.rs b/src/intermediate/page.rs index 66514e2..0333f75 100644 --- a/src/intermediate/page.rs +++ b/src/intermediate/page.rs @@ -39,13 +39,23 @@ impl BlogPostPage { )); } - // TODO: Get footnote definitions + let footnotes = { + let footnote_definitions: Vec<_> = registry + .get_footnote_ids() + .map(|(id, def)| (id, def.clone())) + .collect(); + let mut ret = Vec::new(); + for (id, def) in footnote_definitions.into_iter() { + ret.push(IRealFootnoteDefinition::new(registry, id, def).await?); + } + ret + }; Ok(BlogPostPage { path, title: get_title(&document), children, - footnotes: Vec::new(), // TODO + footnotes, }) } diff --git a/src/intermediate/paragraph.rs b/src/intermediate/paragraph.rs index f41dc70..d9b0893 100644 --- a/src/intermediate/paragraph.rs +++ b/src/intermediate/paragraph.rs @@ -3,7 +3,7 @@ use crate::error::CustomError; use super::registry::Registry; use super::IObject; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IParagraph { pub(crate) children: Vec, } diff --git a/src/intermediate/plain_link.rs b/src/intermediate/plain_link.rs index f79d0de..a6503c3 100644 --- a/src/intermediate/plain_link.rs +++ b/src/intermediate/plain_link.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IPlainLink {} impl IPlainLink { diff --git a/src/intermediate/plain_list.rs b/src/intermediate/plain_list.rs index 5b74769..17ac7cb 100644 --- a/src/intermediate/plain_list.rs +++ b/src/intermediate/plain_list.rs @@ -3,7 +3,7 @@ use crate::error::CustomError; use super::registry::Registry; use super::IPlainListItem; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IPlainList { pub(crate) list_type: organic::types::PlainListType, pub(crate) children: Vec, diff --git a/src/intermediate/plain_list_item.rs b/src/intermediate/plain_list_item.rs index b0308fb..9e8f7ad 100644 --- a/src/intermediate/plain_list_item.rs +++ b/src/intermediate/plain_list_item.rs @@ -4,7 +4,7 @@ use super::registry::Registry; use super::IElement; use super::IObject; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IPlainListItem { pub(crate) tag: Vec, pub(crate) children: Vec, diff --git a/src/intermediate/plain_text.rs b/src/intermediate/plain_text.rs index c75ae2d..30114ab 100644 --- a/src/intermediate/plain_text.rs +++ b/src/intermediate/plain_text.rs @@ -3,7 +3,7 @@ use crate::intermediate::util::coalesce_whitespace; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IPlainText { pub(crate) source: String, } diff --git a/src/intermediate/planning.rs b/src/intermediate/planning.rs index f6a689c..968f288 100644 --- a/src/intermediate/planning.rs +++ b/src/intermediate/planning.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IPlanning {} impl IPlanning { diff --git a/src/intermediate/property_drawer.rs b/src/intermediate/property_drawer.rs index 70bea94..000946a 100644 --- a/src/intermediate/property_drawer.rs +++ b/src/intermediate/property_drawer.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IPropertyDrawer {} impl IPropertyDrawer { diff --git a/src/intermediate/quote_block.rs b/src/intermediate/quote_block.rs index b08429e..db7c062 100644 --- a/src/intermediate/quote_block.rs +++ b/src/intermediate/quote_block.rs @@ -3,7 +3,7 @@ use crate::error::CustomError; use super::registry::Registry; use super::IElement; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IQuoteBlock { pub(crate) children: Vec, } diff --git a/src/intermediate/radio_link.rs b/src/intermediate/radio_link.rs index fff2e36..0f382ee 100644 --- a/src/intermediate/radio_link.rs +++ b/src/intermediate/radio_link.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IRadioLink {} impl IRadioLink { diff --git a/src/intermediate/radio_target.rs b/src/intermediate/radio_target.rs index 0efcbce..e8f4735 100644 --- a/src/intermediate/radio_target.rs +++ b/src/intermediate/radio_target.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IRadioTarget {} impl IRadioTarget { diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index da5183b..a7a847f 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -31,6 +31,13 @@ impl<'parse> Registry<'parse> { }) } + pub(crate) fn get_footnote_ids(&self) -> impl Iterator)> { + self.footnote_ids + .iter() + .map(|(_label, definition)| definition) + .enumerate() + } + /// Get a 0-indexed ID for a footnote. /// /// This needs to be incremented to be 1-indexed for render. diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index 36ec9ae..87b34b2 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -3,7 +3,7 @@ use crate::error::CustomError; use super::registry::Registry; use super::IObject; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IRegularLink { pub(crate) raw_link: String, pub(crate) children: Vec, diff --git a/src/intermediate/section.rs b/src/intermediate/section.rs index 6642061..658a3d2 100644 --- a/src/intermediate/section.rs +++ b/src/intermediate/section.rs @@ -3,7 +3,7 @@ use crate::error::CustomError; use super::registry::Registry; use super::IElement; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ISection { pub(crate) children: Vec, } diff --git a/src/intermediate/special_block.rs b/src/intermediate/special_block.rs index b10cff0..952468b 100644 --- a/src/intermediate/special_block.rs +++ b/src/intermediate/special_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ISpecialBlock {} impl ISpecialBlock { diff --git a/src/intermediate/src_block.rs b/src/intermediate/src_block.rs index ddf9534..d5a4c92 100644 --- a/src/intermediate/src_block.rs +++ b/src/intermediate/src_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ISrcBlock { pub(crate) lines: Vec, } diff --git a/src/intermediate/statistics_cookie.rs b/src/intermediate/statistics_cookie.rs index 0b0a3db..b2915eb 100644 --- a/src/intermediate/statistics_cookie.rs +++ b/src/intermediate/statistics_cookie.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IStatisticsCookie {} impl IStatisticsCookie { diff --git a/src/intermediate/strike_through.rs b/src/intermediate/strike_through.rs index ca80c17..c81ee12 100644 --- a/src/intermediate/strike_through.rs +++ b/src/intermediate/strike_through.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IStrikeThrough {} impl IStrikeThrough { diff --git a/src/intermediate/subscript.rs b/src/intermediate/subscript.rs index 3a79239..18c57ef 100644 --- a/src/intermediate/subscript.rs +++ b/src/intermediate/subscript.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ISubscript {} impl ISubscript { diff --git a/src/intermediate/superscript.rs b/src/intermediate/superscript.rs index fef68c1..247e250 100644 --- a/src/intermediate/superscript.rs +++ b/src/intermediate/superscript.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ISuperscript {} impl ISuperscript { diff --git a/src/intermediate/table.rs b/src/intermediate/table.rs index 43c44f5..e5ceb9d 100644 --- a/src/intermediate/table.rs +++ b/src/intermediate/table.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ITable {} impl ITable { diff --git a/src/intermediate/target.rs b/src/intermediate/target.rs index 43013ad..4bc57ec 100644 --- a/src/intermediate/target.rs +++ b/src/intermediate/target.rs @@ -3,7 +3,7 @@ use crate::intermediate::util::coalesce_whitespace; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ITarget { pub(crate) id: String, value: String, diff --git a/src/intermediate/timestamp.rs b/src/intermediate/timestamp.rs index f6f95f3..f590f64 100644 --- a/src/intermediate/timestamp.rs +++ b/src/intermediate/timestamp.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct ITimestamp {} impl ITimestamp { diff --git a/src/intermediate/underline.rs b/src/intermediate/underline.rs index 4c7b5b9..a2e5c83 100644 --- a/src/intermediate/underline.rs +++ b/src/intermediate/underline.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IUnderline {} impl IUnderline { diff --git a/src/intermediate/verbatim.rs b/src/intermediate/verbatim.rs index bddaf37..4d60d54 100644 --- a/src/intermediate/verbatim.rs +++ b/src/intermediate/verbatim.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IVerbatim {} impl IVerbatim { diff --git a/src/intermediate/verse_block.rs b/src/intermediate/verse_block.rs index 2e725b7..bd37207 100644 --- a/src/intermediate/verse_block.rs +++ b/src/intermediate/verse_block.rs @@ -2,7 +2,7 @@ use crate::error::CustomError; use super::registry::Registry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct IVerseBlock {} impl IVerseBlock { From 3720558d9361da2090832e009b3afbfe6c5e45c2 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 15:50:09 -0400 Subject: [PATCH 08/24] Render the footnote definitions. --- .../templates/html/ast_node.dust | 57 +++++++++++++++++++ .../templates/html/blog_post_page.dust | 5 +- src/context/blog_post_page.rs | 5 ++ src/context/footnote_definition.rs | 2 + src/context/mod.rs | 1 + src/intermediate/convert.rs | 17 ++++++ 6 files changed, 86 insertions(+), 1 deletion(-) diff --git a/default_environment/templates/html/ast_node.dust b/default_environment/templates/html/ast_node.dust index e69de29..cb3b7a9 100644 --- a/default_environment/templates/html/ast_node.dust +++ b/default_environment/templates/html/ast_node.dust @@ -0,0 +1,57 @@ +{@select key=.type} + {@eq value="heading"}{>heading/}{/eq} + {@eq value="section"}{>section/}{/eq} + {@eq value="paragraph"}{>paragraph/}{/eq} + {@eq value="plain_list"}{>plain_list/}{/eq} + {@eq value="center_block"}{>center_block/}{/eq} + {@eq value="quote_block"}{>quote_block/}{/eq} + {@eq value="special_block"}{>special_block/}{/eq} + {@eq value="dynamic_block"}{>dynamic_block/}{/eq} + {@eq value="footnote_definition"}{>footnote_definition/}{/eq} + {@eq value="comment"}{>comment/}{/eq} + {@eq value="drawer"}{>drawer/}{/eq} + {@eq value="property_drawer"}{>property_drawer/}{/eq} + {@eq value="table"}{>table/}{/eq} + {@eq value="verse_block"}{>verse_block/}{/eq} + {@eq value="comment_block"}{>comment_block/}{/eq} + {@eq value="example_block"}{>example_block/}{/eq} + {@eq value="export_block"}{>export_block/}{/eq} + {@eq value="src_block"}{>src_block/}{/eq} + {@eq value="clock"}{>clock/}{/eq} + {@eq value="diary_sexp"}{>diary_sexp/}{/eq} + {@eq value="planning"}{>planning/}{/eq} + {@eq value="fixed_width_area"}{>fixed_width_area/}{/eq} + {@eq value="horizontal_rule"}{>horizontal_rule/}{/eq} + {@eq value="keyword"}{>keyword/}{/eq} + {@eq value="babel_call"}{>babel_call/}{/eq} + {@eq value="latex_environment"}{>latex_environment/}{/eq} + {@eq value="bold"}{>bold/}{/eq} + {@eq value="italic"}{>italic/}{/eq} + {@eq value="underline"}{>underline/}{/eq} + {@eq value="strike_through"}{>strike_through/}{/eq} + {@eq value="code"}{>code/}{/eq} + {@eq value="verbatim"}{>verbatim/}{/eq} + {@eq value="plain_text"}{>plain_text/}{/eq} + {@eq value="regular_link"}{>regular_link/}{/eq} + {@eq value="radio_link"}{>radio_link/}{/eq} + {@eq value="radio_target"}{>radio_target/}{/eq} + {@eq value="plain_link"}{>plain_link/}{/eq} + {@eq value="angle_link"}{>angle_link/}{/eq} + {@eq value="org_macro"}{>org_macro/}{/eq} + {@eq value="entity"}{>entity/}{/eq} + {@eq value="latex_fragment"}{>latex_fragment/}{/eq} + {@eq value="export_snippet"}{>export_snippet/}{/eq} + {@eq value="footnote_reference"}{>footnote_reference/}{/eq} + {@eq value="citation"}{>citation/}{/eq} + {@eq value="citation_reference"}{>citation_reference/}{/eq} + {@eq value="inline_babel_call"}{>inline_babel_call/}{/eq} + {@eq value="inline_source_block"}{>inline_source_block/}{/eq} + {@eq value="line_break"}{>line_break/}{/eq} + {@eq value="target"}{>target/}{/eq} + {@eq value="statistics_cookie"}{>statistics_cookie/}{/eq} + {@eq value="subscript"}{>subscript/}{/eq} + {@eq value="superscript"}{>superscript/}{/eq} + {@eq value="timestamp"}{>timestamp/}{/eq} + {@none}{!TODO: make this panic!}ERROR: Unrecognized type {.type}.{/none} +{/select} +{! TODO: Maybe the final space should be conditional on end blank in the org source !} diff --git a/default_environment/templates/html/blog_post_page.dust b/default_environment/templates/html/blog_post_page.dust index 9ca2f8e..067b223 100644 --- a/default_environment/templates/html/blog_post_page.dust +++ b/default_environment/templates/html/blog_post_page.dust @@ -12,7 +12,10 @@ {/.children} {?.footnotes} - {>real_footnote_definition/} +

Footnotes:

+ {#.footnotes} + {>real_footnote_definition/} + {/.footnotes} {/.footnotes} diff --git a/src/context/blog_post_page.rs b/src/context/blog_post_page.rs index 9f607ce..a8720f7 100644 --- a/src/context/blog_post_page.rs +++ b/src/context/blog_post_page.rs @@ -1,5 +1,6 @@ use serde::Serialize; +use super::footnote_definition::RenderRealFootnoteDefinition; use super::GlobalSettings; use super::RenderDocumentElement; @@ -15,6 +16,8 @@ pub(crate) struct RenderBlogPostPage { self_link: Option, children: Vec, + + footnotes: Vec, } impl RenderBlogPostPage { @@ -23,12 +26,14 @@ impl RenderBlogPostPage { title: Option, self_link: Option, children: Vec, + footnotes: Vec, ) -> RenderBlogPostPage { RenderBlogPostPage { global_settings, title, self_link, children, + footnotes, } } } diff --git a/src/context/footnote_definition.rs b/src/context/footnote_definition.rs index 1734c66..877ec42 100644 --- a/src/context/footnote_definition.rs +++ b/src/context/footnote_definition.rs @@ -32,6 +32,7 @@ impl RenderFootnoteDefinition { pub(crate) struct RenderRealFootnoteDefinition { definition_id: String, reference_link: String, + label: String, contents: Vec, } @@ -53,6 +54,7 @@ impl RenderRealFootnoteDefinition { Ok(RenderRealFootnoteDefinition { definition_id: original.get_definition_id(), reference_link: format!("#{}", original.get_reference_id()), + label: original.get_display_label(), contents, }) } diff --git a/src/context/mod.rs b/src/context/mod.rs index eb6a770..129ebca 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -62,6 +62,7 @@ mod verse_block; pub(crate) use blog_post_page::RenderBlogPostPage; pub(crate) use document_element::RenderDocumentElement; pub(crate) use element::RenderElement; +pub(crate) use footnote_definition::RenderRealFootnoteDefinition; pub(crate) use global_settings::GlobalSettings; pub(crate) use heading::RenderHeading; pub(crate) use object::RenderObject; diff --git a/src/intermediate/convert.rs b/src/intermediate/convert.rs index ee9bdfa..6bdb654 100644 --- a/src/intermediate/convert.rs +++ b/src/intermediate/convert.rs @@ -6,6 +6,7 @@ use crate::config::Config; use crate::context::GlobalSettings; use crate::context::RenderBlogPostPage; use crate::context::RenderDocumentElement; +use crate::context::RenderRealFootnoteDefinition; use crate::error::CustomError; use super::BlogPost; @@ -55,11 +56,27 @@ pub(crate) fn convert_blog_post_page_to_render_context, F: AsRef< children }; + let footnotes = { + let mut ret = Vec::new(); + + for footnote in page.footnotes.iter() { + ret.push(RenderRealFootnoteDefinition::new( + config, + output_directory, + output_file, + footnote, + )?); + } + + ret + }; + let ret = RenderBlogPostPage::new( global_settings, page.title.clone(), Some(link_to_blog_post), children, + footnotes, ); Ok(ret) } From ba511b7f9efb9e44fcbbdb01e5f8db5ef8984ebd Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 16:14:34 -0400 Subject: [PATCH 09/24] Add another test for footnote definitions. --- .../footnotes/reference_in_definition.org | 21 +++++++++++++++++++ .../simple.org} | 0 2 files changed, 21 insertions(+) create mode 100644 org_test_documents/footnotes/reference_in_definition.org rename org_test_documents/{footnote_definitions.org => footnotes/simple.org} (100%) diff --git a/org_test_documents/footnotes/reference_in_definition.org b/org_test_documents/footnotes/reference_in_definition.org new file mode 100644 index 0000000..01f8b5e --- /dev/null +++ b/org_test_documents/footnotes/reference_in_definition.org @@ -0,0 +1,21 @@ +# This test shows that footnote references only count if the definition containing them is rendered. + +foo[fn:a:bar] + +[fn:a] lorem + +[fn:b] ipsum + +[fn:d] fizz + +[fn:c] dolar + +yo[fn:b] + + +hello[fn:c] + + +[fn:e] buzz + +sup[fn:d] diff --git a/org_test_documents/footnote_definitions.org b/org_test_documents/footnotes/simple.org similarity index 100% rename from org_test_documents/footnote_definitions.org rename to org_test_documents/footnotes/simple.org From f98a09bc59c6c857861930d3c60dedc2d48d58b8 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 17:29:16 -0400 Subject: [PATCH 10/24] Use macros for creating the intermediate stage. This is to make it easier to change function signatures by consolidating the places where the signatures exist. --- src/intermediate/angle_link.rs | 16 +-- src/intermediate/ast_node.rs | 32 ++--- src/intermediate/babel_call.rs | 16 +-- src/intermediate/bold.rs | 16 +-- src/intermediate/center_block.rs | 16 +-- src/intermediate/citation.rs | 16 +-- src/intermediate/citation_reference.rs | 16 +-- src/intermediate/clock.rs | 16 +-- src/intermediate/code.rs | 16 +-- src/intermediate/comment.rs | 17 +-- src/intermediate/comment_block.rs | 16 +-- src/intermediate/diary_sexp.rs | 16 +-- src/intermediate/document_element.rs | 32 ++--- src/intermediate/drawer.rs | 16 +-- src/intermediate/dynamic_block.rs | 16 +-- src/intermediate/element.rs | 161 +++++++++++----------- src/intermediate/entity.rs | 19 +-- src/intermediate/example_block.rs | 16 +-- src/intermediate/export_block.rs | 16 +-- src/intermediate/export_snippet.rs | 16 +-- src/intermediate/fixed_width_area.rs | 16 +-- src/intermediate/footnote_definition.rs | 23 ++-- src/intermediate/footnote_reference.rs | 15 +- src/intermediate/heading.rs | 51 ++++--- src/intermediate/horizontal_rule.rs | 16 +-- src/intermediate/inline_babel_call.rs | 16 +-- src/intermediate/inline_source_block.rs | 15 +- src/intermediate/italic.rs | 16 +-- src/intermediate/keyword.rs | 17 +-- src/intermediate/latex_environment.rs | 16 +-- src/intermediate/latex_fragment.rs | 16 +-- src/intermediate/line_break.rs | 16 +-- src/intermediate/macros.rs | 56 ++++++++ src/intermediate/mod.rs | 1 + src/intermediate/object.rs | 175 ++++++++++++------------ src/intermediate/org_macro.rs | 16 +-- src/intermediate/page.rs | 5 +- src/intermediate/paragraph.rs | 29 ++-- src/intermediate/plain_link.rs | 16 +-- src/intermediate/plain_list.rs | 35 ++--- src/intermediate/plain_list_item.rs | 43 +++--- src/intermediate/plain_text.rs | 21 ++- src/intermediate/planning.rs | 16 +-- src/intermediate/property_drawer.rs | 16 +-- src/intermediate/quote_block.rs | 29 ++-- src/intermediate/radio_link.rs | 16 +-- src/intermediate/radio_target.rs | 16 +-- src/intermediate/registry.rs | 52 ++++--- src/intermediate/regular_link.rs | 35 ++--- src/intermediate/section.rs | 29 ++-- src/intermediate/special_block.rs | 16 +-- src/intermediate/src_block.rs | 25 ++-- src/intermediate/statistics_cookie.rs | 16 +-- src/intermediate/strike_through.rs | 16 +-- src/intermediate/subscript.rs | 16 +-- src/intermediate/superscript.rs | 16 +-- src/intermediate/table.rs | 16 +-- src/intermediate/target.rs | 24 ++-- src/intermediate/timestamp.rs | 13 +- src/intermediate/underline.rs | 13 +- src/intermediate/verbatim.rs | 13 +- src/intermediate/verse_block.rs | 13 +- 62 files changed, 565 insertions(+), 972 deletions(-) create mode 100644 src/intermediate/macros.rs diff --git a/src/intermediate/angle_link.rs b/src/intermediate/angle_link.rs index 888d339..736def0 100644 --- a/src/intermediate/angle_link.rs +++ b/src/intermediate/angle_link.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IAngleLink {} - -impl IAngleLink { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::AngleLink<'parse>, - ) -> Result { - Ok(IAngleLink {}) - } -} +inoop!(IAngleLink, AngleLink); diff --git a/src/intermediate/ast_node.rs b/src/intermediate/ast_node.rs index 189bc7b..0958180 100644 --- a/src/intermediate/ast_node.rs +++ b/src/intermediate/ast_node.rs @@ -113,19 +113,19 @@ pub(crate) enum IAstNode { } pub(crate) trait IntoIAstNode { - fn into_ast_node<'parse, 'b>( - &'b self, - registry: &'b mut Registry<'parse>, - ) -> BoxFuture<'b, Result> + fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( + &'orig self, + registry: &'reg mut Registry<'orig, 'parse>, + ) -> BoxFuture<'inp, Result> where Self: 'parse; } impl IntoIAstNode for organic::types::DocumentElement<'_> { - fn into_ast_node<'parse, 'b>( - &'b self, - registry: &'b mut Registry<'parse>, - ) -> BoxFuture<'b, Result> + fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( + &'orig self, + registry: &'reg mut Registry<'orig, 'parse>, + ) -> BoxFuture<'inp, Result> where Self: 'parse, { @@ -144,10 +144,10 @@ impl IntoIAstNode for organic::types::DocumentElement<'_> { } impl IntoIAstNode for organic::types::Element<'_> { - fn into_ast_node<'parse, 'b>( - &'b self, - registry: &'b mut Registry<'parse>, - ) -> BoxFuture<'b, Result> + fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( + &'orig self, + registry: &'reg mut Registry<'orig, 'parse>, + ) -> BoxFuture<'inp, Result> where Self: 'parse, { @@ -232,10 +232,10 @@ impl IntoIAstNode for organic::types::Element<'_> { } impl IntoIAstNode for organic::types::Object<'_> { - fn into_ast_node<'parse, 'b>( - &'b self, - registry: &'b mut Registry<'parse>, - ) -> BoxFuture<'b, Result> + fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( + &'orig self, + registry: &'reg mut Registry<'orig, 'parse>, + ) -> BoxFuture<'inp, Result> where Self: 'parse, { diff --git a/src/intermediate/babel_call.rs b/src/intermediate/babel_call.rs index 957bd11..cffc2e5 100644 --- a/src/intermediate/babel_call.rs +++ b/src/intermediate/babel_call.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IBabelCall {} - -impl IBabelCall { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::BabelCall<'parse>, - ) -> Result { - Ok(IBabelCall {}) - } -} +inoop!(IBabelCall, BabelCall); diff --git a/src/intermediate/bold.rs b/src/intermediate/bold.rs index f69cbe7..bee42d1 100644 --- a/src/intermediate/bold.rs +++ b/src/intermediate/bold.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IBold {} - -impl IBold { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Bold<'parse>, - ) -> Result { - Ok(IBold {}) - } -} +inoop!(IBold, Bold); diff --git a/src/intermediate/center_block.rs b/src/intermediate/center_block.rs index bc37461..3b93a29 100644 --- a/src/intermediate/center_block.rs +++ b/src/intermediate/center_block.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ICenterBlock {} - -impl ICenterBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::CenterBlock<'parse>, - ) -> Result { - Ok(ICenterBlock {}) - } -} +inoop!(ICenterBlock, CenterBlock); diff --git a/src/intermediate/citation.rs b/src/intermediate/citation.rs index b9b5176..916ff72 100644 --- a/src/intermediate/citation.rs +++ b/src/intermediate/citation.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ICitation {} - -impl ICitation { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Citation<'parse>, - ) -> Result { - Ok(ICitation {}) - } -} +inoop!(ICitation, Citation); diff --git a/src/intermediate/citation_reference.rs b/src/intermediate/citation_reference.rs index ce46683..f7b2e9b 100644 --- a/src/intermediate/citation_reference.rs +++ b/src/intermediate/citation_reference.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ICitationReference {} - -impl ICitationReference { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::CitationReference<'parse>, - ) -> Result { - Ok(ICitationReference {}) - } -} +inoop!(ICitationReference, CitationReference); diff --git a/src/intermediate/clock.rs b/src/intermediate/clock.rs index 30626f0..056d582 100644 --- a/src/intermediate/clock.rs +++ b/src/intermediate/clock.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IClock {} - -impl IClock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Clock<'parse>, - ) -> Result { - Ok(IClock {}) - } -} +inoop!(IClock, Clock); diff --git a/src/intermediate/code.rs b/src/intermediate/code.rs index 634e5f2..01d7dbe 100644 --- a/src/intermediate/code.rs +++ b/src/intermediate/code.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ICode {} - -impl ICode { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Code<'parse>, - ) -> Result { - Ok(ICode {}) - } -} +inoop!(ICode, Code); diff --git a/src/intermediate/comment.rs b/src/intermediate/comment.rs index 75b8cf8..19c706a 100644 --- a/src/intermediate/comment.rs +++ b/src/intermediate/comment.rs @@ -1,16 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -/// Essentially a no-op since the comment is not rendered. -#[derive(Debug, Clone)] -pub(crate) struct IComment {} - -impl IComment { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - comment: &'b organic::types::Comment<'parse>, - ) -> Result { - Ok(IComment {}) - } -} +inoop!(IComment, Comment); diff --git a/src/intermediate/comment_block.rs b/src/intermediate/comment_block.rs index 2560408..89f4bc3 100644 --- a/src/intermediate/comment_block.rs +++ b/src/intermediate/comment_block.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ICommentBlock {} - -impl ICommentBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::CommentBlock<'parse>, - ) -> Result { - Ok(ICommentBlock {}) - } -} +inoop!(ICommentBlock, CommentBlock); diff --git a/src/intermediate/diary_sexp.rs b/src/intermediate/diary_sexp.rs index 3a65fbf..ebc7b3b 100644 --- a/src/intermediate/diary_sexp.rs +++ b/src/intermediate/diary_sexp.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IDiarySexp {} - -impl IDiarySexp { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::DiarySexp<'parse>, - ) -> Result { - Ok(IDiarySexp {}) - } -} +inoop!(IDiarySexp, DiarySexp); diff --git a/src/intermediate/document_element.rs b/src/intermediate/document_element.rs index 2e0591e..205ae5a 100644 --- a/src/intermediate/document_element.rs +++ b/src/intermediate/document_element.rs @@ -1,8 +1,8 @@ -use crate::error::CustomError; - +use super::macros::iselector; use super::registry::Registry; use super::IHeading; use super::ISection; +use crate::error::CustomError; use futures::future::{BoxFuture, FutureExt}; #[derive(Debug, Clone)] @@ -11,21 +11,17 @@ pub(crate) enum IDocumentElement { Section(ISection), } -impl IDocumentElement { - pub(crate) fn new<'parse, 'b>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::DocumentElement<'parse>, - ) -> BoxFuture<'b, Result> { - async move { - match original { - organic::types::DocumentElement::Heading(inner) => Ok(IDocumentElement::Heading( - IHeading::new(registry, inner).await?, - )), - organic::types::DocumentElement::Section(inner) => Ok(IDocumentElement::Section( - ISection::new(registry, inner).await?, - )), - } +iselector!( + IDocumentElement, + DocumentElement, + |registry, original| async { + match &original { + organic::types::DocumentElement::Heading(inner) => Ok(IDocumentElement::Heading( + IHeading::new(registry, inner).await?, + )), + organic::types::DocumentElement::Section(inner) => Ok(IDocumentElement::Section( + ISection::new(registry, inner).await?, + )), } - .boxed() } -} +); diff --git a/src/intermediate/drawer.rs b/src/intermediate/drawer.rs index 6efaf1d..4a1c0a3 100644 --- a/src/intermediate/drawer.rs +++ b/src/intermediate/drawer.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IDrawer {} - -impl IDrawer { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Drawer<'parse>, - ) -> Result { - Ok(IDrawer {}) - } -} +inoop!(IDrawer, Drawer); diff --git a/src/intermediate/dynamic_block.rs b/src/intermediate/dynamic_block.rs index 3f3f419..fc8cbaf 100644 --- a/src/intermediate/dynamic_block.rs +++ b/src/intermediate/dynamic_block.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IDynamicBlock {} - -impl IDynamicBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::DynamicBlock<'parse>, - ) -> Result { - Ok(IDynamicBlock {}) - } -} +inoop!(IDynamicBlock, DynamicBlock); diff --git a/src/intermediate/element.rs b/src/intermediate/element.rs index 2deaf6a..40771d6 100644 --- a/src/intermediate/element.rs +++ b/src/intermediate/element.rs @@ -1,7 +1,6 @@ -use crate::error::CustomError; - use super::comment::IComment; use super::keyword::IKeyword; +use super::macros::iselector; use super::registry::Registry; use super::IBabelCall; use super::ICenterBlock; @@ -16,6 +15,7 @@ use super::IFixedWidthArea; use super::IFootnoteDefinition; use super::IHorizontalRule; use super::ILatexEnvironment; +use super::IObject; use super::IParagraph; use super::IPlainList; use super::IPlanning; @@ -25,6 +25,7 @@ use super::ISpecialBlock; use super::ISrcBlock; use super::ITable; use super::IVerseBlock; +use crate::error::CustomError; use futures::future::{BoxFuture, FutureExt}; #[derive(Debug, Clone)] @@ -55,87 +56,79 @@ pub(crate) enum IElement { LatexEnvironment(ILatexEnvironment), } -impl IElement { - pub(crate) fn new<'parse, 'b>( - registry: &'b mut Registry<'parse>, - elem: &'b organic::types::Element<'parse>, - ) -> BoxFuture<'b, Result> { - async move { - match elem { - organic::types::Element::Paragraph(inner) => { - Ok(IElement::Paragraph(IParagraph::new(registry, inner).await?)) - } - organic::types::Element::PlainList(inner) => { - Ok(IElement::PlainList(IPlainList::new(registry, inner).await?)) - } - organic::types::Element::CenterBlock(inner) => Ok(IElement::CenterBlock( - ICenterBlock::new(registry, inner).await?, - )), - organic::types::Element::QuoteBlock(inner) => Ok(IElement::QuoteBlock( - IQuoteBlock::new(registry, inner).await?, - )), - organic::types::Element::SpecialBlock(inner) => Ok(IElement::SpecialBlock( - ISpecialBlock::new(registry, inner).await?, - )), - organic::types::Element::DynamicBlock(inner) => Ok(IElement::DynamicBlock( - IDynamicBlock::new(registry, inner).await?, - )), - organic::types::Element::FootnoteDefinition(inner) => Ok( - IElement::FootnoteDefinition(IFootnoteDefinition::new(registry, inner).await?), - ), - organic::types::Element::Comment(inner) => { - Ok(IElement::Comment(IComment::new(registry, inner).await?)) - } - organic::types::Element::Drawer(inner) => { - Ok(IElement::Drawer(IDrawer::new(registry, inner).await?)) - } - organic::types::Element::PropertyDrawer(inner) => Ok(IElement::PropertyDrawer( - IPropertyDrawer::new(registry, inner).await?, - )), - organic::types::Element::Table(inner) => { - Ok(IElement::Table(ITable::new(registry, inner).await?)) - } - organic::types::Element::VerseBlock(inner) => Ok(IElement::VerseBlock( - IVerseBlock::new(registry, inner).await?, - )), - organic::types::Element::CommentBlock(inner) => Ok(IElement::CommentBlock( - ICommentBlock::new(registry, inner).await?, - )), - organic::types::Element::ExampleBlock(inner) => Ok(IElement::ExampleBlock( - IExampleBlock::new(registry, inner).await?, - )), - organic::types::Element::ExportBlock(inner) => Ok(IElement::ExportBlock( - IExportBlock::new(registry, inner).await?, - )), - organic::types::Element::SrcBlock(inner) => { - Ok(IElement::SrcBlock(ISrcBlock::new(registry, inner).await?)) - } - organic::types::Element::Clock(inner) => { - Ok(IElement::Clock(IClock::new(registry, inner).await?)) - } - organic::types::Element::DiarySexp(inner) => { - Ok(IElement::DiarySexp(IDiarySexp::new(registry, inner).await?)) - } - organic::types::Element::Planning(inner) => { - Ok(IElement::Planning(IPlanning::new(registry, inner).await?)) - } - organic::types::Element::FixedWidthArea(inner) => Ok(IElement::FixedWidthArea( - IFixedWidthArea::new(registry, inner).await?, - )), - organic::types::Element::HorizontalRule(inner) => Ok(IElement::HorizontalRule( - IHorizontalRule::new(registry, inner).await?, - )), - organic::types::Element::Keyword(inner) => { - Ok(IElement::Keyword(IKeyword::new(registry, inner).await?)) - } - organic::types::Element::BabelCall(inner) => { - Ok(IElement::BabelCall(IBabelCall::new(registry, inner).await?)) - } - organic::types::Element::LatexEnvironment(inner) => Ok(IElement::LatexEnvironment( - ILatexEnvironment::new(registry, inner).await?, - )), - } +iselector!(IElement, Element, |registry, elem| async { + match elem { + organic::types::Element::Paragraph(inner) => { + Ok(IElement::Paragraph(IParagraph::new(registry, inner).await?)) } - .boxed() + organic::types::Element::PlainList(inner) => { + Ok(IElement::PlainList(IPlainList::new(registry, inner).await?)) + } + organic::types::Element::CenterBlock(inner) => Ok(IElement::CenterBlock( + ICenterBlock::new(registry, inner).await?, + )), + organic::types::Element::QuoteBlock(inner) => Ok(IElement::QuoteBlock( + IQuoteBlock::new(registry, inner).await?, + )), + organic::types::Element::SpecialBlock(inner) => Ok(IElement::SpecialBlock( + ISpecialBlock::new(registry, inner).await?, + )), + organic::types::Element::DynamicBlock(inner) => Ok(IElement::DynamicBlock( + IDynamicBlock::new(registry, inner).await?, + )), + organic::types::Element::FootnoteDefinition(inner) => Ok(IElement::FootnoteDefinition( + IFootnoteDefinition::new(registry, inner).await?, + )), + organic::types::Element::Comment(inner) => { + Ok(IElement::Comment(IComment::new(registry, inner).await?)) + } + organic::types::Element::Drawer(inner) => { + Ok(IElement::Drawer(IDrawer::new(registry, inner).await?)) + } + organic::types::Element::PropertyDrawer(inner) => Ok(IElement::PropertyDrawer( + IPropertyDrawer::new(registry, inner).await?, + )), + organic::types::Element::Table(inner) => { + Ok(IElement::Table(ITable::new(registry, inner).await?)) + } + organic::types::Element::VerseBlock(inner) => Ok(IElement::VerseBlock( + IVerseBlock::new(registry, inner).await?, + )), + organic::types::Element::CommentBlock(inner) => Ok(IElement::CommentBlock( + ICommentBlock::new(registry, inner).await?, + )), + organic::types::Element::ExampleBlock(inner) => Ok(IElement::ExampleBlock( + IExampleBlock::new(registry, inner).await?, + )), + organic::types::Element::ExportBlock(inner) => Ok(IElement::ExportBlock( + IExportBlock::new(registry, inner).await?, + )), + organic::types::Element::SrcBlock(inner) => { + Ok(IElement::SrcBlock(ISrcBlock::new(registry, inner).await?)) + } + organic::types::Element::Clock(inner) => { + Ok(IElement::Clock(IClock::new(registry, inner).await?)) + } + organic::types::Element::DiarySexp(inner) => { + Ok(IElement::DiarySexp(IDiarySexp::new(registry, inner).await?)) + } + organic::types::Element::Planning(inner) => { + Ok(IElement::Planning(IPlanning::new(registry, inner).await?)) + } + organic::types::Element::FixedWidthArea(inner) => Ok(IElement::FixedWidthArea( + IFixedWidthArea::new(registry, inner).await?, + )), + organic::types::Element::HorizontalRule(inner) => Ok(IElement::HorizontalRule( + IHorizontalRule::new(registry, inner).await?, + )), + organic::types::Element::Keyword(inner) => { + Ok(IElement::Keyword(IKeyword::new(registry, inner).await?)) + } + organic::types::Element::BabelCall(inner) => { + Ok(IElement::BabelCall(IBabelCall::new(registry, inner).await?)) + } + organic::types::Element::LatexEnvironment(inner) => Ok(IElement::LatexEnvironment( + ILatexEnvironment::new(registry, inner).await?, + )), } -} +}); diff --git a/src/intermediate/entity.rs b/src/intermediate/entity.rs index 1323143..6b22e7b 100644 --- a/src/intermediate/entity.rs +++ b/src/intermediate/entity.rs @@ -1,19 +1,14 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IEntity { pub(crate) html: String, } -impl IEntity { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Entity<'parse>, - ) -> Result { - Ok(IEntity { - html: original.html.to_owned(), - }) - } -} +intermediate!(IEntity, Entity, |registry, original| async { + Ok(IEntity { + html: original.html.to_owned(), + }) +}); diff --git a/src/intermediate/example_block.rs b/src/intermediate/example_block.rs index 7ea73b3..953c4d5 100644 --- a/src/intermediate/example_block.rs +++ b/src/intermediate/example_block.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IExampleBlock {} - -impl IExampleBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::ExampleBlock<'parse>, - ) -> Result { - Ok(IExampleBlock {}) - } -} +inoop!(IExampleBlock, ExampleBlock); diff --git a/src/intermediate/export_block.rs b/src/intermediate/export_block.rs index 86afacc..2792eda 100644 --- a/src/intermediate/export_block.rs +++ b/src/intermediate/export_block.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IExportBlock {} - -impl IExportBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::ExportBlock<'parse>, - ) -> Result { - Ok(IExportBlock {}) - } -} +inoop!(IExportBlock, ExportBlock); diff --git a/src/intermediate/export_snippet.rs b/src/intermediate/export_snippet.rs index dd0bc5b..7f23280 100644 --- a/src/intermediate/export_snippet.rs +++ b/src/intermediate/export_snippet.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IExportSnippet {} - -impl IExportSnippet { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::ExportSnippet<'parse>, - ) -> Result { - Ok(IExportSnippet {}) - } -} +inoop!(IExportSnippet, ExportSnippet); diff --git a/src/intermediate/fixed_width_area.rs b/src/intermediate/fixed_width_area.rs index e3736c4..6bed813 100644 --- a/src/intermediate/fixed_width_area.rs +++ b/src/intermediate/fixed_width_area.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IFixedWidthArea {} - -impl IFixedWidthArea { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::FixedWidthArea<'parse>, - ) -> Result { - Ok(IFixedWidthArea {}) - } -} +inoop!(IFixedWidthArea, FixedWidthArea); diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index 011242e..1b51fd4 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -1,24 +1,21 @@ -use crate::error::CustomError; - -use super::ast_node::IAstNode; +use super::macros::intermediate; use super::registry::Registry; -use super::IElement; -use super::IObject; +use super::IAstNode; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IFootnoteDefinition {} -impl IFootnoteDefinition { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::FootnoteDefinition<'parse>, - ) -> Result { +intermediate!( + IFootnoteDefinition, + FootnoteDefinition, + |registry, original| async { registry .register_footnote_definition(original.label, &original.children) .await?; Ok(IFootnoteDefinition {}) } -} +); #[derive(Debug)] pub(crate) struct IRealFootnoteDefinition { @@ -27,8 +24,8 @@ pub(crate) struct IRealFootnoteDefinition { } impl IRealFootnoteDefinition { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, + pub(crate) async fn new<'reg, 'orig, 'parse>( + registry: &'reg mut Registry<'orig, 'parse>, footnote_id: usize, contents: Vec, ) -> Result { diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index c04951a..d06ffa7 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -1,6 +1,6 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IFootnoteReference { @@ -8,11 +8,10 @@ pub(crate) struct IFootnoteReference { duplicate_offset: usize, } -impl IFootnoteReference { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::FootnoteReference<'parse>, - ) -> Result { +intermediate!( + IFootnoteReference, + FootnoteReference, + |registry, original| async { let footnote_id = registry .get_footnote_reference_id(original.label, &original.definition) .await?; @@ -21,7 +20,9 @@ impl IFootnoteReference { duplicate_offset: 0, // TODO }) } +); +impl IFootnoteReference { pub(crate) fn get_display_label(&self) -> String { format!("{}", self.footnote_id + 1) } diff --git a/src/intermediate/heading.rs b/src/intermediate/heading.rs index a5e3e66..501b706 100644 --- a/src/intermediate/heading.rs +++ b/src/intermediate/heading.rs @@ -1,8 +1,8 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; use super::IDocumentElement; use super::IObject; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IHeading { @@ -11,29 +11,24 @@ pub(crate) struct IHeading { pub(crate) children: Vec, } -impl IHeading { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Heading<'parse>, - ) -> Result { - let title = { - let mut ret = Vec::new(); - for obj in original.title.iter() { - ret.push(IObject::new(registry, obj).await?); - } - ret - }; - let children = { - let mut ret = Vec::new(); - for obj in original.children.iter() { - ret.push(IDocumentElement::new(registry, obj).await?); - } - ret - }; - Ok(IHeading { - title, - level: original.level, - children, - }) - } -} +intermediate!(IHeading, Heading, |registry, original| async { + let title = { + let mut ret = Vec::new(); + for obj in original.title.iter() { + ret.push(IObject::new(registry, obj).await?); + } + ret + }; + let children = { + let mut ret = Vec::new(); + for obj in original.children.iter() { + ret.push(IDocumentElement::new(registry, obj).await?); + } + ret + }; + Ok(IHeading { + title, + level: original.level, + children, + }) +}); diff --git a/src/intermediate/horizontal_rule.rs b/src/intermediate/horizontal_rule.rs index 59795ee..bc9e323 100644 --- a/src/intermediate/horizontal_rule.rs +++ b/src/intermediate/horizontal_rule.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IHorizontalRule {} - -impl IHorizontalRule { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::HorizontalRule<'parse>, - ) -> Result { - Ok(IHorizontalRule {}) - } -} +inoop!(IHorizontalRule, HorizontalRule); diff --git a/src/intermediate/inline_babel_call.rs b/src/intermediate/inline_babel_call.rs index 8e5e56d..cf1137a 100644 --- a/src/intermediate/inline_babel_call.rs +++ b/src/intermediate/inline_babel_call.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IInlineBabelCall {} - -impl IInlineBabelCall { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::InlineBabelCall<'parse>, - ) -> Result { - Ok(IInlineBabelCall {}) - } -} +inoop!(IInlineBabelCall, InlineBabelCall); diff --git a/src/intermediate/inline_source_block.rs b/src/intermediate/inline_source_block.rs index 41492bb..195afdc 100644 --- a/src/intermediate/inline_source_block.rs +++ b/src/intermediate/inline_source_block.rs @@ -1,19 +1,18 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IInlineSourceBlock { pub(crate) value: String, } -impl IInlineSourceBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::InlineSourceBlock<'parse>, - ) -> Result { +intermediate!( + IInlineSourceBlock, + InlineSourceBlock, + |registry, original| async { Ok(IInlineSourceBlock { value: original.value.to_owned(), }) } -} +); diff --git a/src/intermediate/italic.rs b/src/intermediate/italic.rs index 8cb0140..1c20c55 100644 --- a/src/intermediate/italic.rs +++ b/src/intermediate/italic.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IItalic {} - -impl IItalic { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Italic<'parse>, - ) -> Result { - Ok(IItalic {}) - } -} +inoop!(IItalic, Italic); diff --git a/src/intermediate/keyword.rs b/src/intermediate/keyword.rs index c187f87..3f510f3 100644 --- a/src/intermediate/keyword.rs +++ b/src/intermediate/keyword.rs @@ -1,16 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -/// Essentially a no-op since the keyword is not rendered and any relevant impact on other elements is pulled from the parsed form of keyword. -#[derive(Debug, Clone)] -pub(crate) struct IKeyword {} - -impl IKeyword { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - keyword: &'b organic::types::Keyword<'parse>, - ) -> Result { - Ok(IKeyword {}) - } -} +inoop!(IKeyword, Keyword); diff --git a/src/intermediate/latex_environment.rs b/src/intermediate/latex_environment.rs index 6699078..361ae3e 100644 --- a/src/intermediate/latex_environment.rs +++ b/src/intermediate/latex_environment.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ILatexEnvironment {} - -impl ILatexEnvironment { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::LatexEnvironment<'parse>, - ) -> Result { - Ok(ILatexEnvironment {}) - } -} +inoop!(ILatexEnvironment, LatexEnvironment); diff --git a/src/intermediate/latex_fragment.rs b/src/intermediate/latex_fragment.rs index 82e03d9..89aa832 100644 --- a/src/intermediate/latex_fragment.rs +++ b/src/intermediate/latex_fragment.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ILatexFragment {} - -impl ILatexFragment { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::LatexFragment<'parse>, - ) -> Result { - Ok(ILatexFragment {}) - } -} +inoop!(ILatexFragment, LatexFragment); diff --git a/src/intermediate/line_break.rs b/src/intermediate/line_break.rs index 8c87978..8436553 100644 --- a/src/intermediate/line_break.rs +++ b/src/intermediate/line_break.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ILineBreak {} - -impl ILineBreak { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::LineBreak<'parse>, - ) -> Result { - Ok(ILineBreak {}) - } -} +inoop!(ILineBreak, LineBreak); diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs new file mode 100644 index 0000000..2ccbacf --- /dev/null +++ b/src/intermediate/macros.rs @@ -0,0 +1,56 @@ +/// Write the implementation for the intermediate ast node for a type that is a noop or is not yet implemented. +/// +/// This exists to make changing the type signature easier. +macro_rules! inoop { + ($istruct:ident, $pstruct:ident) => { + #[derive(Debug, Clone)] + pub(crate) struct $istruct {} + + impl $istruct { + pub(crate) async fn new<'reg, 'orig, 'parse>( + registry: &'reg mut Registry<'orig, 'parse>, + original: &'orig organic::types::$pstruct<'parse>, + ) -> Result<$istruct, CustomError> { + Ok($istruct {}) + } + } + }; +} + +pub(crate) use inoop; + +/// Write the implementation for the intermediate ast node. +/// +/// This exists to make changing the type signature easier. +macro_rules! intermediate { + ($istruct:ident, $pstruct:ident, $fnbody:expr) => { + impl $istruct { + pub(crate) async fn new<'reg, 'orig, 'parse>( + registry: &'reg mut Registry<'orig, 'parse>, + original: &'orig organic::types::$pstruct<'parse>, + ) -> Result<$istruct, CustomError> { + $fnbody(registry, original).await + } + } + }; +} + +pub(crate) use intermediate; + +/// Write the implementation for the intermediate ast node. +/// +/// This exists to make changing the type signature easier. +macro_rules! iselector { + ($istruct:ident, $pstruct:ident, $fnbody:expr) => { + impl $istruct { + pub(crate) fn new<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( + registry: &'reg mut Registry<'orig, 'parse>, + original: &'orig organic::types::$pstruct<'parse>, + ) -> BoxFuture<'inp, Result<$istruct, CustomError>> { + $fnbody(registry, original).boxed() + } + } + }; +} + +pub(crate) use iselector; diff --git a/src/intermediate/mod.rs b/src/intermediate/mod.rs index 0281285..bd8e38a 100644 --- a/src/intermediate/mod.rs +++ b/src/intermediate/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 page; diff --git a/src/intermediate/object.rs b/src/intermediate/object.rs index 3eee490..b041384 100644 --- a/src/intermediate/object.rs +++ b/src/intermediate/object.rs @@ -13,6 +13,7 @@ use super::inline_source_block::IInlineSourceBlock; use super::italic::IItalic; use super::latex_fragment::ILatexFragment; use super::line_break::ILineBreak; +use super::macros::iselector; use super::org_macro::IOrgMacro; use super::plain_link::IPlainLink; use super::plain_text::IPlainText; @@ -61,96 +62,88 @@ pub(crate) enum IObject { Timestamp(ITimestamp), } -impl IObject { - pub(crate) fn new<'parse, 'b>( - registry: &'b mut Registry<'parse>, - obj: &'b organic::types::Object<'parse>, - ) -> BoxFuture<'b, Result> { - async move { - match obj { - organic::types::Object::Bold(inner) => { - Ok(IObject::Bold(IBold::new(registry, inner).await?)) - } - organic::types::Object::Italic(inner) => { - Ok(IObject::Italic(IItalic::new(registry, inner).await?)) - } - organic::types::Object::Underline(inner) => { - Ok(IObject::Underline(IUnderline::new(registry, inner).await?)) - } - organic::types::Object::StrikeThrough(inner) => Ok(IObject::StrikeThrough( - IStrikeThrough::new(registry, inner).await?, - )), - organic::types::Object::Code(inner) => { - Ok(IObject::Code(ICode::new(registry, inner).await?)) - } - organic::types::Object::Verbatim(inner) => { - Ok(IObject::Verbatim(IVerbatim::new(registry, inner).await?)) - } - organic::types::Object::PlainText(inner) => { - Ok(IObject::PlainText(IPlainText::new(registry, inner).await?)) - } - organic::types::Object::RegularLink(inner) => Ok(IObject::RegularLink( - IRegularLink::new(registry, inner).await?, - )), - organic::types::Object::RadioLink(inner) => { - Ok(IObject::RadioLink(IRadioLink::new(registry, inner).await?)) - } - organic::types::Object::RadioTarget(inner) => Ok(IObject::RadioTarget( - IRadioTarget::new(registry, inner).await?, - )), - organic::types::Object::PlainLink(inner) => { - Ok(IObject::PlainLink(IPlainLink::new(registry, inner).await?)) - } - organic::types::Object::AngleLink(inner) => { - Ok(IObject::AngleLink(IAngleLink::new(registry, inner).await?)) - } - organic::types::Object::OrgMacro(inner) => { - Ok(IObject::OrgMacro(IOrgMacro::new(registry, inner).await?)) - } - organic::types::Object::Entity(inner) => { - Ok(IObject::Entity(IEntity::new(registry, inner).await?)) - } - organic::types::Object::LatexFragment(inner) => Ok(IObject::LatexFragment( - ILatexFragment::new(registry, inner).await?, - )), - organic::types::Object::ExportSnippet(inner) => Ok(IObject::ExportSnippet( - IExportSnippet::new(registry, inner).await?, - )), - organic::types::Object::FootnoteReference(inner) => Ok(IObject::FootnoteReference( - IFootnoteReference::new(registry, inner).await?, - )), - organic::types::Object::Citation(inner) => { - Ok(IObject::Citation(ICitation::new(registry, inner).await?)) - } - organic::types::Object::CitationReference(inner) => Ok(IObject::CitationReference( - ICitationReference::new(registry, inner).await?, - )), - organic::types::Object::InlineBabelCall(inner) => Ok(IObject::InlineBabelCall( - IInlineBabelCall::new(registry, inner).await?, - )), - organic::types::Object::InlineSourceBlock(inner) => Ok(IObject::InlineSourceBlock( - IInlineSourceBlock::new(registry, inner).await?, - )), - organic::types::Object::LineBreak(inner) => { - Ok(IObject::LineBreak(ILineBreak::new(registry, inner).await?)) - } - organic::types::Object::Target(inner) => { - Ok(IObject::Target(ITarget::new(registry, inner).await?)) - } - organic::types::Object::StatisticsCookie(inner) => Ok(IObject::StatisticsCookie( - IStatisticsCookie::new(registry, inner).await?, - )), - organic::types::Object::Subscript(inner) => { - Ok(IObject::Subscript(ISubscript::new(registry, inner).await?)) - } - organic::types::Object::Superscript(inner) => Ok(IObject::Superscript( - ISuperscript::new(registry, inner).await?, - )), - organic::types::Object::Timestamp(inner) => { - Ok(IObject::Timestamp(ITimestamp::new(registry, inner).await?)) - } - } +iselector!(IObject, Object, |registry, obj| async { + match &obj { + organic::types::Object::Bold(inner) => { + Ok(IObject::Bold(IBold::new(registry, inner).await?)) + } + organic::types::Object::Italic(inner) => { + Ok(IObject::Italic(IItalic::new(registry, inner).await?)) + } + organic::types::Object::Underline(inner) => { + Ok(IObject::Underline(IUnderline::new(registry, inner).await?)) + } + organic::types::Object::StrikeThrough(inner) => Ok(IObject::StrikeThrough( + IStrikeThrough::new(registry, inner).await?, + )), + organic::types::Object::Code(inner) => { + Ok(IObject::Code(ICode::new(registry, inner).await?)) + } + organic::types::Object::Verbatim(inner) => { + Ok(IObject::Verbatim(IVerbatim::new(registry, inner).await?)) + } + organic::types::Object::PlainText(inner) => { + Ok(IObject::PlainText(IPlainText::new(registry, inner).await?)) + } + organic::types::Object::RegularLink(inner) => Ok(IObject::RegularLink( + IRegularLink::new(registry, inner).await?, + )), + organic::types::Object::RadioLink(inner) => { + Ok(IObject::RadioLink(IRadioLink::new(registry, inner).await?)) + } + organic::types::Object::RadioTarget(inner) => Ok(IObject::RadioTarget( + IRadioTarget::new(registry, inner).await?, + )), + organic::types::Object::PlainLink(inner) => { + Ok(IObject::PlainLink(IPlainLink::new(registry, inner).await?)) + } + organic::types::Object::AngleLink(inner) => { + Ok(IObject::AngleLink(IAngleLink::new(registry, inner).await?)) + } + organic::types::Object::OrgMacro(inner) => { + Ok(IObject::OrgMacro(IOrgMacro::new(registry, inner).await?)) + } + organic::types::Object::Entity(inner) => { + Ok(IObject::Entity(IEntity::new(registry, inner).await?)) + } + organic::types::Object::LatexFragment(inner) => Ok(IObject::LatexFragment( + ILatexFragment::new(registry, inner).await?, + )), + organic::types::Object::ExportSnippet(inner) => Ok(IObject::ExportSnippet( + IExportSnippet::new(registry, inner).await?, + )), + organic::types::Object::FootnoteReference(inner) => Ok(IObject::FootnoteReference( + IFootnoteReference::new(registry, inner).await?, + )), + organic::types::Object::Citation(inner) => { + Ok(IObject::Citation(ICitation::new(registry, inner).await?)) + } + organic::types::Object::CitationReference(inner) => Ok(IObject::CitationReference( + ICitationReference::new(registry, inner).await?, + )), + organic::types::Object::InlineBabelCall(inner) => Ok(IObject::InlineBabelCall( + IInlineBabelCall::new(registry, inner).await?, + )), + organic::types::Object::InlineSourceBlock(inner) => Ok(IObject::InlineSourceBlock( + IInlineSourceBlock::new(registry, inner).await?, + )), + organic::types::Object::LineBreak(inner) => { + Ok(IObject::LineBreak(ILineBreak::new(registry, inner).await?)) + } + organic::types::Object::Target(inner) => { + Ok(IObject::Target(ITarget::new(registry, inner).await?)) + } + organic::types::Object::StatisticsCookie(inner) => Ok(IObject::StatisticsCookie( + IStatisticsCookie::new(registry, inner).await?, + )), + organic::types::Object::Subscript(inner) => { + Ok(IObject::Subscript(ISubscript::new(registry, inner).await?)) + } + organic::types::Object::Superscript(inner) => Ok(IObject::Superscript( + ISuperscript::new(registry, inner).await?, + )), + organic::types::Object::Timestamp(inner) => { + Ok(IObject::Timestamp(ITimestamp::new(registry, inner).await?)) } - .boxed() } -} +}); diff --git a/src/intermediate/org_macro.rs b/src/intermediate/org_macro.rs index 7fb3fe5..bae7384 100644 --- a/src/intermediate/org_macro.rs +++ b/src/intermediate/org_macro.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IOrgMacro {} - -impl IOrgMacro { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::OrgMacro<'parse>, - ) -> Result { - Ok(IOrgMacro {}) - } -} +inoop!(IOrgMacro, OrgMacro); diff --git a/src/intermediate/page.rs b/src/intermediate/page.rs index 0333f75..957a1ad 100644 --- a/src/intermediate/page.rs +++ b/src/intermediate/page.rs @@ -21,9 +21,10 @@ pub(crate) struct BlogPostPage { } impl BlogPostPage { - pub(crate) async fn new<'b, 'parse, P: Into>( + // TODO: Move path into the registry so I can give this a standard interface like the others. + pub(crate) async fn new<'a, 'b, 'parse, P: Into>( path: P, - registry: &'b mut Registry<'parse>, + registry: &'a mut Registry<'b, 'parse>, document: &'b organic::types::Document<'parse>, ) -> Result { let path = path.into(); diff --git a/src/intermediate/paragraph.rs b/src/intermediate/paragraph.rs index d9b0893..6a33a4c 100644 --- a/src/intermediate/paragraph.rs +++ b/src/intermediate/paragraph.rs @@ -1,26 +1,21 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; use super::IObject; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IParagraph { pub(crate) children: Vec, } -impl IParagraph { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Paragraph<'parse>, - ) -> Result { - let children = { - let mut ret = Vec::new(); - for obj in original.children.iter() { - ret.push(IObject::new(registry, obj).await?); - } - ret - }; +intermediate!(IParagraph, Paragraph, |registry, original| async { + let children = { + let mut ret = Vec::new(); + for obj in original.children.iter() { + ret.push(IObject::new(registry, obj).await?); + } + ret + }; - Ok(IParagraph { children }) - } -} + Ok(IParagraph { children }) +}); diff --git a/src/intermediate/plain_link.rs b/src/intermediate/plain_link.rs index a6503c3..68d0861 100644 --- a/src/intermediate/plain_link.rs +++ b/src/intermediate/plain_link.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IPlainLink {} - -impl IPlainLink { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::PlainLink<'parse>, - ) -> Result { - Ok(IPlainLink {}) - } -} +inoop!(IPlainLink, PlainLink); diff --git a/src/intermediate/plain_list.rs b/src/intermediate/plain_list.rs index 17ac7cb..61ec964 100644 --- a/src/intermediate/plain_list.rs +++ b/src/intermediate/plain_list.rs @@ -1,7 +1,7 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; use super::IPlainListItem; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IPlainList { @@ -9,22 +9,17 @@ pub(crate) struct IPlainList { pub(crate) children: Vec, } -impl IPlainList { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::PlainList<'parse>, - ) -> Result { - let children = { - let mut ret = Vec::new(); - for obj in original.children.iter() { - ret.push(IPlainListItem::new(registry, obj).await?); - } - ret - }; +intermediate!(IPlainList, PlainList, |registry, original| async { + let children = { + let mut ret = Vec::new(); + for obj in original.children.iter() { + ret.push(IPlainListItem::new(registry, obj).await?); + } + ret + }; - Ok(IPlainList { - list_type: original.list_type, - children, - }) - } -} + Ok(IPlainList { + list_type: original.list_type, + children, + }) +}); diff --git a/src/intermediate/plain_list_item.rs b/src/intermediate/plain_list_item.rs index 9e8f7ad..7af4933 100644 --- a/src/intermediate/plain_list_item.rs +++ b/src/intermediate/plain_list_item.rs @@ -1,8 +1,8 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; use super::IElement; use super::IObject; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IPlainListItem { @@ -10,27 +10,22 @@ pub(crate) struct IPlainListItem { pub(crate) children: Vec, } -impl IPlainListItem { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::PlainListItem<'parse>, - ) -> Result { - let tag = { - let mut ret = Vec::new(); - for obj in original.tag.iter() { - ret.push(IObject::new(registry, obj).await?); - } - ret - }; +intermediate!(IPlainListItem, PlainListItem, |registry, original| async { + let tag = { + let mut ret = Vec::new(); + for obj in original.tag.iter() { + ret.push(IObject::new(registry, obj).await?); + } + ret + }; - let children = { - let mut ret = Vec::new(); - for elem in original.children.iter() { - ret.push(IElement::new(registry, elem).await?); - } - ret - }; + let children = { + let mut ret = Vec::new(); + for elem in original.children.iter() { + ret.push(IElement::new(registry, elem).await?); + } + ret + }; - Ok(IPlainListItem { tag, children }) - } -} + Ok(IPlainListItem { tag, children }) +}); diff --git a/src/intermediate/plain_text.rs b/src/intermediate/plain_text.rs index 30114ab..24c6a68 100644 --- a/src/intermediate/plain_text.rs +++ b/src/intermediate/plain_text.rs @@ -1,20 +1,15 @@ -use crate::error::CustomError; -use crate::intermediate::util::coalesce_whitespace; - +use super::macros::intermediate; use super::registry::Registry; +use super::util::coalesce_whitespace; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IPlainText { pub(crate) source: String, } -impl IPlainText { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - plain_text: &'b organic::types::PlainText<'parse>, - ) -> Result { - Ok(IPlainText { - source: coalesce_whitespace(plain_text.source).into_owned(), - }) - } -} +intermediate!(IPlainText, PlainText, |registry, original| async { + Ok(IPlainText { + source: coalesce_whitespace(original.source).into_owned(), + }) +}); diff --git a/src/intermediate/planning.rs b/src/intermediate/planning.rs index 968f288..7de9746 100644 --- a/src/intermediate/planning.rs +++ b/src/intermediate/planning.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IPlanning {} - -impl IPlanning { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Planning<'parse>, - ) -> Result { - Ok(IPlanning {}) - } -} +inoop!(IPlanning, Planning); diff --git a/src/intermediate/property_drawer.rs b/src/intermediate/property_drawer.rs index 000946a..9a42001 100644 --- a/src/intermediate/property_drawer.rs +++ b/src/intermediate/property_drawer.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IPropertyDrawer {} - -impl IPropertyDrawer { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::PropertyDrawer<'parse>, - ) -> Result { - Ok(IPropertyDrawer {}) - } -} +inoop!(IPropertyDrawer, PropertyDrawer); diff --git a/src/intermediate/quote_block.rs b/src/intermediate/quote_block.rs index db7c062..27ef6e2 100644 --- a/src/intermediate/quote_block.rs +++ b/src/intermediate/quote_block.rs @@ -1,26 +1,21 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; use super::IElement; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IQuoteBlock { pub(crate) children: Vec, } -impl IQuoteBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::QuoteBlock<'parse>, - ) -> Result { - let children = { - let mut ret = Vec::new(); - for obj in original.children.iter() { - ret.push(IElement::new(registry, obj).await?); - } - ret - }; +intermediate!(IQuoteBlock, QuoteBlock, |registry, original| async { + let children = { + let mut ret = Vec::new(); + for obj in original.children.iter() { + ret.push(IElement::new(registry, obj).await?); + } + ret + }; - Ok(IQuoteBlock { children }) - } -} + Ok(IQuoteBlock { children }) +}); diff --git a/src/intermediate/radio_link.rs b/src/intermediate/radio_link.rs index 0f382ee..6dfea17 100644 --- a/src/intermediate/radio_link.rs +++ b/src/intermediate/radio_link.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IRadioLink {} - -impl IRadioLink { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::RadioLink<'parse>, - ) -> Result { - Ok(IRadioLink {}) - } -} +inoop!(IRadioLink, RadioLink); diff --git a/src/intermediate/radio_target.rs b/src/intermediate/radio_target.rs index e8f4735..01b20e9 100644 --- a/src/intermediate/radio_target.rs +++ b/src/intermediate/radio_target.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IRadioTarget {} - -impl IRadioTarget { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::RadioTarget<'parse>, - ) -> Result { - Ok(IRadioTarget {}) - } -} +inoop!(IRadioTarget, RadioTarget); diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index a7a847f..4fe888f 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -9,14 +9,17 @@ use super::ast_node::IAstNode; type IdCounter = u16; -pub(crate) struct Registry<'parse> { +pub(crate) struct Registry<'orig, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, - footnote_ids: Vec<(Option<&'parse str>, Vec)>, + footnote_ids: Vec<( + Option<&'parse str>, + FootnoteDefinitionContents<'orig, 'parse>, + )>, } -impl<'parse> Registry<'parse> { - pub(crate) fn new() -> Registry<'parse> { +impl<'orig, 'parse> Registry<'orig, 'parse> { + pub(crate) fn new() -> Registry<'orig, 'parse> { Registry { id_counter: 0, targets: HashMap::new(), @@ -24,7 +27,7 @@ impl<'parse> Registry<'parse> { } } - pub(crate) fn get_target<'b>(&'b mut self, body: &'parse str) -> &'b String { + pub(crate) fn get_target<'reg>(&'reg mut self, body: &'parse str) -> &'reg String { self.targets.entry(body).or_insert_with(|| { self.id_counter += 1; format!("target_{}", self.id_counter) @@ -32,19 +35,21 @@ impl<'parse> Registry<'parse> { } pub(crate) fn get_footnote_ids(&self) -> impl Iterator)> { - self.footnote_ids - .iter() - .map(|(_label, definition)| definition) - .enumerate() + // TODO + std::iter::empty() + // self.footnote_ids + // .iter() + // .map(|(_label, definition)| definition) + // .enumerate() } /// Get a 0-indexed ID for a footnote. /// /// This needs to be incremented to be 1-indexed for render. - pub(crate) async fn get_footnote_reference_id<'b>( - &'b mut self, + pub(crate) async fn get_footnote_reference_id<'reg>( + &'reg mut self, label: Option<&'parse str>, - definition: &'b Vec>, + definition: &'orig Vec>, ) -> Result { if let None = label { // If it has no label then it must always get a new ID. @@ -75,10 +80,10 @@ impl<'parse> Registry<'parse> { } /// Update the definition to a footnote but do not mark it as referenced. - pub(crate) async fn register_footnote_definition<'b>( - &'b mut self, + pub(crate) async fn register_footnote_definition<'reg>( + &'reg mut self, label: &'parse str, - definition: &'b Vec>, + definition: &'orig Vec>, ) -> Result<(), CustomError> { let contents = convert_definition_contents(self, definition).await?; if let Some((_existing_id, existing_definition)) = self @@ -92,9 +97,9 @@ impl<'parse> Registry<'parse> { } } -async fn convert_reference_contents<'b, 'parse>( - registry: &'b mut Registry<'parse>, - contents: &'b Vec>, +async fn convert_reference_contents<'reg, 'orig, 'parse>( + registry: &'reg mut Registry<'orig, 'parse>, + contents: &'orig Vec>, ) -> Result, CustomError> { let contents = { let mut ret = Vec::new(); @@ -107,9 +112,9 @@ async fn convert_reference_contents<'b, 'parse>( Ok(contents) } -async fn convert_definition_contents<'b, 'parse>( - registry: &'b mut Registry<'parse>, - contents: &'b Vec>, +async fn convert_definition_contents<'reg, 'orig, 'parse>( + registry: &'reg mut Registry<'orig, 'parse>, + contents: &'orig Vec>, ) -> Result, CustomError> { let contents = { let mut ret = Vec::new(); @@ -121,3 +126,8 @@ async fn convert_definition_contents<'b, 'parse>( Ok(contents) } + +enum FootnoteDefinitionContents<'orig, 'parse> { + FromReference(&'orig Vec>), + FromDefinition(&'orig Vec>), +} diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index 87b34b2..6b155cc 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -1,7 +1,7 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; use super::IObject; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct IRegularLink { @@ -9,21 +9,16 @@ pub(crate) struct IRegularLink { pub(crate) children: Vec, } -impl IRegularLink { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::RegularLink<'parse>, - ) -> Result { - let children = { - let mut ret = Vec::new(); - for obj in original.children.iter() { - ret.push(IObject::new(registry, obj).await?); - } - ret - }; - Ok(IRegularLink { - raw_link: original.get_raw_link().into_owned(), - children, - }) - } -} +intermediate!(IRegularLink, RegularLink, |registry, original| async { + let children = { + let mut ret = Vec::new(); + for obj in original.children.iter() { + ret.push(IObject::new(registry, obj).await?); + } + ret + }; + Ok(IRegularLink { + raw_link: original.get_raw_link().into_owned(), + children, + }) +}); diff --git a/src/intermediate/section.rs b/src/intermediate/section.rs index 658a3d2..e1c81ee 100644 --- a/src/intermediate/section.rs +++ b/src/intermediate/section.rs @@ -1,26 +1,21 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; use super::IElement; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct ISection { pub(crate) children: Vec, } -impl ISection { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - section: &'b organic::types::Section<'parse>, - ) -> Result { - let children = { - let mut ret = Vec::new(); - for elem in section.children.iter() { - ret.push(IElement::new(registry, elem).await?); - } - ret - }; +intermediate!(ISection, Section, |registry, original| async { + let children = { + let mut ret = Vec::new(); + for elem in original.children.iter() { + ret.push(IElement::new(registry, elem).await?); + } + ret + }; - Ok(ISection { children }) - } -} + Ok(ISection { children }) +}); diff --git a/src/intermediate/special_block.rs b/src/intermediate/special_block.rs index 952468b..2109242 100644 --- a/src/intermediate/special_block.rs +++ b/src/intermediate/special_block.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ISpecialBlock {} - -impl ISpecialBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::SpecialBlock<'parse>, - ) -> Result { - Ok(ISpecialBlock {}) - } -} +inoop!(ISpecialBlock, SpecialBlock); diff --git a/src/intermediate/src_block.rs b/src/intermediate/src_block.rs index d5a4c92..2a1c608 100644 --- a/src/intermediate/src_block.rs +++ b/src/intermediate/src_block.rs @@ -1,22 +1,17 @@ -use crate::error::CustomError; - +use super::macros::intermediate; use super::registry::Registry; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct ISrcBlock { pub(crate) lines: Vec, } -impl ISrcBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::SrcBlock<'parse>, - ) -> Result { - let lines = original - .contents - .split_inclusive('\n') - .map(|s| s.to_owned()) - .collect(); - Ok(ISrcBlock { lines }) - } -} +intermediate!(ISrcBlock, SrcBlock, |registry, original| async { + let lines = original + .contents + .split_inclusive('\n') + .map(|s| s.to_owned()) + .collect(); + Ok(ISrcBlock { lines }) +}); diff --git a/src/intermediate/statistics_cookie.rs b/src/intermediate/statistics_cookie.rs index b2915eb..ae6ec23 100644 --- a/src/intermediate/statistics_cookie.rs +++ b/src/intermediate/statistics_cookie.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IStatisticsCookie {} - -impl IStatisticsCookie { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::StatisticsCookie<'parse>, - ) -> Result { - Ok(IStatisticsCookie {}) - } -} +inoop!(IStatisticsCookie, StatisticsCookie); diff --git a/src/intermediate/strike_through.rs b/src/intermediate/strike_through.rs index c81ee12..d870835 100644 --- a/src/intermediate/strike_through.rs +++ b/src/intermediate/strike_through.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct IStrikeThrough {} - -impl IStrikeThrough { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::StrikeThrough<'parse>, - ) -> Result { - Ok(IStrikeThrough {}) - } -} +inoop!(IStrikeThrough, StrikeThrough); diff --git a/src/intermediate/subscript.rs b/src/intermediate/subscript.rs index 18c57ef..4ce1f3e 100644 --- a/src/intermediate/subscript.rs +++ b/src/intermediate/subscript.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ISubscript {} - -impl ISubscript { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Subscript<'parse>, - ) -> Result { - Ok(ISubscript {}) - } -} +inoop!(ISubscript, Subscript); diff --git a/src/intermediate/superscript.rs b/src/intermediate/superscript.rs index 247e250..9449de3 100644 --- a/src/intermediate/superscript.rs +++ b/src/intermediate/superscript.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ISuperscript {} - -impl ISuperscript { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Superscript<'parse>, - ) -> Result { - Ok(ISuperscript {}) - } -} +inoop!(ISuperscript, Superscript); diff --git a/src/intermediate/table.rs b/src/intermediate/table.rs index e5ceb9d..c4cb36b 100644 --- a/src/intermediate/table.rs +++ b/src/intermediate/table.rs @@ -1,15 +1,5 @@ +use super::macros::inoop; +use super::registry::Registry; use crate::error::CustomError; -use super::registry::Registry; - -#[derive(Debug, Clone)] -pub(crate) struct ITable {} - -impl ITable { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Table<'parse>, - ) -> Result { - Ok(ITable {}) - } -} +inoop!(ITable, Table); diff --git a/src/intermediate/target.rs b/src/intermediate/target.rs index 4bc57ec..1e41833 100644 --- a/src/intermediate/target.rs +++ b/src/intermediate/target.rs @@ -1,7 +1,6 @@ -use crate::error::CustomError; -use crate::intermediate::util::coalesce_whitespace; - +use super::macros::intermediate; use super::registry::Registry; +use crate::error::CustomError; #[derive(Debug, Clone)] pub(crate) struct ITarget { @@ -9,15 +8,10 @@ pub(crate) struct ITarget { value: String, } -impl ITarget { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - target: &'b organic::types::Target<'parse>, - ) -> Result { - let id = registry.get_target(target.value); - Ok(ITarget { - id: id.clone(), - value: target.value.to_owned(), - }) - } -} +intermediate!(ITarget, Target, |registry, original| async { + let id = registry.get_target(original.value); + Ok(ITarget { + id: id.clone(), + value: original.value.to_owned(), + }) +}); diff --git a/src/intermediate/timestamp.rs b/src/intermediate/timestamp.rs index f590f64..d2a2692 100644 --- a/src/intermediate/timestamp.rs +++ b/src/intermediate/timestamp.rs @@ -1,15 +1,6 @@ use crate::error::CustomError; +use super::macros::inoop; use super::registry::Registry; -#[derive(Debug, Clone)] -pub(crate) struct ITimestamp {} - -impl ITimestamp { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Timestamp<'parse>, - ) -> Result { - Ok(ITimestamp {}) - } -} +inoop!(ITimestamp, Timestamp); diff --git a/src/intermediate/underline.rs b/src/intermediate/underline.rs index a2e5c83..2e60589 100644 --- a/src/intermediate/underline.rs +++ b/src/intermediate/underline.rs @@ -1,15 +1,6 @@ use crate::error::CustomError; +use super::macros::inoop; use super::registry::Registry; -#[derive(Debug, Clone)] -pub(crate) struct IUnderline {} - -impl IUnderline { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Underline<'parse>, - ) -> Result { - Ok(IUnderline {}) - } -} +inoop!(IUnderline, Underline); diff --git a/src/intermediate/verbatim.rs b/src/intermediate/verbatim.rs index 4d60d54..7aecb4e 100644 --- a/src/intermediate/verbatim.rs +++ b/src/intermediate/verbatim.rs @@ -1,15 +1,6 @@ use crate::error::CustomError; +use super::macros::inoop; use super::registry::Registry; -#[derive(Debug, Clone)] -pub(crate) struct IVerbatim {} - -impl IVerbatim { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::Verbatim<'parse>, - ) -> Result { - Ok(IVerbatim {}) - } -} +inoop!(IVerbatim, Verbatim); diff --git a/src/intermediate/verse_block.rs b/src/intermediate/verse_block.rs index bd37207..6a53749 100644 --- a/src/intermediate/verse_block.rs +++ b/src/intermediate/verse_block.rs @@ -1,15 +1,6 @@ use crate::error::CustomError; +use super::macros::inoop; use super::registry::Registry; -#[derive(Debug, Clone)] -pub(crate) struct IVerseBlock {} - -impl IVerseBlock { - pub(crate) async fn new<'b, 'parse>( - registry: &'b mut Registry<'parse>, - original: &'b organic::types::VerseBlock<'parse>, - ) -> Result { - Ok(IVerseBlock {}) - } -} +inoop!(IVerseBlock, VerseBlock); From 3d44d20384ddcd99b57585c54491774b2260205f Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 18:26:52 -0400 Subject: [PATCH 11/24] Running into borrow issue on intermediate. --- src/intermediate/document_element.rs | 23 +-- src/intermediate/element.rs | 190 +++++++++++++++---------- src/intermediate/macros.rs | 14 ++ src/intermediate/object.rs | 205 ++++++++++++++++----------- 4 files changed, 264 insertions(+), 168 deletions(-) diff --git a/src/intermediate/document_element.rs b/src/intermediate/document_element.rs index 205ae5a..b79220b 100644 --- a/src/intermediate/document_element.rs +++ b/src/intermediate/document_element.rs @@ -1,3 +1,4 @@ +use super::macros::iitem; use super::macros::iselector; use super::registry::Registry; use super::IHeading; @@ -15,13 +16,19 @@ iselector!( IDocumentElement, DocumentElement, |registry, original| async { - match &original { - organic::types::DocumentElement::Heading(inner) => Ok(IDocumentElement::Heading( - IHeading::new(registry, inner).await?, - )), - organic::types::DocumentElement::Section(inner) => Ok(IDocumentElement::Section( - ISection::new(registry, inner).await?, - )), - } + iitem!( + registry, + original, + ( + organic::types::DocumentElement::Heading, + IDocumentElement::Heading, + IHeading + ), + ( + organic::types::DocumentElement::Section, + IDocumentElement::Section, + ISection + ), + ) } ); diff --git a/src/intermediate/element.rs b/src/intermediate/element.rs index 40771d6..da1b173 100644 --- a/src/intermediate/element.rs +++ b/src/intermediate/element.rs @@ -15,7 +15,6 @@ use super::IFixedWidthArea; use super::IFootnoteDefinition; use super::IHorizontalRule; use super::ILatexEnvironment; -use super::IObject; use super::IParagraph; use super::IPlainList; use super::IPlanning; @@ -26,6 +25,7 @@ use super::ISrcBlock; use super::ITable; use super::IVerseBlock; use crate::error::CustomError; +use crate::intermediate::macros::iitem; use futures::future::{BoxFuture, FutureExt}; #[derive(Debug, Clone)] @@ -56,79 +56,117 @@ pub(crate) enum IElement { LatexEnvironment(ILatexEnvironment), } -iselector!(IElement, Element, |registry, elem| async { - match elem { - organic::types::Element::Paragraph(inner) => { - Ok(IElement::Paragraph(IParagraph::new(registry, inner).await?)) - } - organic::types::Element::PlainList(inner) => { - Ok(IElement::PlainList(IPlainList::new(registry, inner).await?)) - } - organic::types::Element::CenterBlock(inner) => Ok(IElement::CenterBlock( - ICenterBlock::new(registry, inner).await?, - )), - organic::types::Element::QuoteBlock(inner) => Ok(IElement::QuoteBlock( - IQuoteBlock::new(registry, inner).await?, - )), - organic::types::Element::SpecialBlock(inner) => Ok(IElement::SpecialBlock( - ISpecialBlock::new(registry, inner).await?, - )), - organic::types::Element::DynamicBlock(inner) => Ok(IElement::DynamicBlock( - IDynamicBlock::new(registry, inner).await?, - )), - organic::types::Element::FootnoteDefinition(inner) => Ok(IElement::FootnoteDefinition( - IFootnoteDefinition::new(registry, inner).await?, - )), - organic::types::Element::Comment(inner) => { - Ok(IElement::Comment(IComment::new(registry, inner).await?)) - } - organic::types::Element::Drawer(inner) => { - Ok(IElement::Drawer(IDrawer::new(registry, inner).await?)) - } - organic::types::Element::PropertyDrawer(inner) => Ok(IElement::PropertyDrawer( - IPropertyDrawer::new(registry, inner).await?, - )), - organic::types::Element::Table(inner) => { - Ok(IElement::Table(ITable::new(registry, inner).await?)) - } - organic::types::Element::VerseBlock(inner) => Ok(IElement::VerseBlock( - IVerseBlock::new(registry, inner).await?, - )), - organic::types::Element::CommentBlock(inner) => Ok(IElement::CommentBlock( - ICommentBlock::new(registry, inner).await?, - )), - organic::types::Element::ExampleBlock(inner) => Ok(IElement::ExampleBlock( - IExampleBlock::new(registry, inner).await?, - )), - organic::types::Element::ExportBlock(inner) => Ok(IElement::ExportBlock( - IExportBlock::new(registry, inner).await?, - )), - organic::types::Element::SrcBlock(inner) => { - Ok(IElement::SrcBlock(ISrcBlock::new(registry, inner).await?)) - } - organic::types::Element::Clock(inner) => { - Ok(IElement::Clock(IClock::new(registry, inner).await?)) - } - organic::types::Element::DiarySexp(inner) => { - Ok(IElement::DiarySexp(IDiarySexp::new(registry, inner).await?)) - } - organic::types::Element::Planning(inner) => { - Ok(IElement::Planning(IPlanning::new(registry, inner).await?)) - } - organic::types::Element::FixedWidthArea(inner) => Ok(IElement::FixedWidthArea( - IFixedWidthArea::new(registry, inner).await?, - )), - organic::types::Element::HorizontalRule(inner) => Ok(IElement::HorizontalRule( - IHorizontalRule::new(registry, inner).await?, - )), - organic::types::Element::Keyword(inner) => { - Ok(IElement::Keyword(IKeyword::new(registry, inner).await?)) - } - organic::types::Element::BabelCall(inner) => { - Ok(IElement::BabelCall(IBabelCall::new(registry, inner).await?)) - } - organic::types::Element::LatexEnvironment(inner) => Ok(IElement::LatexEnvironment( - ILatexEnvironment::new(registry, inner).await?, - )), - } +iselector!(IElement, Element, |registry, original| async { + iitem!( + registry, + original, + ( + organic::types::Element::Paragraph, + IElement::Paragraph, + IParagraph + ), + ( + organic::types::Element::PlainList, + IElement::PlainList, + IPlainList + ), + ( + organic::types::Element::CenterBlock, + IElement::CenterBlock, + ICenterBlock + ), + ( + organic::types::Element::QuoteBlock, + IElement::QuoteBlock, + IQuoteBlock + ), + ( + organic::types::Element::SpecialBlock, + IElement::SpecialBlock, + ISpecialBlock + ), + ( + organic::types::Element::DynamicBlock, + IElement::DynamicBlock, + IDynamicBlock + ), + ( + organic::types::Element::FootnoteDefinition, + IElement::FootnoteDefinition, + IFootnoteDefinition + ), + ( + organic::types::Element::Comment, + IElement::Comment, + IComment + ), + (organic::types::Element::Drawer, IElement::Drawer, IDrawer), + ( + organic::types::Element::PropertyDrawer, + IElement::PropertyDrawer, + IPropertyDrawer + ), + (organic::types::Element::Table, IElement::Table, ITable), + ( + organic::types::Element::VerseBlock, + IElement::VerseBlock, + IVerseBlock + ), + ( + organic::types::Element::CommentBlock, + IElement::CommentBlock, + ICommentBlock + ), + ( + organic::types::Element::ExampleBlock, + IElement::ExampleBlock, + IExampleBlock + ), + ( + organic::types::Element::ExportBlock, + IElement::ExportBlock, + IExportBlock + ), + ( + organic::types::Element::SrcBlock, + IElement::SrcBlock, + ISrcBlock + ), + (organic::types::Element::Clock, IElement::Clock, IClock), + ( + organic::types::Element::DiarySexp, + IElement::DiarySexp, + IDiarySexp + ), + ( + organic::types::Element::Planning, + IElement::Planning, + IPlanning + ), + ( + organic::types::Element::FixedWidthArea, + IElement::FixedWidthArea, + IFixedWidthArea + ), + ( + organic::types::Element::HorizontalRule, + IElement::HorizontalRule, + IHorizontalRule + ), + ( + organic::types::Element::Keyword, + IElement::Keyword, + IKeyword + ), + ( + organic::types::Element::BabelCall, + IElement::BabelCall, + IBabelCall + ), + ( + organic::types::Element::LatexEnvironment, + IElement::LatexEnvironment, + ILatexEnvironment + ), + ) }); diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs index 2ccbacf..42f9de0 100644 --- a/src/intermediate/macros.rs +++ b/src/intermediate/macros.rs @@ -54,3 +54,17 @@ macro_rules! iselector { } pub(crate) use iselector; + +macro_rules! iitem { + ($registry:expr, $original:expr, $(($penum:path, $ienum:path, $istruct:ident),)*) => { + match $original { +$( + &$penum(inner) => Ok($ienum( + $istruct::new($registry, &inner).await?, + )), +)* + } + }; +} + +pub(crate) use iitem; diff --git a/src/intermediate/object.rs b/src/intermediate/object.rs index b041384..7b183c0 100644 --- a/src/intermediate/object.rs +++ b/src/intermediate/object.rs @@ -1,4 +1,5 @@ use crate::error::CustomError; +use crate::intermediate::macros::iitem; use super::angle_link::IAngleLink; use super::bold::IBold; @@ -62,88 +63,124 @@ pub(crate) enum IObject { Timestamp(ITimestamp), } -iselector!(IObject, Object, |registry, obj| async { - match &obj { - organic::types::Object::Bold(inner) => { - Ok(IObject::Bold(IBold::new(registry, inner).await?)) - } - organic::types::Object::Italic(inner) => { - Ok(IObject::Italic(IItalic::new(registry, inner).await?)) - } - organic::types::Object::Underline(inner) => { - Ok(IObject::Underline(IUnderline::new(registry, inner).await?)) - } - organic::types::Object::StrikeThrough(inner) => Ok(IObject::StrikeThrough( - IStrikeThrough::new(registry, inner).await?, - )), - organic::types::Object::Code(inner) => { - Ok(IObject::Code(ICode::new(registry, inner).await?)) - } - organic::types::Object::Verbatim(inner) => { - Ok(IObject::Verbatim(IVerbatim::new(registry, inner).await?)) - } - organic::types::Object::PlainText(inner) => { - Ok(IObject::PlainText(IPlainText::new(registry, inner).await?)) - } - organic::types::Object::RegularLink(inner) => Ok(IObject::RegularLink( - IRegularLink::new(registry, inner).await?, - )), - organic::types::Object::RadioLink(inner) => { - Ok(IObject::RadioLink(IRadioLink::new(registry, inner).await?)) - } - organic::types::Object::RadioTarget(inner) => Ok(IObject::RadioTarget( - IRadioTarget::new(registry, inner).await?, - )), - organic::types::Object::PlainLink(inner) => { - Ok(IObject::PlainLink(IPlainLink::new(registry, inner).await?)) - } - organic::types::Object::AngleLink(inner) => { - Ok(IObject::AngleLink(IAngleLink::new(registry, inner).await?)) - } - organic::types::Object::OrgMacro(inner) => { - Ok(IObject::OrgMacro(IOrgMacro::new(registry, inner).await?)) - } - organic::types::Object::Entity(inner) => { - Ok(IObject::Entity(IEntity::new(registry, inner).await?)) - } - organic::types::Object::LatexFragment(inner) => Ok(IObject::LatexFragment( - ILatexFragment::new(registry, inner).await?, - )), - organic::types::Object::ExportSnippet(inner) => Ok(IObject::ExportSnippet( - IExportSnippet::new(registry, inner).await?, - )), - organic::types::Object::FootnoteReference(inner) => Ok(IObject::FootnoteReference( - IFootnoteReference::new(registry, inner).await?, - )), - organic::types::Object::Citation(inner) => { - Ok(IObject::Citation(ICitation::new(registry, inner).await?)) - } - organic::types::Object::CitationReference(inner) => Ok(IObject::CitationReference( - ICitationReference::new(registry, inner).await?, - )), - organic::types::Object::InlineBabelCall(inner) => Ok(IObject::InlineBabelCall( - IInlineBabelCall::new(registry, inner).await?, - )), - organic::types::Object::InlineSourceBlock(inner) => Ok(IObject::InlineSourceBlock( - IInlineSourceBlock::new(registry, inner).await?, - )), - organic::types::Object::LineBreak(inner) => { - Ok(IObject::LineBreak(ILineBreak::new(registry, inner).await?)) - } - organic::types::Object::Target(inner) => { - Ok(IObject::Target(ITarget::new(registry, inner).await?)) - } - organic::types::Object::StatisticsCookie(inner) => Ok(IObject::StatisticsCookie( - IStatisticsCookie::new(registry, inner).await?, - )), - organic::types::Object::Subscript(inner) => { - Ok(IObject::Subscript(ISubscript::new(registry, inner).await?)) - } - organic::types::Object::Superscript(inner) => Ok(IObject::Superscript( - ISuperscript::new(registry, inner).await?, - )), - organic::types::Object::Timestamp(inner) => { - Ok(IObject::Timestamp(ITimestamp::new(registry, inner).await?)) - } - } +iselector!(IObject, Object, |registry, original| async { + iitem!( + registry, + original, + (organic::types::Object::Bold, IObject::Bold, IBold), + (organic::types::Object::Italic, IObject::Italic, IItalic), + ( + organic::types::Object::Underline, + IObject::Underline, + IUnderline + ), + ( + organic::types::Object::StrikeThrough, + IObject::StrikeThrough, + IStrikeThrough + ), + (organic::types::Object::Code, IObject::Code, ICode), + ( + organic::types::Object::Verbatim, + IObject::Verbatim, + IVerbatim + ), + ( + organic::types::Object::PlainText, + IObject::PlainText, + IPlainText + ), + ( + organic::types::Object::RegularLink, + IObject::RegularLink, + IRegularLink + ), + ( + organic::types::Object::RadioLink, + IObject::RadioLink, + IRadioLink + ), + ( + organic::types::Object::RadioTarget, + IObject::RadioTarget, + IRadioTarget + ), + ( + organic::types::Object::PlainLink, + IObject::PlainLink, + IPlainLink + ), + ( + organic::types::Object::AngleLink, + IObject::AngleLink, + IAngleLink + ), + ( + organic::types::Object::OrgMacro, + IObject::OrgMacro, + IOrgMacro + ), + (organic::types::Object::Entity, IObject::Entity, IEntity), + ( + organic::types::Object::LatexFragment, + IObject::LatexFragment, + ILatexFragment + ), + ( + organic::types::Object::ExportSnippet, + IObject::ExportSnippet, + IExportSnippet + ), + ( + organic::types::Object::FootnoteReference, + IObject::FootnoteReference, + IFootnoteReference + ), + ( + organic::types::Object::Citation, + IObject::Citation, + ICitation + ), + ( + organic::types::Object::CitationReference, + IObject::CitationReference, + ICitationReference + ), + ( + organic::types::Object::InlineBabelCall, + IObject::InlineBabelCall, + IInlineBabelCall + ), + ( + organic::types::Object::InlineSourceBlock, + IObject::InlineSourceBlock, + IInlineSourceBlock + ), + ( + organic::types::Object::LineBreak, + IObject::LineBreak, + ILineBreak + ), + (organic::types::Object::Target, IObject::Target, ITarget), + ( + organic::types::Object::StatisticsCookie, + IObject::StatisticsCookie, + IStatisticsCookie + ), + ( + organic::types::Object::Subscript, + IObject::Subscript, + ISubscript + ), + ( + organic::types::Object::Superscript, + IObject::Superscript, + ISuperscript + ), + ( + organic::types::Object::Timestamp, + IObject::Timestamp, + ITimestamp + ), + ) }); From 24b9782146ac23edf3db1f0282897fdcb9b9469d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 18:35:42 -0400 Subject: [PATCH 12/24] Avoid closures for the intermediate macro. --- src/intermediate/entity.rs | 2 +- src/intermediate/footnote_definition.rs | 4 +++- src/intermediate/footnote_reference.rs | 22 +++++++++------------- src/intermediate/heading.rs | 2 +- src/intermediate/inline_source_block.rs | 14 +++++--------- src/intermediate/macros.rs | 6 ++++-- src/intermediate/paragraph.rs | 2 +- src/intermediate/plain_list.rs | 2 +- src/intermediate/plain_list_item.rs | 2 +- src/intermediate/plain_text.rs | 2 +- src/intermediate/quote_block.rs | 2 +- src/intermediate/registry.rs | 23 ++++++++--------------- src/intermediate/regular_link.rs | 2 +- src/intermediate/section.rs | 2 +- src/intermediate/src_block.rs | 2 +- src/intermediate/target.rs | 2 +- 16 files changed, 40 insertions(+), 51 deletions(-) diff --git a/src/intermediate/entity.rs b/src/intermediate/entity.rs index 6b22e7b..0f47742 100644 --- a/src/intermediate/entity.rs +++ b/src/intermediate/entity.rs @@ -7,7 +7,7 @@ pub(crate) struct IEntity { pub(crate) html: String, } -intermediate!(IEntity, Entity, |registry, original| async { +intermediate!(IEntity, Entity, original, registry, { Ok(IEntity { html: original.html.to_owned(), }) diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index 1b51fd4..6049f14 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -9,7 +9,9 @@ pub(crate) struct IFootnoteDefinition {} intermediate!( IFootnoteDefinition, FootnoteDefinition, - |registry, original| async { + original, + registry, + { registry .register_footnote_definition(original.label, &original.children) .await?; diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index d06ffa7..aabd7e9 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -8,19 +8,15 @@ pub(crate) struct IFootnoteReference { duplicate_offset: usize, } -intermediate!( - IFootnoteReference, - FootnoteReference, - |registry, original| async { - let footnote_id = registry - .get_footnote_reference_id(original.label, &original.definition) - .await?; - Ok(IFootnoteReference { - footnote_id, - duplicate_offset: 0, // TODO - }) - } -); +intermediate!(IFootnoteReference, FootnoteReference, original, registry, { + let footnote_id = registry + .get_footnote_reference_id(original.label, &original.definition) + .await?; + Ok(IFootnoteReference { + footnote_id, + duplicate_offset: 0, // TODO + }) +}); impl IFootnoteReference { pub(crate) fn get_display_label(&self) -> String { diff --git a/src/intermediate/heading.rs b/src/intermediate/heading.rs index 501b706..8236652 100644 --- a/src/intermediate/heading.rs +++ b/src/intermediate/heading.rs @@ -11,7 +11,7 @@ pub(crate) struct IHeading { pub(crate) children: Vec, } -intermediate!(IHeading, Heading, |registry, original| async { +intermediate!(IHeading, Heading, original, registry, { let title = { let mut ret = Vec::new(); for obj in original.title.iter() { diff --git a/src/intermediate/inline_source_block.rs b/src/intermediate/inline_source_block.rs index 195afdc..700f2fd 100644 --- a/src/intermediate/inline_source_block.rs +++ b/src/intermediate/inline_source_block.rs @@ -7,12 +7,8 @@ pub(crate) struct IInlineSourceBlock { pub(crate) value: String, } -intermediate!( - IInlineSourceBlock, - InlineSourceBlock, - |registry, original| async { - Ok(IInlineSourceBlock { - value: original.value.to_owned(), - }) - } -); +intermediate!(IInlineSourceBlock, InlineSourceBlock, original, registry, { + Ok(IInlineSourceBlock { + value: original.value.to_owned(), + }) +}); diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs index 42f9de0..8c65d1f 100644 --- a/src/intermediate/macros.rs +++ b/src/intermediate/macros.rs @@ -23,13 +23,15 @@ pub(crate) use inoop; /// /// This exists to make changing the type signature easier. macro_rules! intermediate { - ($istruct:ident, $pstruct:ident, $fnbody:expr) => { + ($istruct:ident, $pstruct:ident, $original:ident, $registry:ident, $fnbody:tt) => { impl $istruct { pub(crate) async fn new<'reg, 'orig, 'parse>( registry: &'reg mut Registry<'orig, 'parse>, original: &'orig organic::types::$pstruct<'parse>, ) -> Result<$istruct, CustomError> { - $fnbody(registry, original).await + let $original = original; + let $registry = registry; + $fnbody } } }; diff --git a/src/intermediate/paragraph.rs b/src/intermediate/paragraph.rs index 6a33a4c..90df531 100644 --- a/src/intermediate/paragraph.rs +++ b/src/intermediate/paragraph.rs @@ -8,7 +8,7 @@ pub(crate) struct IParagraph { pub(crate) children: Vec, } -intermediate!(IParagraph, Paragraph, |registry, original| async { +intermediate!(IParagraph, Paragraph, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { diff --git a/src/intermediate/plain_list.rs b/src/intermediate/plain_list.rs index 61ec964..2b208a1 100644 --- a/src/intermediate/plain_list.rs +++ b/src/intermediate/plain_list.rs @@ -9,7 +9,7 @@ pub(crate) struct IPlainList { pub(crate) children: Vec, } -intermediate!(IPlainList, PlainList, |registry, original| async { +intermediate!(IPlainList, PlainList, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { diff --git a/src/intermediate/plain_list_item.rs b/src/intermediate/plain_list_item.rs index 7af4933..774c838 100644 --- a/src/intermediate/plain_list_item.rs +++ b/src/intermediate/plain_list_item.rs @@ -10,7 +10,7 @@ pub(crate) struct IPlainListItem { pub(crate) children: Vec, } -intermediate!(IPlainListItem, PlainListItem, |registry, original| async { +intermediate!(IPlainListItem, PlainListItem, original, registry, { let tag = { let mut ret = Vec::new(); for obj in original.tag.iter() { diff --git a/src/intermediate/plain_text.rs b/src/intermediate/plain_text.rs index 24c6a68..1dceef4 100644 --- a/src/intermediate/plain_text.rs +++ b/src/intermediate/plain_text.rs @@ -8,7 +8,7 @@ pub(crate) struct IPlainText { pub(crate) source: String, } -intermediate!(IPlainText, PlainText, |registry, original| async { +intermediate!(IPlainText, PlainText, original, registry, { Ok(IPlainText { source: coalesce_whitespace(original.source).into_owned(), }) diff --git a/src/intermediate/quote_block.rs b/src/intermediate/quote_block.rs index 27ef6e2..0a74a35 100644 --- a/src/intermediate/quote_block.rs +++ b/src/intermediate/quote_block.rs @@ -8,7 +8,7 @@ pub(crate) struct IQuoteBlock { pub(crate) children: Vec, } -intermediate!(IQuoteBlock, QuoteBlock, |registry, original| async { +intermediate!(IQuoteBlock, QuoteBlock, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 4fe888f..256a5a6 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::marker::PhantomData; use super::ast_node::IntoIAstNode; use crate::error::CustomError; @@ -12,10 +13,8 @@ type IdCounter = u16; pub(crate) struct Registry<'orig, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, - footnote_ids: Vec<( - Option<&'parse str>, - FootnoteDefinitionContents<'orig, 'parse>, - )>, + footnote_ids: Vec<(Option<&'parse str>, Vec)>, + _phantom: PhantomData<&'orig ()>, } impl<'orig, 'parse> Registry<'orig, 'parse> { @@ -24,6 +23,7 @@ impl<'orig, 'parse> Registry<'orig, 'parse> { id_counter: 0, targets: HashMap::new(), footnote_ids: Vec::new(), + _phantom: PhantomData, } } @@ -35,12 +35,10 @@ impl<'orig, 'parse> Registry<'orig, 'parse> { } pub(crate) fn get_footnote_ids(&self) -> impl Iterator)> { - // TODO - std::iter::empty() - // self.footnote_ids - // .iter() - // .map(|(_label, definition)| definition) - // .enumerate() + self.footnote_ids + .iter() + .map(|(_label, definition)| definition) + .enumerate() } /// Get a 0-indexed ID for a footnote. @@ -126,8 +124,3 @@ async fn convert_definition_contents<'reg, 'orig, 'parse>( Ok(contents) } - -enum FootnoteDefinitionContents<'orig, 'parse> { - FromReference(&'orig Vec>), - FromDefinition(&'orig Vec>), -} diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index 6b155cc..8b8ada5 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -9,7 +9,7 @@ pub(crate) struct IRegularLink { pub(crate) children: Vec, } -intermediate!(IRegularLink, RegularLink, |registry, original| async { +intermediate!(IRegularLink, RegularLink, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { diff --git a/src/intermediate/section.rs b/src/intermediate/section.rs index e1c81ee..dea8f2e 100644 --- a/src/intermediate/section.rs +++ b/src/intermediate/section.rs @@ -8,7 +8,7 @@ pub(crate) struct ISection { pub(crate) children: Vec, } -intermediate!(ISection, Section, |registry, original| async { +intermediate!(ISection, Section, original, registry, { let children = { let mut ret = Vec::new(); for elem in original.children.iter() { diff --git a/src/intermediate/src_block.rs b/src/intermediate/src_block.rs index 2a1c608..e780497 100644 --- a/src/intermediate/src_block.rs +++ b/src/intermediate/src_block.rs @@ -7,7 +7,7 @@ pub(crate) struct ISrcBlock { pub(crate) lines: Vec, } -intermediate!(ISrcBlock, SrcBlock, |registry, original| async { +intermediate!(ISrcBlock, SrcBlock, original, registry, { let lines = original .contents .split_inclusive('\n') diff --git a/src/intermediate/target.rs b/src/intermediate/target.rs index 1e41833..138d491 100644 --- a/src/intermediate/target.rs +++ b/src/intermediate/target.rs @@ -8,7 +8,7 @@ pub(crate) struct ITarget { value: String, } -intermediate!(ITarget, Target, |registry, original| async { +intermediate!(ITarget, Target, original, registry, { let id = registry.get_target(original.value); Ok(ITarget { id: id.clone(), From a966be81225bb822304b22bb004a386bdcb3ca3a Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 18:54:50 -0400 Subject: [PATCH 13/24] Remove closures from iselector macro. --- src/intermediate/document_element.rs | 36 +++++++++++++--------------- src/intermediate/element.rs | 2 +- src/intermediate/macros.rs | 15 ++++++++---- src/intermediate/object.rs | 2 +- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/intermediate/document_element.rs b/src/intermediate/document_element.rs index b79220b..8f6b608 100644 --- a/src/intermediate/document_element.rs +++ b/src/intermediate/document_element.rs @@ -12,23 +12,19 @@ pub(crate) enum IDocumentElement { Section(ISection), } -iselector!( - IDocumentElement, - DocumentElement, - |registry, original| async { - iitem!( - registry, - original, - ( - organic::types::DocumentElement::Heading, - IDocumentElement::Heading, - IHeading - ), - ( - organic::types::DocumentElement::Section, - IDocumentElement::Section, - ISection - ), - ) - } -); +iselector!(IDocumentElement, DocumentElement, original, registry, { + iitem!( + registry, + original, + ( + organic::types::DocumentElement::Heading, + IDocumentElement::Heading, + IHeading + ), + ( + organic::types::DocumentElement::Section, + IDocumentElement::Section, + ISection + ), + ) +}); diff --git a/src/intermediate/element.rs b/src/intermediate/element.rs index da1b173..1e1f2ae 100644 --- a/src/intermediate/element.rs +++ b/src/intermediate/element.rs @@ -56,7 +56,7 @@ pub(crate) enum IElement { LatexEnvironment(ILatexEnvironment), } -iselector!(IElement, Element, |registry, original| async { +iselector!(IElement, Element, original, registry, { iitem!( registry, original, diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs index 8c65d1f..10b21c8 100644 --- a/src/intermediate/macros.rs +++ b/src/intermediate/macros.rs @@ -43,13 +43,18 @@ pub(crate) use intermediate; /// /// This exists to make changing the type signature easier. macro_rules! iselector { - ($istruct:ident, $pstruct:ident, $fnbody:expr) => { + ($istruct:ident, $pstruct:ident, $original:ident, $registry:ident, $fnbody:tt) => { impl $istruct { - pub(crate) fn new<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( + pub(crate) fn new<'reg, 'orig, 'parse, 'inp: 'reg + 'orig + 'parse>( registry: &'reg mut Registry<'orig, 'parse>, original: &'orig organic::types::$pstruct<'parse>, ) -> BoxFuture<'inp, Result<$istruct, CustomError>> { - $fnbody(registry, original).boxed() + async move { + let $registry = registry; + let $original = original; + $fnbody + } + .boxed() } } }; @@ -61,8 +66,8 @@ macro_rules! iitem { ($registry:expr, $original:expr, $(($penum:path, $ienum:path, $istruct:ident),)*) => { match $original { $( - &$penum(inner) => Ok($ienum( - $istruct::new($registry, &inner).await?, + $penum(inner) => Ok($ienum( + $istruct::new($registry, inner).await?, )), )* } diff --git a/src/intermediate/object.rs b/src/intermediate/object.rs index 7b183c0..a0b05a2 100644 --- a/src/intermediate/object.rs +++ b/src/intermediate/object.rs @@ -63,7 +63,7 @@ pub(crate) enum IObject { Timestamp(ITimestamp), } -iselector!(IObject, Object, |registry, original| async { +iselector!(IObject, Object, original, registry, { iitem!( registry, original, From f1e985fb32895f6bdb78566dbd30228a612669a0 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 20:01:44 -0400 Subject: [PATCH 14/24] Lifetime issue. --- src/intermediate/ast_node.rs | 35 ++++++++++++----------------------- src/intermediate/macros.rs | 9 +++------ 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/intermediate/ast_node.rs b/src/intermediate/ast_node.rs index 0958180..5e12864 100644 --- a/src/intermediate/ast_node.rs +++ b/src/intermediate/ast_node.rs @@ -112,23 +112,18 @@ pub(crate) enum IAstNode { Timestamp(ITimestamp), } -pub(crate) trait IntoIAstNode { - fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( +pub(crate) trait IntoIAstNode<'parse> { + fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( &'orig self, registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result> - where - Self: 'parse; + ) -> BoxFuture<'inp, Result>; } -impl IntoIAstNode for organic::types::DocumentElement<'_> { - fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( +impl<'parse> IntoIAstNode<'parse> for organic::types::DocumentElement<'parse> { + fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( &'orig self, registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result> - where - Self: 'parse, - { + ) -> BoxFuture<'inp, Result> { async move { match self { organic::types::DocumentElement::Heading(inner) => { @@ -143,14 +138,11 @@ impl IntoIAstNode for organic::types::DocumentElement<'_> { } } -impl IntoIAstNode for organic::types::Element<'_> { - fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( +impl<'parse> IntoIAstNode<'parse> for organic::types::Element<'parse> { + fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( &'orig self, registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result> - where - Self: 'parse, - { + ) -> BoxFuture<'inp, Result> { async move { match self { organic::types::Element::Paragraph(inner) => { @@ -231,14 +223,11 @@ impl IntoIAstNode for organic::types::Element<'_> { } } -impl IntoIAstNode for organic::types::Object<'_> { - fn into_ast_node<'reg, 'orig, 'parse, 'inp: 'reg + 'orig>( +impl<'parse> IntoIAstNode<'parse> for organic::types::Object<'parse> { + fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( &'orig self, registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result> - where - Self: 'parse, - { + ) -> BoxFuture<'inp, Result> { async move { match self { organic::types::Object::Bold(inner) => { diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs index 10b21c8..bb19cfd 100644 --- a/src/intermediate/macros.rs +++ b/src/intermediate/macros.rs @@ -49,12 +49,9 @@ macro_rules! iselector { registry: &'reg mut Registry<'orig, 'parse>, original: &'orig organic::types::$pstruct<'parse>, ) -> BoxFuture<'inp, Result<$istruct, CustomError>> { - async move { - let $registry = registry; - let $original = original; - $fnbody - } - .boxed() + let $registry = registry; + let $original = original; + async move { $fnbody }.boxed() } } }; From 671159cb824c1adcf99b22bab365b99abd92928e Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 20:30:09 -0400 Subject: [PATCH 15/24] Does not work even without IntoAstNode. --- src/intermediate/ast_node.rs | 402 +++++++++++++++++------------------ src/intermediate/registry.rs | 8 +- 2 files changed, 206 insertions(+), 204 deletions(-) diff --git a/src/intermediate/ast_node.rs b/src/intermediate/ast_node.rs index 5e12864..afbc2ab 100644 --- a/src/intermediate/ast_node.rs +++ b/src/intermediate/ast_node.rs @@ -112,207 +112,207 @@ pub(crate) enum IAstNode { Timestamp(ITimestamp), } -pub(crate) trait IntoIAstNode<'parse> { - fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( - &'orig self, - registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result>; -} +// pub(crate) trait IntoIAstNode<'parse> { +// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( +// &'orig self, +// registry: &'reg mut Registry<'orig, 'parse>, +// ) -> BoxFuture<'inp, Result>; +// } -impl<'parse> IntoIAstNode<'parse> for organic::types::DocumentElement<'parse> { - fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( - &'orig self, - registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result> { - async move { - match self { - organic::types::DocumentElement::Heading(inner) => { - Ok(IAstNode::Heading(IHeading::new(registry, inner).await?)) - } - organic::types::DocumentElement::Section(inner) => { - Ok(IAstNode::Section(ISection::new(registry, inner).await?)) - } - } - } - .boxed() - } -} +// impl<'parse> IntoIAstNode<'parse> for organic::types::DocumentElement<'parse> { +// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( +// &'orig self, +// registry: &'reg mut Registry<'orig, 'parse>, +// ) -> BoxFuture<'inp, Result> { +// async move { +// match self { +// organic::types::DocumentElement::Heading(inner) => { +// Ok(IAstNode::Heading(IHeading::new(registry, inner).await?)) +// } +// organic::types::DocumentElement::Section(inner) => { +// Ok(IAstNode::Section(ISection::new(registry, inner).await?)) +// } +// } +// } +// .boxed() +// } +// } -impl<'parse> IntoIAstNode<'parse> for organic::types::Element<'parse> { - fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( - &'orig self, - registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result> { - async move { - match self { - organic::types::Element::Paragraph(inner) => { - Ok(IAstNode::Paragraph(IParagraph::new(registry, inner).await?)) - } - organic::types::Element::PlainList(inner) => { - Ok(IAstNode::PlainList(IPlainList::new(registry, inner).await?)) - } - organic::types::Element::CenterBlock(inner) => Ok(IAstNode::CenterBlock( - ICenterBlock::new(registry, inner).await?, - )), - organic::types::Element::QuoteBlock(inner) => Ok(IAstNode::QuoteBlock( - IQuoteBlock::new(registry, inner).await?, - )), - organic::types::Element::SpecialBlock(inner) => Ok(IAstNode::SpecialBlock( - ISpecialBlock::new(registry, inner).await?, - )), - organic::types::Element::DynamicBlock(inner) => Ok(IAstNode::DynamicBlock( - IDynamicBlock::new(registry, inner).await?, - )), - organic::types::Element::FootnoteDefinition(inner) => Ok( - IAstNode::FootnoteDefinition(IFootnoteDefinition::new(registry, inner).await?), - ), - organic::types::Element::Comment(inner) => { - Ok(IAstNode::Comment(IComment::new(registry, inner).await?)) - } - organic::types::Element::Drawer(inner) => { - Ok(IAstNode::Drawer(IDrawer::new(registry, inner).await?)) - } - organic::types::Element::PropertyDrawer(inner) => Ok(IAstNode::PropertyDrawer( - IPropertyDrawer::new(registry, inner).await?, - )), - organic::types::Element::Table(inner) => { - Ok(IAstNode::Table(ITable::new(registry, inner).await?)) - } - organic::types::Element::VerseBlock(inner) => Ok(IAstNode::VerseBlock( - IVerseBlock::new(registry, inner).await?, - )), - organic::types::Element::CommentBlock(inner) => Ok(IAstNode::CommentBlock( - ICommentBlock::new(registry, inner).await?, - )), - organic::types::Element::ExampleBlock(inner) => Ok(IAstNode::ExampleBlock( - IExampleBlock::new(registry, inner).await?, - )), - organic::types::Element::ExportBlock(inner) => Ok(IAstNode::ExportBlock( - IExportBlock::new(registry, inner).await?, - )), - organic::types::Element::SrcBlock(inner) => { - Ok(IAstNode::SrcBlock(ISrcBlock::new(registry, inner).await?)) - } - organic::types::Element::Clock(inner) => { - Ok(IAstNode::Clock(IClock::new(registry, inner).await?)) - } - organic::types::Element::DiarySexp(inner) => { - Ok(IAstNode::DiarySexp(IDiarySexp::new(registry, inner).await?)) - } - organic::types::Element::Planning(inner) => { - Ok(IAstNode::Planning(IPlanning::new(registry, inner).await?)) - } - organic::types::Element::FixedWidthArea(inner) => Ok(IAstNode::FixedWidthArea( - IFixedWidthArea::new(registry, inner).await?, - )), - organic::types::Element::HorizontalRule(inner) => Ok(IAstNode::HorizontalRule( - IHorizontalRule::new(registry, inner).await?, - )), - organic::types::Element::Keyword(inner) => { - Ok(IAstNode::Keyword(IKeyword::new(registry, inner).await?)) - } - organic::types::Element::BabelCall(inner) => { - Ok(IAstNode::BabelCall(IBabelCall::new(registry, inner).await?)) - } - organic::types::Element::LatexEnvironment(inner) => Ok(IAstNode::LatexEnvironment( - ILatexEnvironment::new(registry, inner).await?, - )), - } - } - .boxed() - } -} +// impl<'parse> IntoIAstNode<'parse> for organic::types::Element<'parse> { +// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( +// &'orig self, +// registry: &'reg mut Registry<'orig, 'parse>, +// ) -> BoxFuture<'inp, Result> { +// async move { +// match self { +// organic::types::Element::Paragraph(inner) => { +// Ok(IAstNode::Paragraph(IParagraph::new(registry, inner).await?)) +// } +// organic::types::Element::PlainList(inner) => { +// Ok(IAstNode::PlainList(IPlainList::new(registry, inner).await?)) +// } +// organic::types::Element::CenterBlock(inner) => Ok(IAstNode::CenterBlock( +// ICenterBlock::new(registry, inner).await?, +// )), +// organic::types::Element::QuoteBlock(inner) => Ok(IAstNode::QuoteBlock( +// IQuoteBlock::new(registry, inner).await?, +// )), +// organic::types::Element::SpecialBlock(inner) => Ok(IAstNode::SpecialBlock( +// ISpecialBlock::new(registry, inner).await?, +// )), +// organic::types::Element::DynamicBlock(inner) => Ok(IAstNode::DynamicBlock( +// IDynamicBlock::new(registry, inner).await?, +// )), +// organic::types::Element::FootnoteDefinition(inner) => Ok( +// IAstNode::FootnoteDefinition(IFootnoteDefinition::new(registry, inner).await?), +// ), +// organic::types::Element::Comment(inner) => { +// Ok(IAstNode::Comment(IComment::new(registry, inner).await?)) +// } +// organic::types::Element::Drawer(inner) => { +// Ok(IAstNode::Drawer(IDrawer::new(registry, inner).await?)) +// } +// organic::types::Element::PropertyDrawer(inner) => Ok(IAstNode::PropertyDrawer( +// IPropertyDrawer::new(registry, inner).await?, +// )), +// organic::types::Element::Table(inner) => { +// Ok(IAstNode::Table(ITable::new(registry, inner).await?)) +// } +// organic::types::Element::VerseBlock(inner) => Ok(IAstNode::VerseBlock( +// IVerseBlock::new(registry, inner).await?, +// )), +// organic::types::Element::CommentBlock(inner) => Ok(IAstNode::CommentBlock( +// ICommentBlock::new(registry, inner).await?, +// )), +// organic::types::Element::ExampleBlock(inner) => Ok(IAstNode::ExampleBlock( +// IExampleBlock::new(registry, inner).await?, +// )), +// organic::types::Element::ExportBlock(inner) => Ok(IAstNode::ExportBlock( +// IExportBlock::new(registry, inner).await?, +// )), +// organic::types::Element::SrcBlock(inner) => { +// Ok(IAstNode::SrcBlock(ISrcBlock::new(registry, inner).await?)) +// } +// organic::types::Element::Clock(inner) => { +// Ok(IAstNode::Clock(IClock::new(registry, inner).await?)) +// } +// organic::types::Element::DiarySexp(inner) => { +// Ok(IAstNode::DiarySexp(IDiarySexp::new(registry, inner).await?)) +// } +// organic::types::Element::Planning(inner) => { +// Ok(IAstNode::Planning(IPlanning::new(registry, inner).await?)) +// } +// organic::types::Element::FixedWidthArea(inner) => Ok(IAstNode::FixedWidthArea( +// IFixedWidthArea::new(registry, inner).await?, +// )), +// organic::types::Element::HorizontalRule(inner) => Ok(IAstNode::HorizontalRule( +// IHorizontalRule::new(registry, inner).await?, +// )), +// organic::types::Element::Keyword(inner) => { +// Ok(IAstNode::Keyword(IKeyword::new(registry, inner).await?)) +// } +// organic::types::Element::BabelCall(inner) => { +// Ok(IAstNode::BabelCall(IBabelCall::new(registry, inner).await?)) +// } +// organic::types::Element::LatexEnvironment(inner) => Ok(IAstNode::LatexEnvironment( +// ILatexEnvironment::new(registry, inner).await?, +// )), +// } +// } +// .boxed() +// } +// } -impl<'parse> IntoIAstNode<'parse> for organic::types::Object<'parse> { - fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( - &'orig self, - registry: &'reg mut Registry<'orig, 'parse>, - ) -> BoxFuture<'inp, Result> { - async move { - match self { - organic::types::Object::Bold(inner) => { - Ok(IAstNode::Bold(IBold::new(registry, inner).await?)) - } - organic::types::Object::Italic(inner) => { - Ok(IAstNode::Italic(IItalic::new(registry, inner).await?)) - } - organic::types::Object::Underline(inner) => { - Ok(IAstNode::Underline(IUnderline::new(registry, inner).await?)) - } - organic::types::Object::StrikeThrough(inner) => Ok(IAstNode::StrikeThrough( - IStrikeThrough::new(registry, inner).await?, - )), - organic::types::Object::Code(inner) => { - Ok(IAstNode::Code(ICode::new(registry, inner).await?)) - } - organic::types::Object::Verbatim(inner) => { - Ok(IAstNode::Verbatim(IVerbatim::new(registry, inner).await?)) - } - organic::types::Object::PlainText(inner) => { - Ok(IAstNode::PlainText(IPlainText::new(registry, inner).await?)) - } - organic::types::Object::RegularLink(inner) => Ok(IAstNode::RegularLink( - IRegularLink::new(registry, inner).await?, - )), - organic::types::Object::RadioLink(inner) => { - Ok(IAstNode::RadioLink(IRadioLink::new(registry, inner).await?)) - } - organic::types::Object::RadioTarget(inner) => Ok(IAstNode::RadioTarget( - IRadioTarget::new(registry, inner).await?, - )), - organic::types::Object::PlainLink(inner) => { - Ok(IAstNode::PlainLink(IPlainLink::new(registry, inner).await?)) - } - organic::types::Object::AngleLink(inner) => { - Ok(IAstNode::AngleLink(IAngleLink::new(registry, inner).await?)) - } - organic::types::Object::OrgMacro(inner) => { - Ok(IAstNode::OrgMacro(IOrgMacro::new(registry, inner).await?)) - } - organic::types::Object::Entity(inner) => { - Ok(IAstNode::Entity(IEntity::new(registry, inner).await?)) - } - organic::types::Object::LatexFragment(inner) => Ok(IAstNode::LatexFragment( - ILatexFragment::new(registry, inner).await?, - )), - organic::types::Object::ExportSnippet(inner) => Ok(IAstNode::ExportSnippet( - IExportSnippet::new(registry, inner).await?, - )), - organic::types::Object::FootnoteReference(inner) => Ok( - IAstNode::FootnoteReference(IFootnoteReference::new(registry, inner).await?), - ), - organic::types::Object::Citation(inner) => { - Ok(IAstNode::Citation(ICitation::new(registry, inner).await?)) - } - organic::types::Object::CitationReference(inner) => Ok( - IAstNode::CitationReference(ICitationReference::new(registry, inner).await?), - ), - organic::types::Object::InlineBabelCall(inner) => Ok(IAstNode::InlineBabelCall( - IInlineBabelCall::new(registry, inner).await?, - )), - organic::types::Object::InlineSourceBlock(inner) => Ok( - IAstNode::InlineSourceBlock(IInlineSourceBlock::new(registry, inner).await?), - ), - organic::types::Object::LineBreak(inner) => { - Ok(IAstNode::LineBreak(ILineBreak::new(registry, inner).await?)) - } - organic::types::Object::Target(inner) => { - Ok(IAstNode::Target(ITarget::new(registry, inner).await?)) - } - organic::types::Object::StatisticsCookie(inner) => Ok(IAstNode::StatisticsCookie( - IStatisticsCookie::new(registry, inner).await?, - )), - organic::types::Object::Subscript(inner) => { - Ok(IAstNode::Subscript(ISubscript::new(registry, inner).await?)) - } - organic::types::Object::Superscript(inner) => Ok(IAstNode::Superscript( - ISuperscript::new(registry, inner).await?, - )), - organic::types::Object::Timestamp(inner) => { - Ok(IAstNode::Timestamp(ITimestamp::new(registry, inner).await?)) - } - } - } - .boxed() - } -} +// impl<'parse> IntoIAstNode<'parse> for organic::types::Object<'parse> { +// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( +// &'orig self, +// registry: &'reg mut Registry<'orig, 'parse>, +// ) -> BoxFuture<'inp, Result> { +// async move { +// match self { +// organic::types::Object::Bold(inner) => { +// Ok(IAstNode::Bold(IBold::new(registry, inner).await?)) +// } +// organic::types::Object::Italic(inner) => { +// Ok(IAstNode::Italic(IItalic::new(registry, inner).await?)) +// } +// organic::types::Object::Underline(inner) => { +// Ok(IAstNode::Underline(IUnderline::new(registry, inner).await?)) +// } +// organic::types::Object::StrikeThrough(inner) => Ok(IAstNode::StrikeThrough( +// IStrikeThrough::new(registry, inner).await?, +// )), +// organic::types::Object::Code(inner) => { +// Ok(IAstNode::Code(ICode::new(registry, inner).await?)) +// } +// organic::types::Object::Verbatim(inner) => { +// Ok(IAstNode::Verbatim(IVerbatim::new(registry, inner).await?)) +// } +// organic::types::Object::PlainText(inner) => { +// Ok(IAstNode::PlainText(IPlainText::new(registry, inner).await?)) +// } +// organic::types::Object::RegularLink(inner) => Ok(IAstNode::RegularLink( +// IRegularLink::new(registry, inner).await?, +// )), +// organic::types::Object::RadioLink(inner) => { +// Ok(IAstNode::RadioLink(IRadioLink::new(registry, inner).await?)) +// } +// organic::types::Object::RadioTarget(inner) => Ok(IAstNode::RadioTarget( +// IRadioTarget::new(registry, inner).await?, +// )), +// organic::types::Object::PlainLink(inner) => { +// Ok(IAstNode::PlainLink(IPlainLink::new(registry, inner).await?)) +// } +// organic::types::Object::AngleLink(inner) => { +// Ok(IAstNode::AngleLink(IAngleLink::new(registry, inner).await?)) +// } +// organic::types::Object::OrgMacro(inner) => { +// Ok(IAstNode::OrgMacro(IOrgMacro::new(registry, inner).await?)) +// } +// organic::types::Object::Entity(inner) => { +// Ok(IAstNode::Entity(IEntity::new(registry, inner).await?)) +// } +// organic::types::Object::LatexFragment(inner) => Ok(IAstNode::LatexFragment( +// ILatexFragment::new(registry, inner).await?, +// )), +// organic::types::Object::ExportSnippet(inner) => Ok(IAstNode::ExportSnippet( +// IExportSnippet::new(registry, inner).await?, +// )), +// organic::types::Object::FootnoteReference(inner) => Ok( +// IAstNode::FootnoteReference(IFootnoteReference::new(registry, inner).await?), +// ), +// organic::types::Object::Citation(inner) => { +// Ok(IAstNode::Citation(ICitation::new(registry, inner).await?)) +// } +// organic::types::Object::CitationReference(inner) => Ok( +// IAstNode::CitationReference(ICitationReference::new(registry, inner).await?), +// ), +// organic::types::Object::InlineBabelCall(inner) => Ok(IAstNode::InlineBabelCall( +// IInlineBabelCall::new(registry, inner).await?, +// )), +// organic::types::Object::InlineSourceBlock(inner) => Ok( +// IAstNode::InlineSourceBlock(IInlineSourceBlock::new(registry, inner).await?), +// ), +// organic::types::Object::LineBreak(inner) => { +// Ok(IAstNode::LineBreak(ILineBreak::new(registry, inner).await?)) +// } +// organic::types::Object::Target(inner) => { +// Ok(IAstNode::Target(ITarget::new(registry, inner).await?)) +// } +// organic::types::Object::StatisticsCookie(inner) => Ok(IAstNode::StatisticsCookie( +// IStatisticsCookie::new(registry, inner).await?, +// )), +// organic::types::Object::Subscript(inner) => { +// Ok(IAstNode::Subscript(ISubscript::new(registry, inner).await?)) +// } +// organic::types::Object::Superscript(inner) => Ok(IAstNode::Superscript( +// ISuperscript::new(registry, inner).await?, +// )), +// organic::types::Object::Timestamp(inner) => { +// Ok(IAstNode::Timestamp(ITimestamp::new(registry, inner).await?)) +// } +// } +// } +// .boxed() +// } +// } diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 256a5a6..0a7861d 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::marker::PhantomData; -use super::ast_node::IntoIAstNode; +// use super::ast_node::IntoIAstNode; use crate::error::CustomError; use organic::types::Element; use organic::types::Object; @@ -102,7 +102,8 @@ async fn convert_reference_contents<'reg, 'orig, 'parse>( let contents = { let mut ret = Vec::new(); for obj in contents.iter() { - ret.push(obj.into_ast_node(registry).await?); + // TODO + // ret.push(obj.into_ast_node(registry).await?); } ret }; @@ -117,7 +118,8 @@ async fn convert_definition_contents<'reg, 'orig, 'parse>( let contents = { let mut ret = Vec::new(); for obj in contents.iter() { - ret.push(obj.into_ast_node(registry).await?); + // TODO + // ret.push(obj.into_ast_node(registry).await?); } ret }; From f63620b547c5a1ce89f643815de2fb2cb565e3eb Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 20:32:06 -0400 Subject: [PATCH 16/24] Registry being mutuably borrowed. --- src/intermediate/macros.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs index bb19cfd..bd982e0 100644 --- a/src/intermediate/macros.rs +++ b/src/intermediate/macros.rs @@ -45,7 +45,7 @@ pub(crate) use intermediate; macro_rules! iselector { ($istruct:ident, $pstruct:ident, $original:ident, $registry:ident, $fnbody:tt) => { impl $istruct { - pub(crate) fn new<'reg, 'orig, 'parse, 'inp: 'reg + 'orig + 'parse>( + pub(crate) fn new<'reg: 'orig, 'orig, 'parse, 'inp: 'reg + 'orig>( registry: &'reg mut Registry<'orig, 'parse>, original: &'orig organic::types::$pstruct<'parse>, ) -> BoxFuture<'inp, Result<$istruct, CustomError>> { From 1f3b5262b80a2fbb4ea9e54c5fbad089bcfa9e38 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 21:19:30 -0400 Subject: [PATCH 17/24] Fix build by making the registry guarded by an ArcMutex. --- src/intermediate/definition.rs | 11 +-- src/intermediate/footnote_definition.rs | 10 +- src/intermediate/footnote_reference.rs | 6 +- src/intermediate/heading.rs | 4 +- src/intermediate/macros.rs | 14 +-- src/intermediate/mod.rs | 3 + src/intermediate/page.rs | 21 +++-- src/intermediate/paragraph.rs | 2 +- src/intermediate/plain_list.rs | 2 +- src/intermediate/plain_list_item.rs | 4 +- src/intermediate/quote_block.rs | 2 +- src/intermediate/registry.rs | 119 +++++++++++++----------- src/intermediate/regular_link.rs | 2 +- src/intermediate/section.rs | 2 +- src/intermediate/target.rs | 1 + 15 files changed, 113 insertions(+), 90 deletions(-) diff --git a/src/intermediate/definition.rs b/src/intermediate/definition.rs index 6e21bb6..4b58d8e 100644 --- a/src/intermediate/definition.rs +++ b/src/intermediate/definition.rs @@ -1,5 +1,7 @@ use std::path::Path; use std::path::PathBuf; +use std::sync::Arc; +use std::sync::Mutex; use tokio::task::JoinHandle; use walkdir::WalkDir; @@ -58,14 +60,11 @@ impl BlogPost { _ => {} }); + let registry = Arc::new(Mutex::new(registry)); let relative_to_post_dir_path = real_path.strip_prefix(post_dir)?; ret.push( - BlogPostPage::new( - relative_to_post_dir_path, - &mut registry, - parsed_document, - ) - .await?, + BlogPostPage::new(relative_to_post_dir_path, registry, parsed_document) + .await?, ); } ret diff --git a/src/intermediate/footnote_definition.rs b/src/intermediate/footnote_definition.rs index 6049f14..4d0ae61 100644 --- a/src/intermediate/footnote_definition.rs +++ b/src/intermediate/footnote_definition.rs @@ -1,7 +1,9 @@ use super::macros::intermediate; +use super::registry::register_footnote_definition; use super::registry::Registry; use super::IAstNode; use crate::error::CustomError; +use crate::intermediate::RefRegistry; #[derive(Debug, Clone)] pub(crate) struct IFootnoteDefinition {} @@ -12,9 +14,7 @@ intermediate!( original, registry, { - registry - .register_footnote_definition(original.label, &original.children) - .await?; + register_footnote_definition(registry, original.label, &original.children).await?; Ok(IFootnoteDefinition {}) } ); @@ -26,8 +26,8 @@ pub(crate) struct IRealFootnoteDefinition { } impl IRealFootnoteDefinition { - pub(crate) async fn new<'reg, 'orig, 'parse>( - registry: &'reg mut Registry<'orig, 'parse>, + pub(crate) async fn new<'orig, 'parse>( + registry: RefRegistry<'orig, 'parse>, footnote_id: usize, contents: Vec, ) -> Result { diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index aabd7e9..c63966b 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -1,4 +1,5 @@ use super::macros::intermediate; +use super::registry::get_footnote_reference_id; use super::registry::Registry; use crate::error::CustomError; @@ -9,9 +10,8 @@ pub(crate) struct IFootnoteReference { } intermediate!(IFootnoteReference, FootnoteReference, original, registry, { - let footnote_id = registry - .get_footnote_reference_id(original.label, &original.definition) - .await?; + let footnote_id = + get_footnote_reference_id(registry, original.label, &original.definition).await?; Ok(IFootnoteReference { footnote_id, duplicate_offset: 0, // TODO diff --git a/src/intermediate/heading.rs b/src/intermediate/heading.rs index 8236652..716545f 100644 --- a/src/intermediate/heading.rs +++ b/src/intermediate/heading.rs @@ -15,14 +15,14 @@ intermediate!(IHeading, Heading, original, registry, { let title = { let mut ret = Vec::new(); for obj in original.title.iter() { - ret.push(IObject::new(registry, obj).await?); + ret.push(IObject::new(registry.clone(), obj).await?); } ret }; let children = { let mut ret = Vec::new(); for obj in original.children.iter() { - ret.push(IDocumentElement::new(registry, obj).await?); + ret.push(IDocumentElement::new(registry.clone(), obj).await?); } ret }; diff --git a/src/intermediate/macros.rs b/src/intermediate/macros.rs index bd982e0..f7b6236 100644 --- a/src/intermediate/macros.rs +++ b/src/intermediate/macros.rs @@ -8,7 +8,7 @@ macro_rules! inoop { impl $istruct { pub(crate) async fn new<'reg, 'orig, 'parse>( - registry: &'reg mut Registry<'orig, 'parse>, + registry: crate::intermediate::RefRegistry<'orig, 'parse>, original: &'orig organic::types::$pstruct<'parse>, ) -> Result<$istruct, CustomError> { Ok($istruct {}) @@ -25,8 +25,8 @@ pub(crate) use inoop; macro_rules! intermediate { ($istruct:ident, $pstruct:ident, $original:ident, $registry:ident, $fnbody:tt) => { impl $istruct { - pub(crate) async fn new<'reg, 'orig, 'parse>( - registry: &'reg mut Registry<'orig, 'parse>, + pub(crate) async fn new<'orig, 'parse>( + registry: crate::intermediate::RefRegistry<'orig, 'parse>, original: &'orig organic::types::$pstruct<'parse>, ) -> Result<$istruct, CustomError> { let $original = original; @@ -45,10 +45,10 @@ pub(crate) use intermediate; macro_rules! iselector { ($istruct:ident, $pstruct:ident, $original:ident, $registry:ident, $fnbody:tt) => { impl $istruct { - pub(crate) fn new<'reg: 'orig, 'orig, 'parse, 'inp: 'reg + 'orig>( - registry: &'reg mut Registry<'orig, 'parse>, + pub(crate) fn new<'orig, 'parse>( + registry: crate::intermediate::RefRegistry<'orig, 'parse>, original: &'orig organic::types::$pstruct<'parse>, - ) -> BoxFuture<'inp, Result<$istruct, CustomError>> { + ) -> BoxFuture<'orig, Result<$istruct, CustomError>> { let $registry = registry; let $original = original; async move { $fnbody }.boxed() @@ -64,7 +64,7 @@ macro_rules! iitem { match $original { $( $penum(inner) => Ok($ienum( - $istruct::new($registry, inner).await?, + $istruct::new($registry.clone(), inner).await?, )), )* } diff --git a/src/intermediate/mod.rs b/src/intermediate/mod.rs index bd8e38a..f228fdb 100644 --- a/src/intermediate/mod.rs +++ b/src/intermediate/mod.rs @@ -124,3 +124,6 @@ pub(crate) use timestamp::ITimestamp; pub(crate) use underline::IUnderline; pub(crate) use verbatim::IVerbatim; pub(crate) use verse_block::IVerseBlock; + +pub(crate) type RefRegistry<'orig, 'parse> = + std::sync::Arc>>; diff --git a/src/intermediate/page.rs b/src/intermediate/page.rs index 957a1ad..404852e 100644 --- a/src/intermediate/page.rs +++ b/src/intermediate/page.rs @@ -7,6 +7,7 @@ use super::registry::Registry; use super::IDocumentElement; use super::IHeading; use super::ISection; +use super::RefRegistry; #[derive(Debug)] pub(crate) struct BlogPostPage { @@ -24,30 +25,34 @@ impl BlogPostPage { // TODO: Move path into the registry so I can give this a standard interface like the others. pub(crate) async fn new<'a, 'b, 'parse, P: Into>( path: P, - registry: &'a mut Registry<'b, 'parse>, + registry: RefRegistry<'b, 'parse>, document: &'b organic::types::Document<'parse>, ) -> Result { let path = path.into(); let mut children = Vec::new(); if let Some(section) = document.zeroth_section.as_ref() { children.push(IDocumentElement::Section( - ISection::new(registry, section).await?, + ISection::new(registry.clone(), section).await?, )); } for heading in document.children.iter() { children.push(IDocumentElement::Heading( - IHeading::new(registry, heading).await?, + IHeading::new(registry.clone(), heading).await?, )); } let footnotes = { - let footnote_definitions: Vec<_> = registry - .get_footnote_ids() - .map(|(id, def)| (id, def.clone())) - .collect(); + let footnote_definitions: Vec<_> = { + let registry = registry.lock().unwrap(); + let ret = registry + .get_footnote_ids() + .map(|(id, def)| (id, def.clone())) + .collect(); + ret + }; let mut ret = Vec::new(); for (id, def) in footnote_definitions.into_iter() { - ret.push(IRealFootnoteDefinition::new(registry, id, def).await?); + ret.push(IRealFootnoteDefinition::new(registry.clone(), id, def).await?); } ret }; diff --git a/src/intermediate/paragraph.rs b/src/intermediate/paragraph.rs index 90df531..675f22e 100644 --- a/src/intermediate/paragraph.rs +++ b/src/intermediate/paragraph.rs @@ -12,7 +12,7 @@ intermediate!(IParagraph, Paragraph, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { - ret.push(IObject::new(registry, obj).await?); + ret.push(IObject::new(registry.clone(), obj).await?); } ret }; diff --git a/src/intermediate/plain_list.rs b/src/intermediate/plain_list.rs index 2b208a1..5a4e62b 100644 --- a/src/intermediate/plain_list.rs +++ b/src/intermediate/plain_list.rs @@ -13,7 +13,7 @@ intermediate!(IPlainList, PlainList, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { - ret.push(IPlainListItem::new(registry, obj).await?); + ret.push(IPlainListItem::new(registry.clone(), obj).await?); } ret }; diff --git a/src/intermediate/plain_list_item.rs b/src/intermediate/plain_list_item.rs index 774c838..8bb03da 100644 --- a/src/intermediate/plain_list_item.rs +++ b/src/intermediate/plain_list_item.rs @@ -14,7 +14,7 @@ intermediate!(IPlainListItem, PlainListItem, original, registry, { let tag = { let mut ret = Vec::new(); for obj in original.tag.iter() { - ret.push(IObject::new(registry, obj).await?); + ret.push(IObject::new(registry.clone(), obj).await?); } ret }; @@ -22,7 +22,7 @@ intermediate!(IPlainListItem, PlainListItem, original, registry, { let children = { let mut ret = Vec::new(); for elem in original.children.iter() { - ret.push(IElement::new(registry, elem).await?); + ret.push(IElement::new(registry.clone(), elem).await?); } ret }; diff --git a/src/intermediate/quote_block.rs b/src/intermediate/quote_block.rs index 0a74a35..82ad4ed 100644 --- a/src/intermediate/quote_block.rs +++ b/src/intermediate/quote_block.rs @@ -12,7 +12,7 @@ intermediate!(IQuoteBlock, QuoteBlock, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { - ret.push(IElement::new(registry, obj).await?); + ret.push(IElement::new(registry.clone(), obj).await?); } ret }; diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 0a7861d..5890e68 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -1,5 +1,7 @@ use std::collections::HashMap; use std::marker::PhantomData; +use std::sync::Arc; +use std::sync::Mutex; // use super::ast_node::IntoIAstNode; use crate::error::CustomError; @@ -7,6 +9,7 @@ use organic::types::Element; use organic::types::Object; use super::ast_node::IAstNode; +use super::RefRegistry; type IdCounter = u16; @@ -40,63 +43,75 @@ impl<'orig, 'parse> Registry<'orig, 'parse> { .map(|(_label, definition)| definition) .enumerate() } +} - /// Get a 0-indexed ID for a footnote. - /// - /// This needs to be incremented to be 1-indexed for render. - pub(crate) async fn get_footnote_reference_id<'reg>( - &'reg mut self, - label: Option<&'parse str>, - definition: &'orig Vec>, - ) -> Result { - if let None = label { - // If it has no label then it must always get a new ID. - let contents = convert_reference_contents(self, definition).await?; - self.footnote_ids.push((None, contents)); - return Ok(self.footnote_ids.len() - 1); - } - - if let Some(existing_id) = self - .footnote_ids - .iter() - .position(|(id, _definition)| *id == label) - { - if !definition.is_empty() { - let contents = convert_reference_contents(self, definition).await?; - let entry = self - .footnote_ids - .get_mut(existing_id) - .expect("If-statement proves this to be Some."); - entry.1 = contents; - } - Ok(existing_id) - } else { - let contents = convert_reference_contents(self, definition).await?; - self.footnote_ids.push((label, contents)); - Ok(self.footnote_ids.len() - 1) - } +/// Get a 0-indexed ID for a footnote. +/// +/// This needs to be incremented to be 1-indexed for render. +pub(crate) async fn get_footnote_reference_id<'orig, 'parse>( + registry: RefRegistry<'orig, 'parse>, + label: Option<&'parse str>, + definition: &'orig Vec>, +) -> Result { + if let None = label { + // If it has no label then it must always get a new ID. + let contents = convert_reference_contents(registry.clone(), definition).await?; + let pos = { + let mut registry = registry.lock().unwrap(); + registry.footnote_ids.push((None, contents)); + registry.footnote_ids.len() - 1 + }; + return Ok(pos); } - /// Update the definition to a footnote but do not mark it as referenced. - pub(crate) async fn register_footnote_definition<'reg>( - &'reg mut self, - label: &'parse str, - definition: &'orig Vec>, - ) -> Result<(), CustomError> { - let contents = convert_definition_contents(self, definition).await?; - if let Some((_existing_id, existing_definition)) = self - .footnote_ids - .iter_mut() - .find(|(id, _definition)| *id == Some(label)) - { - *existing_definition = contents; + let existing_index = registry + .lock() + .unwrap() + .footnote_ids + .iter() + .position(|(id, _definition)| *id == label); + if let Some(existing_id) = existing_index { + if !definition.is_empty() { + let contents = convert_reference_contents(registry.clone(), definition).await?; + let mut registry = registry.lock().unwrap(); + let entry = registry + .footnote_ids + .get_mut(existing_id) + .expect("If-statement proves this to be Some."); + entry.1 = contents; } - Ok(()) + Ok(existing_id) + } else { + let contents = convert_reference_contents(registry.clone(), definition).await?; + let pos = { + let mut registry = registry.lock().unwrap(); + registry.footnote_ids.push((label, contents)); + registry.footnote_ids.len() - 1 + }; + Ok(pos) } } -async fn convert_reference_contents<'reg, 'orig, 'parse>( - registry: &'reg mut Registry<'orig, 'parse>, +/// Update the definition to a footnote but do not mark it as referenced. +pub(crate) async fn register_footnote_definition<'orig, 'parse>( + registry: RefRegistry<'orig, 'parse>, + label: &'parse str, + definition: &'orig Vec>, +) -> Result<(), CustomError> { + let contents = convert_definition_contents(registry.clone(), definition).await?; + let mut registry = registry.lock().unwrap(); + if let Some((_existing_id, existing_definition)) = registry + .footnote_ids + .iter_mut() + .find(|(id, _definition)| *id == Some(label)) + { + *existing_definition = contents; + } + Ok(()) +} + +async fn convert_reference_contents<'orig, 'parse>( + registry: RefRegistry<'orig, 'parse>, contents: &'orig Vec>, ) -> Result, CustomError> { let contents = { @@ -111,8 +126,8 @@ async fn convert_reference_contents<'reg, 'orig, 'parse>( Ok(contents) } -async fn convert_definition_contents<'reg, 'orig, 'parse>( - registry: &'reg mut Registry<'orig, 'parse>, +async fn convert_definition_contents<'orig, 'parse>( + registry: RefRegistry<'orig, 'parse>, contents: &'orig Vec>, ) -> Result, CustomError> { let contents = { diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index 8b8ada5..2e85bd7 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -13,7 +13,7 @@ intermediate!(IRegularLink, RegularLink, original, registry, { let children = { let mut ret = Vec::new(); for obj in original.children.iter() { - ret.push(IObject::new(registry, obj).await?); + ret.push(IObject::new(registry.clone(), obj).await?); } ret }; diff --git a/src/intermediate/section.rs b/src/intermediate/section.rs index dea8f2e..d095620 100644 --- a/src/intermediate/section.rs +++ b/src/intermediate/section.rs @@ -12,7 +12,7 @@ intermediate!(ISection, Section, original, registry, { let children = { let mut ret = Vec::new(); for elem in original.children.iter() { - ret.push(IElement::new(registry, elem).await?); + ret.push(IElement::new(registry.clone(), elem).await?); } ret }; diff --git a/src/intermediate/target.rs b/src/intermediate/target.rs index 138d491..c27eccc 100644 --- a/src/intermediate/target.rs +++ b/src/intermediate/target.rs @@ -9,6 +9,7 @@ pub(crate) struct ITarget { } intermediate!(ITarget, Target, original, registry, { + let mut registry = registry.lock().unwrap(); let id = registry.get_target(original.value); Ok(ITarget { id: id.clone(), From afe62de2b6d5a41a7ed3d3ff92b29fe7a17deb52 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 21:33:43 -0400 Subject: [PATCH 18/24] Re-enable AstNode. --- src/intermediate/ast_node.rs | 403 ++++++++++++++++++----------------- src/intermediate/registry.rs | 7 +- 2 files changed, 205 insertions(+), 205 deletions(-) diff --git a/src/intermediate/ast_node.rs b/src/intermediate/ast_node.rs index afbc2ab..c205e19 100644 --- a/src/intermediate/ast_node.rs +++ b/src/intermediate/ast_node.rs @@ -52,6 +52,7 @@ use super::ITimestamp; use super::IUnderline; use super::IVerbatim; use super::IVerseBlock; +use super::RefRegistry; use crate::error::CustomError; use futures::future::{BoxFuture, FutureExt}; @@ -112,207 +113,207 @@ pub(crate) enum IAstNode { Timestamp(ITimestamp), } -// pub(crate) trait IntoIAstNode<'parse> { -// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( -// &'orig self, -// registry: &'reg mut Registry<'orig, 'parse>, -// ) -> BoxFuture<'inp, Result>; -// } +pub(crate) trait IntoIAstNode<'parse> { + fn into_ast_node<'orig>( + &'orig self, + registry: RefRegistry<'orig, 'parse>, + ) -> BoxFuture<'orig, Result>; +} -// impl<'parse> IntoIAstNode<'parse> for organic::types::DocumentElement<'parse> { -// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( -// &'orig self, -// registry: &'reg mut Registry<'orig, 'parse>, -// ) -> BoxFuture<'inp, Result> { -// async move { -// match self { -// organic::types::DocumentElement::Heading(inner) => { -// Ok(IAstNode::Heading(IHeading::new(registry, inner).await?)) -// } -// organic::types::DocumentElement::Section(inner) => { -// Ok(IAstNode::Section(ISection::new(registry, inner).await?)) -// } -// } -// } -// .boxed() -// } -// } +impl<'parse> IntoIAstNode<'parse> for organic::types::DocumentElement<'parse> { + fn into_ast_node<'orig>( + &'orig self, + registry: RefRegistry<'orig, 'parse>, + ) -> BoxFuture<'orig, Result> { + async move { + match self { + organic::types::DocumentElement::Heading(inner) => { + Ok(IAstNode::Heading(IHeading::new(registry, inner).await?)) + } + organic::types::DocumentElement::Section(inner) => { + Ok(IAstNode::Section(ISection::new(registry, inner).await?)) + } + } + } + .boxed() + } +} -// impl<'parse> IntoIAstNode<'parse> for organic::types::Element<'parse> { -// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( -// &'orig self, -// registry: &'reg mut Registry<'orig, 'parse>, -// ) -> BoxFuture<'inp, Result> { -// async move { -// match self { -// organic::types::Element::Paragraph(inner) => { -// Ok(IAstNode::Paragraph(IParagraph::new(registry, inner).await?)) -// } -// organic::types::Element::PlainList(inner) => { -// Ok(IAstNode::PlainList(IPlainList::new(registry, inner).await?)) -// } -// organic::types::Element::CenterBlock(inner) => Ok(IAstNode::CenterBlock( -// ICenterBlock::new(registry, inner).await?, -// )), -// organic::types::Element::QuoteBlock(inner) => Ok(IAstNode::QuoteBlock( -// IQuoteBlock::new(registry, inner).await?, -// )), -// organic::types::Element::SpecialBlock(inner) => Ok(IAstNode::SpecialBlock( -// ISpecialBlock::new(registry, inner).await?, -// )), -// organic::types::Element::DynamicBlock(inner) => Ok(IAstNode::DynamicBlock( -// IDynamicBlock::new(registry, inner).await?, -// )), -// organic::types::Element::FootnoteDefinition(inner) => Ok( -// IAstNode::FootnoteDefinition(IFootnoteDefinition::new(registry, inner).await?), -// ), -// organic::types::Element::Comment(inner) => { -// Ok(IAstNode::Comment(IComment::new(registry, inner).await?)) -// } -// organic::types::Element::Drawer(inner) => { -// Ok(IAstNode::Drawer(IDrawer::new(registry, inner).await?)) -// } -// organic::types::Element::PropertyDrawer(inner) => Ok(IAstNode::PropertyDrawer( -// IPropertyDrawer::new(registry, inner).await?, -// )), -// organic::types::Element::Table(inner) => { -// Ok(IAstNode::Table(ITable::new(registry, inner).await?)) -// } -// organic::types::Element::VerseBlock(inner) => Ok(IAstNode::VerseBlock( -// IVerseBlock::new(registry, inner).await?, -// )), -// organic::types::Element::CommentBlock(inner) => Ok(IAstNode::CommentBlock( -// ICommentBlock::new(registry, inner).await?, -// )), -// organic::types::Element::ExampleBlock(inner) => Ok(IAstNode::ExampleBlock( -// IExampleBlock::new(registry, inner).await?, -// )), -// organic::types::Element::ExportBlock(inner) => Ok(IAstNode::ExportBlock( -// IExportBlock::new(registry, inner).await?, -// )), -// organic::types::Element::SrcBlock(inner) => { -// Ok(IAstNode::SrcBlock(ISrcBlock::new(registry, inner).await?)) -// } -// organic::types::Element::Clock(inner) => { -// Ok(IAstNode::Clock(IClock::new(registry, inner).await?)) -// } -// organic::types::Element::DiarySexp(inner) => { -// Ok(IAstNode::DiarySexp(IDiarySexp::new(registry, inner).await?)) -// } -// organic::types::Element::Planning(inner) => { -// Ok(IAstNode::Planning(IPlanning::new(registry, inner).await?)) -// } -// organic::types::Element::FixedWidthArea(inner) => Ok(IAstNode::FixedWidthArea( -// IFixedWidthArea::new(registry, inner).await?, -// )), -// organic::types::Element::HorizontalRule(inner) => Ok(IAstNode::HorizontalRule( -// IHorizontalRule::new(registry, inner).await?, -// )), -// organic::types::Element::Keyword(inner) => { -// Ok(IAstNode::Keyword(IKeyword::new(registry, inner).await?)) -// } -// organic::types::Element::BabelCall(inner) => { -// Ok(IAstNode::BabelCall(IBabelCall::new(registry, inner).await?)) -// } -// organic::types::Element::LatexEnvironment(inner) => Ok(IAstNode::LatexEnvironment( -// ILatexEnvironment::new(registry, inner).await?, -// )), -// } -// } -// .boxed() -// } -// } +impl<'parse> IntoIAstNode<'parse> for organic::types::Element<'parse> { + fn into_ast_node<'orig>( + &'orig self, + registry: RefRegistry<'orig, 'parse>, + ) -> BoxFuture<'orig, Result> { + async move { + match self { + organic::types::Element::Paragraph(inner) => { + Ok(IAstNode::Paragraph(IParagraph::new(registry, inner).await?)) + } + organic::types::Element::PlainList(inner) => { + Ok(IAstNode::PlainList(IPlainList::new(registry, inner).await?)) + } + organic::types::Element::CenterBlock(inner) => Ok(IAstNode::CenterBlock( + ICenterBlock::new(registry, inner).await?, + )), + organic::types::Element::QuoteBlock(inner) => Ok(IAstNode::QuoteBlock( + IQuoteBlock::new(registry, inner).await?, + )), + organic::types::Element::SpecialBlock(inner) => Ok(IAstNode::SpecialBlock( + ISpecialBlock::new(registry, inner).await?, + )), + organic::types::Element::DynamicBlock(inner) => Ok(IAstNode::DynamicBlock( + IDynamicBlock::new(registry, inner).await?, + )), + organic::types::Element::FootnoteDefinition(inner) => Ok( + IAstNode::FootnoteDefinition(IFootnoteDefinition::new(registry, inner).await?), + ), + organic::types::Element::Comment(inner) => { + Ok(IAstNode::Comment(IComment::new(registry, inner).await?)) + } + organic::types::Element::Drawer(inner) => { + Ok(IAstNode::Drawer(IDrawer::new(registry, inner).await?)) + } + organic::types::Element::PropertyDrawer(inner) => Ok(IAstNode::PropertyDrawer( + IPropertyDrawer::new(registry, inner).await?, + )), + organic::types::Element::Table(inner) => { + Ok(IAstNode::Table(ITable::new(registry, inner).await?)) + } + organic::types::Element::VerseBlock(inner) => Ok(IAstNode::VerseBlock( + IVerseBlock::new(registry, inner).await?, + )), + organic::types::Element::CommentBlock(inner) => Ok(IAstNode::CommentBlock( + ICommentBlock::new(registry, inner).await?, + )), + organic::types::Element::ExampleBlock(inner) => Ok(IAstNode::ExampleBlock( + IExampleBlock::new(registry, inner).await?, + )), + organic::types::Element::ExportBlock(inner) => Ok(IAstNode::ExportBlock( + IExportBlock::new(registry, inner).await?, + )), + organic::types::Element::SrcBlock(inner) => { + Ok(IAstNode::SrcBlock(ISrcBlock::new(registry, inner).await?)) + } + organic::types::Element::Clock(inner) => { + Ok(IAstNode::Clock(IClock::new(registry, inner).await?)) + } + organic::types::Element::DiarySexp(inner) => { + Ok(IAstNode::DiarySexp(IDiarySexp::new(registry, inner).await?)) + } + organic::types::Element::Planning(inner) => { + Ok(IAstNode::Planning(IPlanning::new(registry, inner).await?)) + } + organic::types::Element::FixedWidthArea(inner) => Ok(IAstNode::FixedWidthArea( + IFixedWidthArea::new(registry, inner).await?, + )), + organic::types::Element::HorizontalRule(inner) => Ok(IAstNode::HorizontalRule( + IHorizontalRule::new(registry, inner).await?, + )), + organic::types::Element::Keyword(inner) => { + Ok(IAstNode::Keyword(IKeyword::new(registry, inner).await?)) + } + organic::types::Element::BabelCall(inner) => { + Ok(IAstNode::BabelCall(IBabelCall::new(registry, inner).await?)) + } + organic::types::Element::LatexEnvironment(inner) => Ok(IAstNode::LatexEnvironment( + ILatexEnvironment::new(registry, inner).await?, + )), + } + } + .boxed() + } +} -// impl<'parse> IntoIAstNode<'parse> for organic::types::Object<'parse> { -// fn into_ast_node<'reg, 'orig, 'inp: 'reg + 'orig + 'parse>( -// &'orig self, -// registry: &'reg mut Registry<'orig, 'parse>, -// ) -> BoxFuture<'inp, Result> { -// async move { -// match self { -// organic::types::Object::Bold(inner) => { -// Ok(IAstNode::Bold(IBold::new(registry, inner).await?)) -// } -// organic::types::Object::Italic(inner) => { -// Ok(IAstNode::Italic(IItalic::new(registry, inner).await?)) -// } -// organic::types::Object::Underline(inner) => { -// Ok(IAstNode::Underline(IUnderline::new(registry, inner).await?)) -// } -// organic::types::Object::StrikeThrough(inner) => Ok(IAstNode::StrikeThrough( -// IStrikeThrough::new(registry, inner).await?, -// )), -// organic::types::Object::Code(inner) => { -// Ok(IAstNode::Code(ICode::new(registry, inner).await?)) -// } -// organic::types::Object::Verbatim(inner) => { -// Ok(IAstNode::Verbatim(IVerbatim::new(registry, inner).await?)) -// } -// organic::types::Object::PlainText(inner) => { -// Ok(IAstNode::PlainText(IPlainText::new(registry, inner).await?)) -// } -// organic::types::Object::RegularLink(inner) => Ok(IAstNode::RegularLink( -// IRegularLink::new(registry, inner).await?, -// )), -// organic::types::Object::RadioLink(inner) => { -// Ok(IAstNode::RadioLink(IRadioLink::new(registry, inner).await?)) -// } -// organic::types::Object::RadioTarget(inner) => Ok(IAstNode::RadioTarget( -// IRadioTarget::new(registry, inner).await?, -// )), -// organic::types::Object::PlainLink(inner) => { -// Ok(IAstNode::PlainLink(IPlainLink::new(registry, inner).await?)) -// } -// organic::types::Object::AngleLink(inner) => { -// Ok(IAstNode::AngleLink(IAngleLink::new(registry, inner).await?)) -// } -// organic::types::Object::OrgMacro(inner) => { -// Ok(IAstNode::OrgMacro(IOrgMacro::new(registry, inner).await?)) -// } -// organic::types::Object::Entity(inner) => { -// Ok(IAstNode::Entity(IEntity::new(registry, inner).await?)) -// } -// organic::types::Object::LatexFragment(inner) => Ok(IAstNode::LatexFragment( -// ILatexFragment::new(registry, inner).await?, -// )), -// organic::types::Object::ExportSnippet(inner) => Ok(IAstNode::ExportSnippet( -// IExportSnippet::new(registry, inner).await?, -// )), -// organic::types::Object::FootnoteReference(inner) => Ok( -// IAstNode::FootnoteReference(IFootnoteReference::new(registry, inner).await?), -// ), -// organic::types::Object::Citation(inner) => { -// Ok(IAstNode::Citation(ICitation::new(registry, inner).await?)) -// } -// organic::types::Object::CitationReference(inner) => Ok( -// IAstNode::CitationReference(ICitationReference::new(registry, inner).await?), -// ), -// organic::types::Object::InlineBabelCall(inner) => Ok(IAstNode::InlineBabelCall( -// IInlineBabelCall::new(registry, inner).await?, -// )), -// organic::types::Object::InlineSourceBlock(inner) => Ok( -// IAstNode::InlineSourceBlock(IInlineSourceBlock::new(registry, inner).await?), -// ), -// organic::types::Object::LineBreak(inner) => { -// Ok(IAstNode::LineBreak(ILineBreak::new(registry, inner).await?)) -// } -// organic::types::Object::Target(inner) => { -// Ok(IAstNode::Target(ITarget::new(registry, inner).await?)) -// } -// organic::types::Object::StatisticsCookie(inner) => Ok(IAstNode::StatisticsCookie( -// IStatisticsCookie::new(registry, inner).await?, -// )), -// organic::types::Object::Subscript(inner) => { -// Ok(IAstNode::Subscript(ISubscript::new(registry, inner).await?)) -// } -// organic::types::Object::Superscript(inner) => Ok(IAstNode::Superscript( -// ISuperscript::new(registry, inner).await?, -// )), -// organic::types::Object::Timestamp(inner) => { -// Ok(IAstNode::Timestamp(ITimestamp::new(registry, inner).await?)) -// } -// } -// } -// .boxed() -// } -// } +impl<'parse> IntoIAstNode<'parse> for organic::types::Object<'parse> { + fn into_ast_node<'orig>( + &'orig self, + registry: RefRegistry<'orig, 'parse>, + ) -> BoxFuture<'orig, Result> { + async move { + match self { + organic::types::Object::Bold(inner) => { + Ok(IAstNode::Bold(IBold::new(registry, inner).await?)) + } + organic::types::Object::Italic(inner) => { + Ok(IAstNode::Italic(IItalic::new(registry, inner).await?)) + } + organic::types::Object::Underline(inner) => { + Ok(IAstNode::Underline(IUnderline::new(registry, inner).await?)) + } + organic::types::Object::StrikeThrough(inner) => Ok(IAstNode::StrikeThrough( + IStrikeThrough::new(registry, inner).await?, + )), + organic::types::Object::Code(inner) => { + Ok(IAstNode::Code(ICode::new(registry, inner).await?)) + } + organic::types::Object::Verbatim(inner) => { + Ok(IAstNode::Verbatim(IVerbatim::new(registry, inner).await?)) + } + organic::types::Object::PlainText(inner) => { + Ok(IAstNode::PlainText(IPlainText::new(registry, inner).await?)) + } + organic::types::Object::RegularLink(inner) => Ok(IAstNode::RegularLink( + IRegularLink::new(registry, inner).await?, + )), + organic::types::Object::RadioLink(inner) => { + Ok(IAstNode::RadioLink(IRadioLink::new(registry, inner).await?)) + } + organic::types::Object::RadioTarget(inner) => Ok(IAstNode::RadioTarget( + IRadioTarget::new(registry, inner).await?, + )), + organic::types::Object::PlainLink(inner) => { + Ok(IAstNode::PlainLink(IPlainLink::new(registry, inner).await?)) + } + organic::types::Object::AngleLink(inner) => { + Ok(IAstNode::AngleLink(IAngleLink::new(registry, inner).await?)) + } + organic::types::Object::OrgMacro(inner) => { + Ok(IAstNode::OrgMacro(IOrgMacro::new(registry, inner).await?)) + } + organic::types::Object::Entity(inner) => { + Ok(IAstNode::Entity(IEntity::new(registry, inner).await?)) + } + organic::types::Object::LatexFragment(inner) => Ok(IAstNode::LatexFragment( + ILatexFragment::new(registry, inner).await?, + )), + organic::types::Object::ExportSnippet(inner) => Ok(IAstNode::ExportSnippet( + IExportSnippet::new(registry, inner).await?, + )), + organic::types::Object::FootnoteReference(inner) => Ok( + IAstNode::FootnoteReference(IFootnoteReference::new(registry, inner).await?), + ), + organic::types::Object::Citation(inner) => { + Ok(IAstNode::Citation(ICitation::new(registry, inner).await?)) + } + organic::types::Object::CitationReference(inner) => Ok( + IAstNode::CitationReference(ICitationReference::new(registry, inner).await?), + ), + organic::types::Object::InlineBabelCall(inner) => Ok(IAstNode::InlineBabelCall( + IInlineBabelCall::new(registry, inner).await?, + )), + organic::types::Object::InlineSourceBlock(inner) => Ok( + IAstNode::InlineSourceBlock(IInlineSourceBlock::new(registry, inner).await?), + ), + organic::types::Object::LineBreak(inner) => { + Ok(IAstNode::LineBreak(ILineBreak::new(registry, inner).await?)) + } + organic::types::Object::Target(inner) => { + Ok(IAstNode::Target(ITarget::new(registry, inner).await?)) + } + organic::types::Object::StatisticsCookie(inner) => Ok(IAstNode::StatisticsCookie( + IStatisticsCookie::new(registry, inner).await?, + )), + organic::types::Object::Subscript(inner) => { + Ok(IAstNode::Subscript(ISubscript::new(registry, inner).await?)) + } + organic::types::Object::Superscript(inner) => Ok(IAstNode::Superscript( + ISuperscript::new(registry, inner).await?, + )), + organic::types::Object::Timestamp(inner) => { + Ok(IAstNode::Timestamp(ITimestamp::new(registry, inner).await?)) + } + } + } + .boxed() + } +} diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 5890e68..7b8f466 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -9,6 +9,7 @@ use organic::types::Element; use organic::types::Object; use super::ast_node::IAstNode; +use super::ast_node::IntoIAstNode; use super::RefRegistry; type IdCounter = u16; @@ -117,8 +118,7 @@ async fn convert_reference_contents<'orig, 'parse>( let contents = { let mut ret = Vec::new(); for obj in contents.iter() { - // TODO - // ret.push(obj.into_ast_node(registry).await?); + ret.push(obj.into_ast_node(registry.clone()).await?); } ret }; @@ -133,8 +133,7 @@ async fn convert_definition_contents<'orig, 'parse>( let contents = { let mut ret = Vec::new(); for obj in contents.iter() { - // TODO - // ret.push(obj.into_ast_node(registry).await?); + ret.push(obj.into_ast_node(registry.clone()).await?); } ret }; From 2e7cfd5637f7e3959e344dee6f0f87384107b1b2 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 21:44:15 -0400 Subject: [PATCH 19/24] Only parse footnote definitions if they target a reference that exists. --- src/intermediate/registry.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 7b8f466..b34d88b 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -99,6 +99,16 @@ pub(crate) async fn register_footnote_definition<'orig, 'parse>( label: &'parse str, definition: &'orig Vec>, ) -> Result<(), CustomError> { + let has_existing: bool = { + let mut registry = registry.lock().unwrap(); + registry + .footnote_ids + .iter_mut() + .any(|(id, _definition)| *id == Some(label)) + }; + if !has_existing { + return Ok(()); + } let contents = convert_definition_contents(registry.clone(), definition).await?; let mut registry = registry.lock().unwrap(); if let Some((_existing_id, existing_definition)) = registry From 0f7e5eea25098df7b94327f91ba0c4f51124a506 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 21:45:36 -0400 Subject: [PATCH 20/24] no-op the template for footnote definitions. --- default_environment/templates/html/footnote_definition.dust | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default_environment/templates/html/footnote_definition.dust b/default_environment/templates/html/footnote_definition.dust index 037c32c..9cf5738 100644 --- a/default_environment/templates/html/footnote_definition.dust +++ b/default_environment/templates/html/footnote_definition.dust @@ -1 +1 @@ -!!!!!!!! footnote_definition +{! noop !} From 613d49c6ec1e592e3509546a8f630c046103a8dc Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 21:50:51 -0400 Subject: [PATCH 21/24] Record on-deck footnote definitions. --- src/intermediate/registry.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index b34d88b..05dac3a 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -1,12 +1,7 @@ -use std::collections::HashMap; -use std::marker::PhantomData; -use std::sync::Arc; -use std::sync::Mutex; - -// use super::ast_node::IntoIAstNode; use crate::error::CustomError; use organic::types::Element; use organic::types::Object; +use std::collections::HashMap; use super::ast_node::IAstNode; use super::ast_node::IntoIAstNode; @@ -18,7 +13,7 @@ pub(crate) struct Registry<'orig, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, footnote_ids: Vec<(Option<&'parse str>, Vec)>, - _phantom: PhantomData<&'orig ()>, + on_deck_footnote_ids: HashMap<&'parse str, &'orig Vec>>, } impl<'orig, 'parse> Registry<'orig, 'parse> { @@ -27,7 +22,7 @@ impl<'orig, 'parse> Registry<'orig, 'parse> { id_counter: 0, targets: HashMap::new(), footnote_ids: Vec::new(), - _phantom: PhantomData, + on_deck_footnote_ids: HashMap::new(), } } @@ -107,6 +102,8 @@ pub(crate) async fn register_footnote_definition<'orig, 'parse>( .any(|(id, _definition)| *id == Some(label)) }; if !has_existing { + let mut registry = registry.lock().unwrap(); + registry.on_deck_footnote_ids.insert(label, definition); return Ok(()); } let contents = convert_definition_contents(registry.clone(), definition).await?; From 0ae492f8d3de54026df704bbe006d12aff650f98 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 22:01:42 -0400 Subject: [PATCH 22/24] Promote waiting footnote definitions. --- src/intermediate/registry.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 05dac3a..a835283 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -60,6 +60,10 @@ pub(crate) async fn get_footnote_reference_id<'orig, 'parse>( return Ok(pos); } + if let Some(label) = label { + promote_footnote_definition(registry.clone(), label).await?; + } + let existing_index = registry .lock() .unwrap() @@ -147,3 +151,21 @@ async fn convert_definition_contents<'orig, 'parse>( Ok(contents) } + +/// Take a footnote definition that has not yet received a reference and move it into the active footnotes. +pub(crate) async fn promote_footnote_definition<'orig, 'parse>( + registry: RefRegistry<'orig, 'parse>, + label: &'parse str, +) -> Result<(), CustomError> { + let definition = { + let mut registry = registry.lock().unwrap(); + let definition = registry.on_deck_footnote_ids.remove(label); + definition + }; + if let Some(elements) = definition { + let contents = convert_definition_contents(registry.clone(), elements).await?; + let mut registry = registry.lock().unwrap(); + registry.footnote_ids.push((Some(label), contents)); + } + Ok(()) +} From ff031400076098c09599061737e0309da369ccfd Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 22:11:24 -0400 Subject: [PATCH 23/24] Order the footnotes based on when they start processing rather than when they finish. This has the benefit of making the output order make sense when footnote definitions reference footnote references but I mostly did it to match the behavior of upstream org-mode. --- src/intermediate/registry.rs | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index a835283..9631268 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -82,13 +82,21 @@ pub(crate) async fn get_footnote_reference_id<'orig, 'parse>( } Ok(existing_id) } else { - let contents = convert_reference_contents(registry.clone(), definition).await?; - let pos = { + let existing_id = { let mut registry = registry.lock().unwrap(); - registry.footnote_ids.push((label, contents)); + registry.footnote_ids.push((label, Vec::new())); registry.footnote_ids.len() - 1 }; - Ok(pos) + let contents = convert_reference_contents(registry.clone(), definition).await?; + { + let mut registry = registry.lock().unwrap(); + let entry = registry + .footnote_ids + .get_mut(existing_id) + .expect("If-statement proves this to be Some."); + entry.1 = contents; + } + Ok(existing_id) } } @@ -163,9 +171,20 @@ pub(crate) async fn promote_footnote_definition<'orig, 'parse>( definition }; if let Some(elements) = definition { + let existing_id = { + let mut registry = registry.lock().unwrap(); + registry.footnote_ids.push((Some(label), Vec::new())); + registry.footnote_ids.len() - 1 + }; let contents = convert_definition_contents(registry.clone(), elements).await?; - let mut registry = registry.lock().unwrap(); - registry.footnote_ids.push((Some(label), contents)); + { + let mut registry = registry.lock().unwrap(); + let entry = registry + .footnote_ids + .get_mut(existing_id) + .expect("If-statement proves this to be Some."); + entry.1 = contents; + } } Ok(()) } From 0da37b25e313d2f2ce20107f3381884f90ed7866 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 29 Oct 2023 22:27:47 -0400 Subject: [PATCH 24/24] Assign the reference counts. --- src/intermediate/footnote_reference.rs | 6 +++--- src/intermediate/registry.rs | 23 +++++++++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/intermediate/footnote_reference.rs b/src/intermediate/footnote_reference.rs index c63966b..aa473d2 100644 --- a/src/intermediate/footnote_reference.rs +++ b/src/intermediate/footnote_reference.rs @@ -10,11 +10,11 @@ pub(crate) struct IFootnoteReference { } intermediate!(IFootnoteReference, FootnoteReference, original, registry, { - let footnote_id = + let (footnote_id, reference_count) = get_footnote_reference_id(registry, original.label, &original.definition).await?; Ok(IFootnoteReference { footnote_id, - duplicate_offset: 0, // TODO + duplicate_offset: reference_count, }) }); @@ -31,7 +31,7 @@ impl IFootnoteReference { format!("fnr.{}", self.get_display_label()) } else { // Org-mode makes all duplicates use "100" but I figure there is no harm in giving each a unique ID. - let append = 100 + self.duplicate_offset; + let append = 100 + self.duplicate_offset - 1; format!("fnr.{}.{}", self.get_display_label(), append) } } diff --git a/src/intermediate/registry.rs b/src/intermediate/registry.rs index 9631268..3ae276e 100644 --- a/src/intermediate/registry.rs +++ b/src/intermediate/registry.rs @@ -13,6 +13,7 @@ pub(crate) struct Registry<'orig, 'parse> { id_counter: IdCounter, targets: HashMap<&'parse str, String>, footnote_ids: Vec<(Option<&'parse str>, Vec)>, + footnote_reference_counts: HashMap<&'parse str, usize>, on_deck_footnote_ids: HashMap<&'parse str, &'orig Vec>>, } @@ -22,6 +23,7 @@ impl<'orig, 'parse> Registry<'orig, 'parse> { id_counter: 0, targets: HashMap::new(), footnote_ids: Vec::new(), + footnote_reference_counts: HashMap::new(), on_deck_footnote_ids: HashMap::new(), } } @@ -48,7 +50,7 @@ pub(crate) async fn get_footnote_reference_id<'orig, 'parse>( registry: RefRegistry<'orig, 'parse>, label: Option<&'parse str>, definition: &'orig Vec>, -) -> Result { +) -> Result<(usize, usize), CustomError> { if let None = label { // If it has no label then it must always get a new ID. let contents = convert_reference_contents(registry.clone(), definition).await?; @@ -57,12 +59,21 @@ pub(crate) async fn get_footnote_reference_id<'orig, 'parse>( registry.footnote_ids.push((None, contents)); registry.footnote_ids.len() - 1 }; - return Ok(pos); + return Ok((pos, 0)); } - if let Some(label) = label { + let reference_count = if let Some(label) = label { promote_footnote_definition(registry.clone(), label).await?; - } + let mut registry = registry.lock().unwrap(); + let reference_count = registry + .footnote_reference_counts + .entry(label) + .and_modify(|count| *count += 1) + .or_insert(0); + *reference_count + } else { + 0 + }; let existing_index = registry .lock() @@ -80,7 +91,7 @@ pub(crate) async fn get_footnote_reference_id<'orig, 'parse>( .expect("If-statement proves this to be Some."); entry.1 = contents; } - Ok(existing_id) + Ok((existing_id, reference_count)) } else { let existing_id = { let mut registry = registry.lock().unwrap(); @@ -96,7 +107,7 @@ pub(crate) async fn get_footnote_reference_id<'orig, 'parse>( .expect("If-statement proves this to be Some."); entry.1 = contents; } - Ok(existing_id) + Ok((existing_id, reference_count)) } }