From e0d2bb8213ac1b5f89f0d7b7635ef5cb06a7d6ad Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 21 Jul 2023 22:29:04 -0400 Subject: [PATCH] Create structure for inline source blocks. --- src/compare/diff.rs | 25 +++++++++++++++++++++++++ src/parser/inline_source_block.rs | 13 +++++++++++++ src/parser/mod.rs | 2 ++ src/parser/object.rs | 13 +++++++++++++ src/parser/object_parser.rs | 17 +++++++++++++++-- src/parser/token.rs | 1 + 6 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/parser/inline_source_block.rs diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 3502130..ab90531 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -26,6 +26,7 @@ use crate::parser::GreaterBlock; use crate::parser::Heading; use crate::parser::HorizontalRule; use crate::parser::InlineBabelCall; +use crate::parser::InlineSourceBlock; use crate::parser::Italic; use crate::parser::Keyword; use crate::parser::LatexEnvironment; @@ -168,6 +169,7 @@ fn compare_object<'s>( Object::Citation(obj) => compare_citation(source, emacs, obj), Object::CitationReference(obj) => compare_citation_reference(source, emacs, obj), Object::InlineBabelCall(obj) => compare_inline_babel_call(source, emacs, obj), + Object::InlineSourceBlock(obj) => compare_inline_source_block(source, emacs, obj), } } @@ -1413,3 +1415,26 @@ fn compare_inline_babel_call<'s>( children: Vec::new(), }) } + +fn compare_inline_source_block<'s>( + source: &'s str, + emacs: &'s Token<'s>, + rust: &'s InlineSourceBlock<'s>, +) -> Result> { + let mut this_status = DiffStatus::Good; + let emacs_name = "inline-source-block"; + if assert_name(emacs, emacs_name).is_err() { + this_status = DiffStatus::Bad; + } + + if assert_bounds(source, emacs, rust).is_err() { + this_status = DiffStatus::Bad; + } + + Ok(DiffResult { + status: this_status, + name: emacs_name.to_owned(), + message: None, + children: Vec::new(), + }) +} diff --git a/src/parser/inline_source_block.rs b/src/parser/inline_source_block.rs new file mode 100644 index 0000000..56224d4 --- /dev/null +++ b/src/parser/inline_source_block.rs @@ -0,0 +1,13 @@ +use super::Context; +use crate::error::Res; +use crate::parser::util::not_yet_implemented; +use crate::parser::InlineSourceBlock; + +#[tracing::instrument(ret, level = "debug")] +pub fn inline_source_block<'r, 's>( + context: Context<'r, 's>, + input: &'s str, +) -> Res<&'s str, InlineSourceBlock<'s>> { + not_yet_implemented()?; + todo!() +} diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ef727c3..d1f911e 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -19,6 +19,7 @@ mod greater_block; mod greater_element; mod horizontal_rule; mod inline_babel_call; +mod inline_source_block; mod keyword; mod latex_environment; mod latex_fragment; @@ -83,6 +84,7 @@ pub use object::Entity; pub use object::ExportSnippet; pub use object::FootnoteReference; pub use object::InlineBabelCall; +pub use object::InlineSourceBlock; pub use object::Italic; pub use object::LatexFragment; pub use object::Object; diff --git a/src/parser/object.rs b/src/parser/object.rs index 2deb233..0e2c69d 100644 --- a/src/parser/object.rs +++ b/src/parser/object.rs @@ -22,6 +22,7 @@ pub enum Object<'s> { Citation(Citation<'s>), CitationReference(CitationReference<'s>), InlineBabelCall(InlineBabelCall<'s>), + InlineSourceBlock(InlineSourceBlock<'s>), } #[derive(Debug, PartialEq)] @@ -143,6 +144,11 @@ pub struct InlineBabelCall<'s> { pub source: &'s str, } +#[derive(Debug, PartialEq)] +pub struct InlineSourceBlock<'s> { + pub source: &'s str, +} + impl<'s> Source<'s> for Object<'s> { fn get_source(&'s self) -> &'s str { match self { @@ -166,6 +172,7 @@ impl<'s> Source<'s> for Object<'s> { Object::Citation(obj) => obj.source, Object::CitationReference(obj) => obj.source, Object::InlineBabelCall(obj) => obj.source, + Object::InlineSourceBlock(obj) => obj.source, } } } @@ -283,3 +290,9 @@ impl<'s> Source<'s> for InlineBabelCall<'s> { self.source } } + +impl<'s> Source<'s> for InlineSourceBlock<'s> { + fn get_source(&'s self) -> &'s str { + self.source + } +} diff --git a/src/parser/object_parser.rs b/src/parser/object_parser.rs index 0d0b5b5..c27b644 100644 --- a/src/parser/object_parser.rs +++ b/src/parser/object_parser.rs @@ -13,6 +13,7 @@ use crate::parser::entity::entity; use crate::parser::export_snippet::export_snippet; use crate::parser::footnote_reference::footnote_reference; use crate::parser::inline_babel_call::inline_babel_call; +use crate::parser::inline_source_block::inline_source_block; use crate::parser::latex_fragment::latex_fragment; use crate::parser::object::Object; use crate::parser::org_macro::org_macro; @@ -26,10 +27,14 @@ pub fn standard_set_object<'r, 's>( context: Context<'r, 's>, input: &'s str, ) -> Res<&'s str, Object<'s>> { - // TODO: inline source blocks, line breaks, targets (different from radio targets), statistics cookies, subscript and superscript, timestamps. + // TODO: line breaks, targets (different from radio targets), statistics cookies, subscript and superscript, timestamps. not(|i| context.check_exit_matcher(i))(input)?; alt(( + map( + parser_with_context!(inline_source_block)(context), + Object::InlineSourceBlock, + ), map( parser_with_context!(inline_babel_call)(context), Object::InlineBabelCall, @@ -91,6 +96,10 @@ pub fn any_object_except_plain_text<'r, 's>( ) -> Res<&'s str, Object<'s>> { // Used for exit matchers so this does not check exit matcher condition. alt(( + map( + parser_with_context!(inline_source_block)(context), + Object::InlineSourceBlock, + ), map( parser_with_context!(inline_babel_call)(context), Object::InlineBabelCall, @@ -130,8 +139,12 @@ pub fn regular_link_description_object_set<'r, 's>( context: Context<'r, 's>, input: &'s str, ) -> Res<&'s str, Object<'s>> { - // TODO: minimal set of objects as well as export snippets, inline source blocks, and statistics cookies. It can also contain another link, but only when it is a plain or angle link. It can contain square brackets, but not ]] + // TODO: minimal set of objects as well as export snippets, and statistics cookies. It can also contain another link, but only when it is a plain or angle link. It can contain square brackets, but not ]] alt(( + map( + parser_with_context!(inline_source_block)(context), + Object::InlineSourceBlock, + ), map( parser_with_context!(inline_babel_call)(context), Object::InlineBabelCall, diff --git a/src/parser/token.rs b/src/parser/token.rs index 2741716..eb2c374 100644 --- a/src/parser/token.rs +++ b/src/parser/token.rs @@ -61,6 +61,7 @@ impl<'r, 's> Token<'r, 's> { Object::Citation(_) => Box::new(std::iter::empty()), // TODO: Iterate over children Object::CitationReference(_) => Box::new(std::iter::empty()), // TODO: Iterate over children Object::InlineBabelCall(_) => Box::new(std::iter::empty()), + Object::InlineSourceBlock(_) => Box::new(std::iter::empty()), }, Token::Element(elem) => match elem { Element::Paragraph(inner) => Box::new(inner.children.iter().map(Token::Object)),